2021-08-11

本文详细介绍了JavaWeb中的Cookie和Session技术,用于管理用户会话。Cookie是一种客户端技术,保存在本地,用于识别用户;Session是服务器端技术,保存用户信息于服务器。讨论了Cookie的创建、有效期设置、乱码问题以及限制。Session则提供了保存用户登录状态和购物车信息等功能。此外,文章还提及了JSP的基础知识,包括JSP的三种语法形式和指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaWeb

Cookie、Session

会话

  • 用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之有状态会话:就是记录了你的一些东西。

一个网站,怎么证明你来过?

客户端 服务端

  1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;这个信件就i是:cookie
  2. 服务器登记你来过了,下次你来的时候我来匹配你;session

保存会话的两种技术

cookie

  • 一种客户端技术

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在Session中

常见应用:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!

Cookie

在这里插入图片描述

  1. 从请求中拿到Cookie信息
  2. 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//从请求中拿到Cookie
cookie.getName();//获得cookie中的key
cookie.getValue();//获得cookie中的value
cookie = new Cookie("login",System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期,这里为一天
resp.addCookie(cookie);//响应给客户端一个cookie

cookie:一般会保存再本地的用户目录下

乱码问题

这里我遇到了浏览器出现乱码的问题:虽然我在Java代码中加入了

 req.setCharacterEncoding("utf-8");
 resp.setCharacterEncoding("utf-8");

这两句还是在页面中出现了乱码,查询原因后得知:

  1. 如果不加上面这两句话,说明servlet不是用utf-8来转码的,而是用默认的ISO8859来转码的,此时浏览器会报????这种乱码。所以要先加上上面这两句。

  2. 只加上上面这两句还不行,运行时又会报 ”鎾掑湴鏂“ 这种乱码,这是因为浏览器的解析方式没有设置为utf-8,因此还要再加上一句:

    resp.setContentType("text/html");//本机上这样写也可以
    or
    resp.setContentType("text/html;charset=UTF-8");//一般是这样写
    //设置请求以及响应的内容类型以及编码方式
    

    这是从 Servlet 这边响应的内容类型来设置,响应出去的内容的编码方式,

    **也可以不用上面这句话,甚至最上面的两句话都不用,**而是直接来从浏览器这边来设置浏览器的解析方式为utf-8:

    //设置消息头
    resp.setHeader("Content-type", "text/html;charset=UTF-8"); 
    

    两种方式本质上是从不同的方面来设置编码的,第一种是从程序输出的内容这边,另一种是从浏览器的解析方式这边

    参考:https://blog.youkuaiyun.com/TLMS_/article/details/78749980

一个网站cookie是否存在上限!聊聊细节问题

  • 一个Cookie只能保存一个信息;
  • 一个web站点可以给浏览器发送多个cookie,每个站点最多存放20个cookie
  • 而且cookie的大小也有限制4kb
  • 300个cookie是浏览器的上限

删除Cookie:

  • 不设置有效期,关闭浏览器,自动失效;
  • 设置有效期的时间为0,那么它就存活时间为0秒;

Cookie的中文编码解码:

 //为了防止中文出现乱码,这里用URLEncoder.encode("烽子","utf-8")编码
Cookie cookie = new Cookie("name", URLEncoder.encode("烽子","utf-8"));
//解码
out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));

不加编码解码的话cookie.getValue()得到的值就是:%E7%83%BD%E5%AD%90 乱码;

但Cookie这个类现在开发中一般用不到了,但是会用的Session这个类。

Session(重点)

在这里插入图片描述

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象;
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
  • 用户登录之后,整个网站它都可以访问!–>保存用户信息;保存购物车的信息…

Session和cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
  • Session把用户的数据写到用户独占的Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务器创建;

Session:服务器返回的一个唯一的SessionID,用户可以通过这个id拿到服务器中的Session存储的信息,。

Cookie:服务器返回的就是Cookie里面携带的信息。

使用场景:

  • 保存一个登录信息;
  • 购物车信息;
  • 在整个网站中经常会使用的数据,我们将他保存在Session中;

使用Session:

package com.feng.servlet;

import com.feng.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获得一个Session
        HttpSession session = req.getSession();
        //给Session中放东西
        session.setAttribute("person",new Person("烽子",20));
        //获取Session
        String id = session.getId();
        //判断Session是不是新创建的
        if (session.isNew()){
            resp.getWriter().write("session创建成功,ID为"+id);
        }else {
            resp.getWriter().write("session已在服务器中存在了,ID为"+id);
        }

        //Session创建的时候做了什么事情
        //Cookie cookie = new Cookie("JSESSIONID","sessionid");
        //resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获得一个Session
        HttpSession session = req.getSession();
        //获得person中的内容
        Person person = (Person) session.getAttribute("person");
        System.out.println(person);
    }
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("person");
        //手动注销Session,效果跟关闭浏览器一样
        session.invalidate();
    }

会话自动过期:web.xml配置

<!--设置Session默认的失效时间-->
    <session-config>
        <!--1分钟后Session失效,以分钟为单位-->
        <session-timeout>1</session-timeout>
    </session-config>

在这里插入图片描述

JSP

什么是JSP

java Servlet Pages:Java 服务器端 页面,也和Servlet一样,用于开发动态web

JSP有一个最大的特点:

  • 写JSP就像写HTML

  • 区别:

    • HTML只给用户提供静态的数据(唯一能让它动的就是让JavaScript给它加一些事件,做成伪动态,它根本没有跟服务器端进行操作)
    • JSP页面中可以嵌入java代码,为用户提供动态数据;

JSP原理

思路:JSP到底怎么执行的!

  • 代码层面没有任何问题

  • 服务器内部工作

    tomcat中有一个work目录;

    IDEA中使用Tomcat的会在IDEA的tomcat中生产一个work目录

在这里插入图片描述

最终发现页面变成了Java程序!

在这里插入图片描述

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!

JSP最终也会被转换成为一个Java类Servlet的实现类

JSP本质上就是一个Servlet

//初始化
public void _jspInit() {
    }
//销毁
protected void _jspDestroy() {
    }
//JSPServlet
public abstract void _jspService(HttpServletRequest var1, HttpServletResponse var2) throws ServletException, IOException;

  1. 判断请求
  2. 内置一些对像
final javax.servlet.jsp.PageContext pageContext;//页面上下文
javax.servlet.http.HttpSession session = null;//session
final javax.servlet.ServletContext application;//applicationContext
final javax.servlet.ServletConfig config;      // config
javax.servlet.jsp.JspWriter out = null;        //out
final java.lang.Object page = this;            //page:当前
HttpServletRequest request					//请求
HttpServletResponse response				//响应
  1. 输出页面前增加的代码
response.setContextType("text/html");  //设置响应的页面类型
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOt();
  • 以上这些个对象我们可以在JSP页面中直接使用!

在这里插入图片描述

在JSP页面中:

只要是JAVA代码就会原封不

动的输出;

如果是HTML代码,就会被转换为out.write("

")输出

本质上与我们手写的Servlet类,是一样的,只是这里是将我们编写的 JSP 代码自动生成了Servlet。

JSP就是为了帮我们简化页面的编写;因为如果我们不用jsp来编写前端的页面,我们就要手动用代码out.write()敲出一个前端页面,而JSP帮我们自动生成了out.write()这些语句。

JSP基础语法

  • 任何语言都有自己的语法,java中有。JSP作为Java的技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可!!),Java所有语法都支持。
JSP表达式
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%=变量或者表达试%>
--%>
<%=new java.util.Date()%>  <%--前端页面的输出结果为:Wed Aug 11 17:59:14 CST 2021--%>


jsp脚本片段
<%--jsp脚本片段--%>
<%
    int sum = 0;
    for(int i=0;i<=100;i++){
        sum+=i;
    }
    out.print("<h1>Sum="+sum+"<h1>");
%>
脚本片段的再实现
<%
    int x = 10;
    out.print(x);
%>
<p>这是一个JSP文档</p>
<%
    int y = 2;
    out.print(y);
%>
<hr>

<%--再代码中嵌入HTML元素--%>
<%
    for (int i = 0;i<5;i++){
%>
    <h1>hello,JSP <%=i%></h1>
<%
    }
%>
JSP声明
<%!
    static {
        System.out.println("Loading Servlet");
    }
    private int globalVar = 0;
    public void kuang(){
        System.out.println("进入了方法Kuang");
    }

%>

JSP声明:会被编译到SP生成Java的类中!其它的,就会被生成到jspServlet方法中!

在JSP,嵌入Java代码即可!

JSP的注释,不会再客户端显示,HTML就会!

JSP指令
<%--出现错误就跳转到500.jsp这个页面--%>
<%@page errorPage="error/500.jsp" %>

<%--显示的声明它是一个错误的页面--%>
<%@page isErrorPage="true" %>

<%--声明这个页面的编码格式--%>
<%@page pageEncoding="utf-8" %>

<%@include file="commen/header.jsp"%>



<%-- 会将两个页面合二为一--%>

<%@include file="commen/header.jsp"%>
<h1>网页主体</h1>
<%@include file="commen/footer.jsp"%>
<hr>
<%--JSP标签
jsp:include:拼接页面,本质上还是三个页面
--%>
<%--这里注意要比上面多加一个/--%>
<jsp:include page="/commen/header.jsp"></jsp:include>
<h1>网页主体</h1>
<jsp:include page="/commen/header.jsp"></jsp:include>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值