发布于2021-05-29 22:36 阅读(396) 评论(0) 点赞(30) 收藏(0)
在本地项目启动后,通过浏览器访问,查看浏览器中的cookie信息,其中一些自定义的cookie信息,比如用户信息的过期时间并没有自动刷新
本地(测试环境)
jdk: 1.7
tomcat: 7.0.68
服务器(仿生产环境)
jdk: 1.7
weblogic: 12.1.1.0
1、首先在本地tomcat容器中部署启动项目A,在浏览器中访问后,查看浏览器中的cookie信息的过期时间没有变化;
2、在服务器启动weblogic容器,部署启动项目A后,在浏览器中访问后,查看浏览器中的cookie信息的过期时间随着请求自动更新;
3、本地还存在一个项目B,其项目架构和项目A类似,项目B在tomcat容器中部署启动后,在浏览器中访问后,查看浏览器中的cookie信息的过期时间随着请求自动更新;
4、在服务器weblogic部署启动项目B后,在浏览器中访问后,查看浏览器中的cookie信息的过期时间随着请求自动更新;
以上得出,项目A中的某些配置必然和项目B中不一致;
并且只是在tomcat中有区别
经查找,项目A和项目B中过滤器都一样,都有XssFilter、CharacterEncodingFilter、LoginFilter和CookieFilter这四个过滤器,而在过滤请求中重新设置cookie信息中某些值的过期时间的是LoginFilter,其伪代码如下:
// 更新cookie
CookieUtils.addCookie((HttpServletResponse) response, Const.COOKIE_USERCODE, str_ck_usercode, online_time);
CookieUtils.addCookie((HttpServletResponse) response, Const.COOKIE_USERNAME, str_ck_username, online_time);
CookieUtils.addCookie((HttpServletResponse) response, Const.COOKIE_COMCODE, str_ck_comcode, online_time);
CookieUtils.addCookie((HttpServletResponse) response, Const.COOKIE_ONLINE, ck_online.getValue(), online_time);
/**
* 设置cookie
* @param response
* @param name cookie名字
* @param value cookie值
* @param maxAge cookie生命周期 以秒为单位
*/
public static void addCookie(HttpServletResponse response,String name,String value,int maxAge){
Cookie cookie;
if(value!=null){
cookie = new Cookie(name,HY_JX_Coder.URLEncode((value)));
}else{
cookie = new Cookie(name,null);
}
cookie.setPath("/");
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
以上代码都在chain.doFilter(request, response);
之前,因此response.isCommitted()
此时都是为false;
经过一系列debug和分析,项目A和项目B此种问题的不同之处在于web.xml中四个filter的配置顺序不同;
项目A:XssFilter -> CharacterEncodingFilter -> LoginFilter -> CookieFilter
项目B:XssFilter -> CharacterEncodingFilter -> CookieFilter -> LoginFilter
经本地调试,当LoginFilter无论是在第一个、第二个还是第三个执行,都会导致cookie信息中过期时间不刷新,而仅仅在第四个执行时,过期时间才会刷新;
浏览器中cookie信息如下图:
最终原因:
导致LoginFilter在第一、二、三位置设置cookie过期时间不生效的原因,可归结到,后一个filter执行完后再返回到LoginFilter时,
response.isCommitted()
已经为**true**。
也即是后一个filter已经提交了response,导致在LoginFilter再提交response已经不生效了
调整项目A中web.xml中,将LoginFilter添加到最后
<filter-mapping></filter-mapping>
配置顺序的先后有关,最先配置的最先执行,依次类推;author:su1573
鄙人记录生活点滴,学习并分享,请多指教!!!
如需交流,请联系 sph1573@163.com,鄙人看到会及时回复
作者:我是一个射手
链接:http://www.javaheidong.com/blog/article/207682/3d986f90ebc9739e75c6/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!