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以后,具体用哪个还是需要根据具体的业务进行具体分析。

相关推荐
geNE GENT2 小时前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
FQNmxDG4S10 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
前端老石人10 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang11 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全11 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje11 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv712 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫12 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_4352879212 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日