文档章节

解决过滤器中设置cookie无效的问题

黄威
 黄威
发布于 10/21 17:22
字数 377
阅读 23
收藏 4

解决过滤器中设置cookie无效的问题

代码现场

 filterChain.doFilter(sessionSyncRequestWrapper, response);
Cookie emailCook = WebServletUtil.getSelectedCookie(request.getCookies(), Constant2.COOKIE_KEY_JSESSIONID, null);
        if (emailCook != null) {
            System.out.println("保存 :" + request.getSession().getId());
            emailCook.setMaxAge(12 * 60 * 60);
            emailCook.setPath("/");//设置cookie时,设置path为根路径
            response.addCookie(emailCook);
        } else {
            WebServletUtil.setSessionIdCookie( request.getSession().getId(),response,48);
        }
       

目的:设置cookie(JSESSIONID)的超时时间,让cookie(JSESSIONID)持久化,
浏览器关闭之后,cookie(JSESSIONID)依然有效
但是实际没有持久化,很奇怪
明明设置了很长的过期时间,为什么没有生效呢?
测试了百遍,终于发现了问题

不生效的原因

是因为 response 已经 commit了, 我们看看response.isCommitted() 方法的解释说明:

/**
     * Returns a boolean indicating if the response has been
     * committed.  A committed response has already had its status 
     * code and headers written.
     *
     * @return		a boolean indicating if the response has been
     *  		committed
     *
     * @see 		#setBufferSize
     * @see 		#getBufferSize
     * @see 		#flushBuffer
     * @see 		#reset
     *
     */

    public boolean isCommitted();

说白了,response如果已经commit了,再设置cookie(即response的header)不会生效.
因为我是在 filterChain.doFilter 之后设置cookie,所以一直没有生效

解决方法:

filterChain.doFilter 之前设置cookie:

Cookie emailCook = WebServletUtil.getSelectedCookie(request.getCookies(), Constant2.COOKIE_KEY_JSESSIONID, null);
        if (emailCook != null) {
            System.out.println("保存 :" + request.getSession().getId());
            emailCook.setMaxAge(12 * 60 * 60);
            emailCook.setPath("/");//设置cookie时,设置path为根路径
            response.addCookie(emailCook);
        } else {
            WebServletUtil.setSessionIdCookie( request.getSession().getId(),response,48);
        }
        filterChain.doFilter(sessionSyncRequestWrapper, response);

注意:

  1. 如何查看response 是否已经commit? 使用 response.isCommitted() ;
  2. chain.doFilter(request, response); 之后response的状态是已经commit

参考:
自定义实现session持久化

© 著作权归作者所有

共有 人打赏支持
黄威
粉丝 17
博文 59
码字总数 34435
作品 0
昌平
程序员
私信 提问
Android 控件WebView设置Cookie

01. 设置方式 同步的问题很常见,网上搜到的解决方法基本类似。 这里简单说明: 参数中的URL在使用过程中基本是域名。例如就可以使 Cookie列表的获取根据自己项目的存储方式不同而不同。例如...

丁佳辉
2017/11/02
0
0
birt跨域session失效问题

至于为什么使用BIRT我想在这里也不用过多说明了,公司从去年底(2013年)开始引入了BIRT,使用过程中也比较顺利,对于技术人员也比较容易上手。 使用BIRT做的第一个主要工作就是将原有项目中...

shaguofen
2014/04/26
0
3
跨域登陆,IE下无法记录Cookie

作者:近乎团队 在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名。当你在浏览器中对一个域名设置了一个cookie,这个 cookie对于其它的域名将无效。如果你想让你的用户从...

小近
2014/11/24
306
0
从URL中移除JSESSIONID

对于Tomcat 7将其添加到web.xml中 <session-config> <!-- Disables URL-based sessions (no more 'jsessionid' in the URL using Tomcat) --> <tracking-mode>COOKIE</tracking-mode></sess......

龙之天空
2015/12/23
76
1
springCloud(15):使用Zuul构建微服务网关-Header与文件上传和过滤器

一、Header 1.1、敏感header的设置 一般来说,可在同一个系统中的服务之间共享Header,不过应尽量防止让一些敏感的Header外泄。 zuul: routes: provide-user: sensitive-headers: Cookie,Se...

我爱大金子
2017/08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS 安装PHP5和PHP7

安装PHP5 下载解压二进制包 [root@test-a src]# cd /usr/local/src/[root@test-a src]# wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2[root@test-a src]# tar jxvf php-5.6......

野雪球
今天
4
0
windows上类似dnsmasq的软件Dual DHCP DNS Server

官网地址:http://dhcp-dns-server.sourceforge.net/官网定向的下载地址:https://sourceforge.net/projects/dhcp-dns-server/files/ 设置参考地址:http://blog.51cto.com/zhukeqiang/18264......

xueyuse0012
今天
3
0
LinkedHashMap源码解析

前言 HashMap中的元素时无序的,也就是说遍历HashMap的时候,顺序和放入的顺序是不一样的。 如果需要有序的Map,就可以采用LinkedHashMap. LinkedHashMap通过维护一个包含所有元素的双向链表,...

grace_233
今天
3
0
初识flask

文档 0.10.1版本 http://www.pythondoc.com/flask/index.html 1.0.2版本 https://dormousehole.readthedocs.io/en/latest/ 安装flask $ pip3 install flaskCollecting flask Downloading......

yimingkeji
昨天
5
0
Akka系统《sixteen》译

Actor是一个封装状态(state)和行为(behavior)的对象,它们只通过交换消息通信(放入收件人邮箱的邮件)。从某种意义上说,Actor是最严格的面向对象编程形式,但它更适合将他们视为人:在与Act...

woshixin
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部