cookie.getMaxAge()的默认值

本文详细介绍了如何使用cookie.getMaxAge()来设置Cookie的有效期。包括如何通过设置正数值使Cookie保存在客户端硬盘上直到指定时间过期;如何设置负数值使Cookie仅存储在浏览器内存中,关闭浏览器即消失;以及如何设置为0来立即删除Cookie。

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

cookie.getMaxAge() 可以为正数,表示此cookie从创建到过期所能存在的时间,以秒为单位,此cookie会存储到客户端电脑,以cookie文件形式保存,不论关闭浏览器或关闭电脑,直到时间到才会过期。

可以为负数,表示此cookie只是存储在浏览器内存里,只要关闭浏览器,此cookie就会消失。cookie.getMaxAge()默认值为-1。

还可以为0,表示从客户端电脑或浏览器内存中删除此cookie。

package com.sie.common.config; import jakarta.servlet.*; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.LocaleUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component; import org.springframework.web.util.WebUtils; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Locale; @Component public class InitializationLocalFilter implements Filter { // 支持的语言列表(扩展繁体中文和葡萄牙文) private static final List<String> SUPPORTED_LOCALES = Arrays.asList( "zh_CN", "zh_TW", // 中文(简体/繁体) "en_US", // 英文 "pt_PT", "pt_BR" // 葡萄牙文(葡萄牙/巴西) ); private static final String DEFAULT_LOCALE = "zh_CN"; // 默认中文简体 private static final String LOCALE_PARAMETER = "locale"; // 请求参数名 private static final String LOCALE_COOKIE_NAME = "locale_request_change_attr"; // Cookie名 private static final int COOKIE_EXPIRE = 1209600; // Cookie有效期(14天) private static final Logger LOGGER = LoggerFactory.getLogger(InitializationLocalFilter.class); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 1. 解析语言:优先取请求参数,其次取Cookie,最后用默认 Locale currentLocale = resolveLocale(httpRequest); // 2. 设置当前线程的语言环境 LocaleContextHolder.setLocale(currentLocale, true); // 3. 将语言存入Cookie(下次请求可复用) addCookie(httpResponse, LOCALE_COOKIE_NAME, currentLocale.toString(), COOKIE_EXPIRE); // 4. 继续执行请求链 chain.doFilter(request, response); // 5. 清理线程变量 LocaleContextHolder.resetLocaleContext(); } /** * 解析请求中的语言(参数 > Cookie > 默认) */ private Locale resolveLocale(HttpServletRequest request) { // 从请求参数获取(如 ?locale=zh_TW 或 ?locale=pt_BR) String paramLocale = request.getParameter(LOCALE_PARAMETER); if (paramLocale != null && SUPPORTED_LOCALES.contains(paramLocale)) { return LocaleUtils.toLocale(paramLocale); } // 从Cookie获取 Cookie localeCookie = WebUtils.getCookie(request, LOCALE_COOKIE_NAME); if (localeCookie != null && SUPPORTED_LOCALES.contains(localeCookie.getValue())) { try { return LocaleUtils.toLocale(localeCookie.getValue()); } catch (IllegalArgumentException e) { LOGGER.warn("Cookie中的语言格式无效: {}", localeCookie.getValue()); } } // 默认返回中文简体 return LocaleUtils.toLocale(DEFAULT_LOCALE); } /** * 添加语言Cookie */ private void addCookie(HttpServletResponse response, String name, String value, int maxAge) { Cookie cookie = new Cookie(name, value); cookie.setPath("/"); // 全站有效 cookie.setMaxAge(maxAge); cookie.setHttpOnly(true); // 防止JS读取,增强安全性 response.addCookie(cookie); } }根据这个文件,优化一下你写的代码
最新发布
07-12
<think>好的,用户想修改Java代码来防止HTTP响应截断漏洞,并确保Cookie的安全性,包括设置HttpOnly和Secure属性。我需要仔细分析这个问题,并提供正确的解决方案。 首先,HTTP响应截断通常是因为用户输入中包含了换行符(如\r\n),导致响应头被分割。比如,攻击者可能提交类似“Wiley Hacker\r\n...”的内容,使得服务器返回多个响应。这可以通过对用户输入进行过滤,移除或替换换行符来解决。记得引用中的例子提到过这种情况,可以参考引用[3]。 接下来是Cookie的安全性设置。用户提到HttpOnly和Secure属性。根据引用[2],HttpOnly可以防止JavaScript访问Cookie,增强安全性。而Secure属性确保Cookie仅通过HTTPS传输。此外,还要检查Domain和Path属性,确保Cookie的作用范围正确,避免泄露到其他域或路径。同时,设置合适的过期时间,避免长期有效,引用[1]也提到了这些检查。 在Java中,处理Cookie通常使用HttpServletResponse的addCookie方法。旧版本的Servlet可能不支持直接设置HttpOnly,可能需要手动添加Set-Cookie头。但Servlet 3.0及以上版本支持setHttpOnly方法。同时,需要确保Secure属性在HTTPS环境下启用,否则可能导致Cookie无法传输。 另外,用户输入验证也很重要。所有用户提供的数据,如Cookie的值,都应进行过滤,移除非法字符,防止SQL注入或XSS攻击,引用[1]提到过滤Cookie中的字符。可以使用replaceAll方法替换掉换行符和分号等。 然后,考虑代码的具体实现。例如,创建Cookie对象后,设置HttpOnly和Secure属性,同时设置Domain、Path和Max-Age。在添加Cookie到响应头时,注意使用正确的方法,避免使用旧版本导致属性不生效。如果使用Servlet 3.0以下,可能需要手动拼接Set-Cookie头,但这样容易出错,建议升级或寻找其他方式。 最后,测试代码是否生效,检查响应头中的Set-Cookie是否包含正确的属性。同时,确保服务器使用HTTPS,这样Secure属性才能起作用。另外,处理并发安全的问题,引用[4]提到使用同步锁或原子操作,虽然这可能与当前问题关联不大,但也需要注意代码的线程安全性。 总结步骤:过滤用户输入中的换行符,正确设置Cookie的各项安全属性,验证并测试响应头是否正确,确保服务器配置支持HTTPS。这样就能有效防止HTTP响应截断和提升Cookie安全性。</think>要解决HTTP响应截断漏洞并提升Cookie安全性,需从输入过滤和属性设置两方面调整Java代码,以下是具体实现步骤: --- ### **1. 防止HTTP响应截断** **漏洞原因**:攻击者通过输入包含换行符(如`\r\n`)的内容截断HTTP响应头[^3] **解决方案**:对用户输入进行过滤,替换所有换行符和分号 ```java String sanitizedValue = originalValue.replaceAll("[\r\n;]", ""); ``` --- ### **2. 设置Cookie安全属性** #### **关键属性设置** | 属性 | 作用 | 实现代码 | |------------|--------------------------|------------------------------| | **HttpOnly** | 禁止JavaScript访问Cookie | `cookie.setHttpOnly(true);` | | **Secure** | 仅通过HTTPS传输Cookie | `cookie.setSecure(true);` | | **Domain** | 限制Cookie作用域 | `cookie.setDomain("yourdomain.com");` | | **Path** | 限制Cookie路径 | `cookie.setPath("/");` | | **Max-Age** | 设置过期时间 | `cookie.setMaxAge(3600);` | #### **完整代码示例** ```java // 创建Cookie对象并过滤非法字符 String cookieValue = request.getParameter("cookieParam"); String sanitizedValue = cookieValue.replaceAll("[\r\n;]", ""); // 防御响应截断 Cookie cookie = new Cookie("authToken", sanitizedValue); // 设置安全属性 cookie.setHttpOnly(true); // 防御XSS窃取Cookie[^2] cookie.setSecure(true); // 仅HTTPS传输[^1] cookie.setDomain("yourdomain.com"); cookie.setPath("/"); cookie.setMaxAge(3600); // 过期时间1小时 // 添加到响应头 response.addCookie(cookie); ``` --- ### **3. 补充安全措施** 1. **强制HTTPS**:确保服务器部署SSL证书,否则`Secure`属性会导致Cookie失效 2. **敏感操作保护**:对Cookie读写操作添加同步锁,防止并发问题[^4] ```java synchronized (this) { response.addCookie(cookie); } ``` --- ### **验证方法** 检查HTTP响应头是否包含安全标记: ``` Set-Cookie: authToken=sanitized_value; HttpOnly; Secure; Domain=yourdomain.com; Path=/; Max-Age=3600 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值