09. Servlet Cookie 处理

本文介绍了Servlet中如何处理Cookie,包括设置、获取和删除Cookie的方法。详细解释了Cookie的属性及如何通过HttpServletRequest和HttpServletResponse进行操作。

Servlet Cookie 处理



  • Servlet 对 Cookie 的设置是直接在 HTTP 头信息中进行的,设置了 Cookie 的 Servlet 通常会发送类似的头信息:
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT;
path=/; domain=w3cschool.cc
Connection: close
Content-Type: text/html
  • Set-Cookie 头包含了一个名称值对、一个 GMT 日期、一个路径和一个域,名称和值会被 URL 编码;
  • expires 字段指定了Cookie的到期时间;
  • 在浏览器被设置为储存Cookie,它会保留该信息到到期时间,如果浏览器指向任何匹配该 Cookie 的路径或域(path指定),它会重新发送 Cookie 到服务器,此时浏览器发送的头信息类似如下:
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz

  • Servlet 中对于 Cookie 的添加、获取、删除主要是通过 HttpServletRequest 和 HttpServletReponse 成员方法来实现的;
  • Cookie 本身的属性修改、属性获取主要通过 javax.servlet.Cookie 来实现,主要相关的API如下:
void setDomain(String pattern)
设置 cookie 适用的域,例如 w3cschool.cc。
String getDomain()
获取 cookie 适用的域,例如 w3cschool.cc
void setMaxAge(int expiry)
设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效
int getMaxAge()
回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
String getName()
该方法返回 cookie 的名称。名称在创建后不能改变。
void setValue(String newValue)
设置与 cookie 关联的值。
String getValue()
获取与 cookie 关联的值。
void setPath(String uri)
该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
String getPath()
获取 cookie 适用的路径。
void setSecure(boolean flag)
设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送
void setComment(String purpose)
设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
String getComment()
获取 cookie 的注释,如果 cookie 没有注释则返回 null。

  • 当Cookie中可能包含中文或其他非英文字符时,要对 Cookie 的键值进行相应的编码、解码
 
String encodeStr =   java.net.URLEncoder.encode("中文字符串""UTF-8");            //编码
String decodeStr =   java.net.URLDecoder.decode("编码后的中文字符串","UTF-8");     // 解码


设置/添加 Cookie 到响应头


通过 Servlet 设置添加 Cookie 一般包含以下3个步骤:
① 创建 Cookie 对象;
Cookie cookie = new Cookie("key","value");
② 设置 Cookie 的最大生命周期;
cookie.setMaxAge( 60 * 60 * 24 );  //单位时间为s,设置过期时间为24h
③ 发送 Cookie 到 HTTP 响应头;
response.addCookie( cookie );
示例代码如下:
 
public class Demo extends HttpServlet{
    //将表单提交得到的 username 数据添加到Cookie
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{
        //创建Cookie对象
        Cookie username = new Cookie("username", URLEncoder.encode(request.getParameter("username")"UTF-8") );
        //设置过期时间为 24h
        username.setMaxAge(60 * 60 * 24)
        //向相应头添加 Cookie
        response.addCookie(username);
        ...... 
    }
}

获取 Cookie 从请求头

获取Cookie,只需要通过HttpRequest的getCookies() 方法获取一个 Cookie 对象数组,然后循环遍历数组使用 getName() 和 getValue() 获取数组的键值对;
示例代码如下:
 
public class Demo extends HttpServlet{
    //获取Cookie中key为username的value
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{
        String username = "";
        //获取Cookie数组
        Cookie[] cookies = request.getCookies();
        //遍历数组,找出目标键值对
        for(Cookie cookie :cookies){
            if( cookie.getName().equals("username")){
                username = cookie.getValue();
                break;   
            }
        }
    }
}

删除 Cookie

Servlet 删除 Cookie 过程如下:
  • 读取一个现有的 cookie,并把它存储在 Cookie 对象中;
  • 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie;
  • 把这个 cookie 添加到响应头;
示例代码如下:
 
public class Demo extends HttpServlet{
    //删除key为username的Cookie
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{
        
        Cookie username = null;
        //获取Cookie数组,遍历数组找出目标Cookie对象
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie :cookies){
            if( cookie.getName().equals("username"))
                username = cookie;
        }
        //设置cookie为到期时间为0
        username.setMaxAge(0);
        //将cookie添加到响应头中
        response.addCookie(username);
    }
}






<think>首先,用户的问题是:“我想了解或配置server.servlet.session.cookie.same-site的设置请问如何在SpringBoot中配置server.servlet.session.cookie.same-site属性”根据系统级指令,我需要:1.使用$...$格式处理行内数学表达式(但在这个问题中,似乎没有数学表达式,所以可能不需要)。2.独立公式使用$$...$$格式(同样,可能不适用)。3.LaTeX语法正确(确保任何LaTeX正确)。4.使用中文回答。5.生成相关问题。6.回答中引用的段落末尾自然地添加引用标识,例如[^1]。用户可见层指令:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。参考提供的引用:-引用[1]:提到server.servlet.session.cookie.same-site属性用于更改会话cookie的SameSite属性,支持Tomcat、Jetty和Undertow服务器。-引用[2]:是关于安全配置的代码示例,但似乎不直接相关。-引用[3]:提到在JavaWeb应用中设置Cookie时,javax.servlet.http.Cookie没有设置SameSite的方法。-引用[4]:是关于设置Session属性的代码。-引用[5]:是关于循环引用的错误。用户的问题集中在SpringBoot中配置server.servlet.session.cookie.same-site属性。关键信息来自引用[1]:"如果要更改会话cookie的SameSite属性,可以使用server.servlet.session.cookie.same-site属性。自动配置的Tomcat、Jetty和Undertow服务器支持此属性。"所以,我需要解释如何在SpringBoot中配置这个属性。步骤:1.**解释属性**:SameSite属性控制cookie是否在跨站点请求中发送,有助于防止CSRF攻击。值可以是Strict、Lax、None。2.**配置方法**:在SpringBoot中,可以通过application.properties或application.yml文件设置。-对于application.properties:server.servlet.session.cookie.same-site=Lax(或Strict,None)-对于application.yml:```server:servlet:session:cookie:same-site:Lax```3.**注意事项**:-确保服务器支持(如引用[1]所述)。-如果使用None,cookie必须标记为Secure(即通过HTTPS发送)。-在旧版本Servlet中,可能不支持,但SpringBoot可能处理了兼容性(引用[3]提到Servlet库可能没有直接方法)。4.**代码示例**:提供一个简单的例子。5.**生成相关问题**:在回答末尾添加相关问题。结构回答:-开头简要解释SameSite属性。-逐步指导如何配置。-添加引用标识在相关段落末尾。-最后生成相关问题。确保使用中文。</think>### 如何在Spring Boot中配置server.servlet.session.cookie.same-site属性 在Spring Boot中,`server.servlet.session.cookie.same-site`属性用于控制会话cookie的SameSite属性,这有助于增强应用的安全性,防止跨站请求伪造(CSRF)攻击。SameSite属性定义了cookie是否在跨站点请求中发送,其值通常包括`Strict`、`Lax`或`None`(其中`None`要求cookie必须通过HTTPS传输)。Spring Boot自动支持Tomcat、Jetty和Undertow等嵌入式服务器,通过该属性简化配置[^1]。以下是逐步配置指南: #### 步骤1: 理解属性值 - **Strict**: cookie仅在相同站点请求中发送,适用于高安全场景。 - **Lax**: cookie在导航到目标站点的安全请求中发送(如GET请求),是默认推荐值。 - **None**: cookie在所有跨站点请求中发送,但必须同时设置`Secure`属性(即仅通过HTTPS生效)。 如果您未设置该属性,Spring Boot默认使用服务器实现(Tomcat等)的默认值,通常为`Lax`。 #### 步骤2: 在配置文件中设置属性 在Spring Boot中,您可以直接在`application.properties`或`application.yml`文件中配置该属性。以下以常见格式说明: - **使用application.properties文件**: 打开`src/main/resources/application.properties`,添加一行: ```properties server.servlet.session.cookie.same-site=Lax # 可选值:Strict、Lax、None ``` 如果您需要设置`None`值(用于跨站点场景),必须同时启用`Secure`属性: ```properties server.servlet.session.cookie.secure=true # 强制HTTPS server.servlet.session.cookie.same-site=None ``` - **使用application.yml文件**: 打开`src/main/resources/application.yml`,添加以下YAML结构: ```yaml server: servlet: session: cookie: same-site: Lax # 可选值:Strict、Lax、None secure: true # 当same-site=None时必需 ``` #### 步骤3: 验证配置 - 启动应用后,检查浏览器中的会话cookie(例如通过开发者工具的Application > Cookies部分)。SameSite属性应显示为设置的值。 - 如果使用`None`值,请确保应用部署在HTTPS环境下,否则浏览器可能忽略cookie。 #### 注意事项 - **兼容性问题**: 在旧版本Servlet(如Java EE 8之前)中,`javax.servlet.http.Cookie`类可能不直接支持SameSite属性[^3]。但Spring Boot通过自动配置处理了这一问题,您无需手动修改Cookie对象。 - **服务器支持**: 该属性仅适用于Spring Boot的嵌入式服务器(Tomcat、Jetty、Undertow)。如果您使用外部服务器(如独立Tomcat),需在服务器配置中单独设置。 - **Spring Session集成**: 如果您使用Spring Session管理会话,该属性也会自动应用到`SessionRepository` bean[^1]。 - **错误处理**: 如果配置后出现循环引用或bean冲突错误,检查依赖注入是否合理,或临时设置`spring.main.allow-circular-references=true`作为最后手段[^5]。 通过以上步骤,您可以轻松配置SameSite属性,提升应用安全性。如果您遇到问题,建议查阅Spring Boot官方文档或使用IDE的配置提示功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值