JSP Cookie和Session

  1. 请求对象,一次请求
  2. response:响应对象
  3. session :会话对象,一个浏览器对应一个 session
  4. application:整个项目全局对象,所有用户共享
  5. pageContext:页面上下文,能获取其他所有对象
  6. out:页面输出流,向页面写内容
  7. page:当前 JSP 实例(this)
  8. config:Servlet 配置
  9. exception:异常对象(错误页面用)

四个域对象(存数据用)

从小到大:

  1. pageContext:仅当前页面
  2. request:一次请求内有效(转发有效,重定向失效)
  3. session:一个浏览器会话有效
  4. application:整个项目全局有效

存 / 取:setAttribute / getAttribute


五、EL 表达式 ${}

  1. 作用:简化取值,代替 JSP 脚本
  2. 用法:
    • 取域中数据:${register_msg}
    • 取对象属性:${user.username}
  3. 注意:
    • 要开启 isELIgnored="false"
    • 只能取域对象里存的数据

六、JSTL 标签库

配合 EL 使用,代替 JSP 脚本,页面不写 Java 代码常用核心标签:

  • <c:if>:条件判断
  • <c:forEach>:循环遍历列表、数组

使用步骤:

  1. 导入依赖
  2. 页面 taglib 引入
  3. 直接用标签

七、转发 和 重定向(JSP/Servlet 必考点)

1. 转发(服务器内部跳转)

java

运行

复制代码
req.getRequestDispatcher("/xxx.jsp").forward(req,resp);
  • 地址栏不变
  • 一次请求,request 数据共享
  • 可以访问 WEB-INF 资源

2. 重定向(浏览器重新请求)

java

运行

复制代码
resp.sendRedirect("xxx.jsp");
  • 地址栏
  • 两次请求,request 数据丢失
  • 不能访问 WEB-INF

八、JSP 和 Servlet 分工

  • Servlet后台干活(接收请求、处理业务、操作数据库、存数据到域)
  • JSP前台展示(取域中数据、页面渲染、循环、判断)

MVC 思想:Servlet 做控制器,JSP 做视图


九、Session 重点(你刚做的验证码项目)

  1. 一个浏览器 = 一个 Session
  2. 存在服务器端 ,靠 JSESSIONID 标识
  3. 跨页面、跨 Servlet 共享数据
  4. 验证码原理:
    • 生成验证码 → 存入 Session
    • 注册页面提交 → 从 Session 取值对比

学习Cookie,我们主要解决下面几个问题:

  • 什么是Cookie?

  • Cookie如何来使用?

  • Cookie是如何实现的?

  • Cookie的使用注意事项有哪些?

2.1 Cookie的基本使用

1.概念

==Cookie==:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。

2.Cookie的工作流程

3.Cookie的基本使用

对于Cookie的使用,我们更关注的应该是后台代码如何操作Cookie,对于Cookie的操作主要分两大类,本别是==发送Cookie==和==获取Cookie==,对于上面这两块内容,分别该如何实现呢?

3.1 发送Cookie

  • 创建Cookie对象,并设置数据
复制代码
Cookie cookie = new Cookie("key","value");
  • 发送Cookie到客户端:使用==response==对象
复制代码
response.addCookie(cookie);

介绍完发送Cookie对应的步骤后,接下面通过一个案例来完成Cookie的发送,具体实现步骤为:

需求:在Servlet中生成Cookie对象并存入数据,然后将数据发送给浏览器

1.创建Maven项目,项目名称为cookie-demo,并在pom.xml添加依赖

2.编写Servlet类,名称为AServlet

3.在AServlet中创建Cookie对象,存入数据,发送给前端

4.启动测试,在浏览器查看Cookie对象中的值

(1)创建Maven项目cookie-demo,并在pom.xml添加依赖

复制代码
<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
</properties>
​
<dependencies>
    <!--servlet-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!--jsp-->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
    <!--jstl-->
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
        </plugin>
    </plugins>
</build>

(2)编写Servlet类,名称为AServlet

复制代码
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送Cookie
        //1. 创建Cookie对象
Cookie cookie = new Cookie("username","zs");
//2. 发送Cookie,response
response.addCookie(cookie);
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

3.2 获取Cookie

  • 获取客户端携带的所有Cookie,使用==request==对象
复制代码
Cookie\[\] cookies = request.getCookies();
  • 遍历数组,获取每一个Cookie对象:for

  • 使用Cookie对象方法获取数据

复制代码
cookie.getName();
cookie.getValue();

)在BServlet中使用request对象获取Cookie数组,遍历数组,从数据中获取指定名称对应的值

复制代码
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Cookie
        //1. 获取Cookie数组
Cookie\[\] cookies = request.getCookies();
//2. 遍历数组
for (Cookie cookie : cookies) {
//3. 获取数据
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();
System.out.println(name+":"+value);
break;
}
}
​
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

2.2 Cookie的原理分析

  • 前面的案例中已经能够实现,AServlet给前端发送Cookie,BServlet从request中获取Cookie的功能

  • 对于AServlet响应数据的时候,Tomcat服务器都是基于HTTP协议来响应数据

  • 当Tomcat发现后端要返回的是一个Cookie对象之后,Tomcat就会在响应头中添加一行数据==Set-Cookie:username=zs==

  • 浏览器获取到响应结果后,从响应头中就可以获取到Set-Cookie对应值username=zs,并将数据存储在浏览器的内存中

  • 浏览器再次发送请求给BServlet的时候,浏览器会自动在请求头中添加==Cookie: username=zs==发送给服务端BServlet

  • Request对象会把请求头中cookie对应的值封装成一个个Cookie对象,最终形成一个数组

  • BServlet通过Request对象获取到Cookie\[\]后,就可以从中获取自己需要的数据

2.3.1 Cookie的存活时间
  • 设置Cookie存活时间
复制代码
setMaxAge(int seconds)

参数值为:

1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除

2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁

3.零:删除对应Cookie

2.3.2 Cookie存储中文

(1)在AServlet中对中文进行URL编码

复制代码
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送Cookie
        String value = "张三";
        //对中文进行URL编码
value = URLEncoder.encode(value, "UTF-8");
        System.out.println("存储数据:"+value);
        //将编码后的值存入Cookie中
        Cookie cookie = new Cookie("username",value);
        //设置存活时间   ,1周 7天
        cookie.setMaxAge(60*60*24*7);
        //2. 发送Cookie,response
        response.addCookie(cookie);
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

(2)在BServlet中获取值,并对值进行解码

复制代码
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Cookie
        //1. 获取Cookie数组
        Cookie[] cookies = request.getCookies();
        //2. 遍历数组
        for (Cookie cookie : cookies) {
            //3. 获取数据
            String name = cookie.getName();
            if("username".equals(name)){
                String value = cookie.getValue();//获取的是URL编码后的值 %E5%BC%A0%E4%B8%89
               //URL解码
value = URLDecoder.decode(value,"UTF-8");
                System.out.println(name+":"+value);//value解码后为 张三
                break;
            }
        }
​
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

3,Session

1.概念

==Session==:服务端会话跟踪技术:将数据保存到服务端。

  • Session是存储在服务端而Cookie是存储在客户端

  • 存储在客户端的数据容易被窃取和截获,存在很多不安全的因素

  • 存储在服务端的数据相比于客户端来说就更安全

2.Session的工作流程

Session的基本使用

在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。

具体的使用步骤为:

  • 获取Session对象,使用的是request对象
复制代码
HttpSession session = request.getSession();
  • Session对象提供的功能:

    • 存储数据到 session 域中

      复制代码
      void setAttribute(String name, Object o)
    • 根据 key,获取值

      复制代码
      Object getAttribute(String name)
    • 根据 key,删除该键值对

      复制代码
      void removeAttribute(String name)

介绍完Session相关的API后,接下来通过一个案例来完成

SessionDemo1:获取Session对象、存储数据

复制代码
@WebServlet("/demo1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //存储到Session中
//1. 获取Session对象
HttpSession session = request.getSession();
//2. 存储数据
session.setAttribute("username","zs");
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

SessionDemo2:获取Session对象、获取数据

复制代码
@WebServlet("/demo2")
public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取数据,从session中
//1. 获取Session对象
HttpSession session = request.getSession();
//2. 获取数据
Object username = session.getAttribute("username");
System.out.println(username);
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
  • Cookie :真实数据放浏览器,浏览器每次把数据直接发给服务器

  • Session :真实数据放服务器,浏览器只带一个编号 ,服务器靠编号找到你专属的 Session

Cookie:服务器给浏览器一张小纸条,浏览器存着,每次访问把纸条带回去,服务器用 getName、getValue 读内容。

Session:服务器存好数据,只给浏览器一个编号;浏览器每次把编号发回来,服务器根据编号,在服务器内部找到你的 Session 和里面的数据。

3.2 Session的原理分析

Session要想实现一次会话多次请求之间的数据共享,就必须要保证多次请求获取Session的对象是同一个。

(1)demo1在第一次获取session对象的时候,session对象会有一个唯一的标识,假如是id:10

(2)demo1在session中存入其他数据并处理完成所有业务后,需要通过Tomcat服务器响应结果给浏览器

(3)Tomcat服务器发现业务处理中使用了session对象,就会把session的唯一标识id:10当做一个cookie,添加Set-Cookie:JESSIONID=10到响应头中,并响应给浏览器

(4)浏览器接收到响应结果后,会把响应头中的coookie数据存储到浏览器的内存中

(5)浏览器在同一会话中访问demo2的时候,会把cookie中的数据按照cookie: JESSIONID=10的格式添加到请求头中并发送给服务器Tomcat

(6)demo2获取到请求后,从请求头中就读取cookie中的JSESSIONID值为10,然后就会到服务器内存中寻找id:10的session对象,如果找到了,就直接返回该对象,如果没有则新创建一个session对象

(7)关闭打开浏览器后,因为浏览器的cookie已被销毁,所以就没有JESSIONID的数据,服务端获取到的session就是一个全新的session对象

Session的钝化和活化: (场景在服务器的正常关闭)

  • 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中

    • 钝化的数据路径为:项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser

  • 活化:再次启动服务器后,从文件中加载数据到Session中

    • 数据加载到Session中后,路径中的SESSIONS.ser文件会被删除掉
Session销毁

session的销毁会有两种方式:

  • 默认情况下,无操作,30分钟自动销毁

    • 对于这个失效时间,是可以通过配置进行修改的

    • 在项目的web.xml中配置

如果没有配置,默认是30分钟,默认值是在Tomcat的web.xml配置文件中写死的

调用Session对象的**invalidate()**进行销毁

在SessionDemo2类中添加session销毁的方法

Cookie和Session小结

  • Cookie 和 Session 都是来完成一次会话内多次请求间==数据共享==的。

所需两个对象放在一块,就需要思考:

Cookie和Session的区别是什么?

Cookie和Session的应用场景分别是什么?

  • 区别:

    • 存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端

    • 安全性:Cookie不安全,Session安全

    • 数据大小:Cookie最大3KB,Session无大小限制

    • 存储时间:Cookie可以通过setMaxAge()长期存储,Session默认30分钟

    • 服务器性能:Cookie不占服务器资源,Session占用服务器资源

  • 应用场景:

    • 购物车:使用Cookie来存储

    • 以登录用户的名称展示:使用Session来存储

    • 记住我功能:使用Cookie来存储

    • 验证码:使用session来存储

  • 结论

    • Cookie是用来保证用户在未登录情况下的身份识别

    • Session是用来保存用户登录后的数据

介绍完Cookie和Session以后,具体用哪个还是需要根据具体的业务进行具体分析。

相关推荐
Scott9999HH5 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔5 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海6 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨8 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大10 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai10 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说10 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json