Servlet-Cookie与Session

本文介绍了Servlet中Cookie和Session的使用,包括它们的获取、设置、过期时间和作用范围。Cookie是客户端会话技术,数据存储在浏览器,每次请求都会携带;而Session是服务器端技术,数据存储在服务器,通过sessionId在客户端和服务器间建立会话。同时,讨论了两者的比较及如何实现客户端失效处理。

Servlet-Cookie与Session

1lombok包

可以快速生成get和set方法,让代码更简洁

在maven中引入依赖

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

通过注解生成get与set方法

@Data 生成get和set方法
@NoArgsConstructor 无参构造
@AllArgsConstructor 全参构造

2 会话管理

http是无状态的,这个时候我们可能需要在服务端获取到当前操作用户的信息,在这个时候,我们通过会话来实现和同一个客户端交互的时候多次请求共享一些数据

image.png

3 Cookie

3.1 获取方法

Cookie[] cookies = req.getCookies();

3.2 设置Cookie

Cookie cookie = new Cookie(name,value);
resp.addCookie(cookie);

3.3 Cookie的过期时间

默认浏览器关闭后销毁

可以指定过期时间

Cookie cookie = new Cookie("token", "这是我们访问系统的凭证");
// 指定过期时间,单位秒
cookie.setMaxAge(2 * 60 * 60);

3.4 Cookie的作用范围

作用范围是域名+path

可以指定域名和path属性

Cookie cookie = new Cookie("token", "这是我们访问系统的凭证");
// 指定项目前缀
cookie.setPath("/");
// 指定域名
cookie.setDomain();

可以通过设置httpOnly属性来让这个Cookie只能用于http传输,客户端(浏览器)不能去操作它

4 Session

4.1 怎么获取

HttpSession session = req.getSession();

4.2 向Session域中添加数据

setAttribute
getAttribute
removeAttribute

注意: 所有的域都可以使用这三个API

4.3 Session的过期时间

服务器关闭销毁
默认30分钟销毁
指定过期时间,在web.xml

<session-config>
    <!--2个小时-->
    <session-timeout>120</session-timeout>
</session-config>

4.4 Session客户端失效

session需要和cookie配合使用,如果cookie失效了客户端也无法对应服务端。在这里服务端会自动向客户端写JSESSIONID,我们手动写入JSESSIONID,并指定过期时间

Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(2*60*60);
cookie.setHttpOnly(true);
resp.addCookie(cookie);

5 Cookie与Session比较

5.1 cookie

是客户端会话技术,数据是存在浏览器中的
每次发送请求的时候会携带cookie
在服务端可以通过req.getCookies()获取cookie
服务端也可以通过resp.addCookie()向客户端写入cookie(原理:响应头的set-cookie会被浏览器解析,将对应的内容存放到客户端)

5.2 session

是服务端的会话技术,数据是存在服务端的
session的实现需要结合cookie,
每次创建session的时候会生成一个sessionId,
服务端会将这个sessionId写入到客户端的cookie中(JSESSIONID),
客户端每次发送请求的时候,会带上cookie,服务端就根据JSESSIONID找到对应的session

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>Taobao Data Visualization Platform</display-name> <!-- 配置欢迎页 --> <welcome-file-list> <welcome-file>dashboard.jsp</welcome-file> </welcome-file-list> <!-- 会话Cookie配置 - 解决SameSite警告 --> <session-config> <session-timeout>30</session-timeout> <cookie-config> <http-only>true</http-only> <secure>true</secure> <same-site>None</same-site> <max-age>-1</max-age> </cookie-config> <tracking-mode>COOKIE</tracking-mode> </session-config> <!-- 字符编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>com.taobao.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- HotBrandServlet 配置 --> <servlet> <servlet-name>HotBrandServlet</servlet-name> <servlet-class>com.taobao.servlet.HotBrandServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HotBrandServlet</servlet-name> <url-pattern>/hotbrand</url-pattern> </servlet-mapping> <!-- AgeBehaviorServlet 配置 --> <servlet> <servlet-name>AgeBehaviorServlet</servlet-name> <servlet-class>com.taobao.servlet.AgeBehaviorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AgeBehaviorServlet</servlet-name> <url-pattern>/ageBehavior</url-pattern> </servlet-mapping> <!-- ProvincePurchaseServlet 配置 --> <servlet> <servlet-name>ProvincePurchaseServlet</servlet-name> <servlet-class>com.taobao.servlet.ProvincePurchaseServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ProvincePurchaseServlet</servlet-name> <url-pattern>/provincePurchase</url-pattern> </servlet-mapping> <!-- RebuyPredictionServlet 配置 --> <servlet> <servlet-name>RebuyPredictionServlet</servlet-name> <servlet-class>com.taobao.servlet.RebuyPredictionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RebuyPredictionServlet</servlet-name> <url-pattern>/rebuyPrediction</url-pattern> </servlet-mapping> <servlet> <servlet-name>UserBehaviorServlet</servlet-name> <servlet-class>com.taobao.servlet.UserBehaviorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserBehaviorServlet</servlet-name> <url-pattern>/userBehavior</url-pattern> </servlet-mapping> <!-- 全局异常处理 --> <error-page> <error-code>404</error-code> <location>/error404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error500.jsp</location> </error-page> </web-app>怎么改
最新发布
06-17
从错误信息来看,`web.xml` 文件中存在以下问题: 1. **`<same-site>` 标签不被支持**:根据 `cvc-complex-type.2.4.a` 错误提示,`<same-site>` 标签在当前的 XML Schema 中无效。 2. **可能缺少必要的配置项**:例如 `<max-age>` 的值为 `-1` 可能不符合规范。 以下是修复后的 `web.xml` 文件以及相关解释。 --- ### 修复后的 `web.xml` ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>Taobao Data Visualization Platform</display-name> <!-- 配置欢迎页 --> <welcome-file-list> <welcome-file>dashboard.jsp</welcome-file> </welcome-file-list> <!-- 会话Cookie配置 - 解决SameSite警告 --> <session-config> <session-timeout>30</session-timeout> <cookie-config> <http-only>true</http-only> <secure>true</secure> <!-- 移除 <same-site> 标签 --> <max-age>-1</max-age> </cookie-config> <tracking-mode>COOKIE</tracking-mode> </session-config> <!-- 字符编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>com.taobao.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- HotBrandServlet 配置 --> <servlet> <servlet-name>HotBrandServlet</servlet-name> <servlet-class>com.taobao.servlet.HotBrandServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HotBrandServlet</servlet-name> <url-pattern>/hotbrand</url-pattern> </servlet-mapping> <!-- AgeBehaviorServlet 配置 --> <servlet> <servlet-name>AgeBehaviorServlet</servlet-name> <servlet-class>com.taobao.servlet.AgeBehaviorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AgeBehaviorServlet</servlet-name> <url-pattern>/ageBehavior</url-pattern> </servlet-mapping> <!-- ProvincePurchaseServlet 配置 --> <servlet> <servlet-name>ProvincePurchaseServlet</servlet-name> <servlet-class>com.taobao.servlet.ProvincePurchaseServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ProvincePurchaseServlet</servlet-name> <url-pattern>/provincePurchase</url-pattern> </servlet-mapping> <!-- RebuyPredictionServlet 配置 --> <servlet> <servlet-name>RebuyPredictionServlet</servlet-name> <servlet-class>com.taobao.servlet.RebuyPredictionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RebuyPredictionServlet</servlet-name> <url-pattern>/rebuyPrediction</url-pattern> </servlet-mapping> <!-- UserBehaviorServlet 配置 --> <servlet> <servlet-name>UserBehaviorServlet</servlet-name> <servlet-class>com.taobao.servlet.UserBehaviorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserBehaviorServlet</servlet-name> <url-pattern>/userBehavior</url-pattern> </servlet-mapping> <!-- 全局异常处理 --> <error-page> <error-code>404</error-code> <location>/error404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error500.jsp</location> </error-page> </web-app> ``` --- ### 给出解释 #### 1. **移除 `<same-site>` 标签** - `<same-site>` 标签不是标准的 `web.xml` 配置项。如果需要设置 `SameSite` 属性,可以通过 Servlet 或过滤器动态设置响应头。例如: ```java response.setHeader("Set-Cookie", "JSESSIONID=" + session.getId() + "; Secure; HttpOnly; SameSite=None"); ``` #### 2. **保留 `<max-age>` 标签** - `<max-age>` 是有效的配置项,但其值为 `-1` 表示 Cookie 不会过期(会话级 Cookie)。如果需要调整 Cookie 的生命周期,可以将其设置为正整数(单位为秒)。 #### 3. **确保 XML Schema 合规** - 使用正确的 `xsi:schemaLocation` 和 `version` 声明,确保文件符合 Java EE 4.0 规范。 #### 4. **其他配置保持不变** - 过滤器、Servlet 和全局异常处理配置无需修改,直接保留原样。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值