场景复现
在本地项目启动后,通过浏览器访问,查看浏览器中的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添加到最后
补充
- 在web.xml中多个过滤器的执行顺序与
<filter-mapping></filter-mapping>
配置顺序的先后有关,最先配置的最先执行,依次类推; - 经以上调试,tomcat中对web.xml中过滤器的执行顺序有要求,而weblogic对过滤器的执行顺序无要求,在weblogic容器中,无论LoginFilter在第几位执行,cookie信息的过期时间都会自动更新,对于这一点,还未深入研究,如有时间后续会在更新这一点。。。
author:su1573
鄙人记录生活点滴,学习并分享,请多指教!!!
如需交流,请联系 sph1573@163.com,鄙人看到会及时回复
最后
以上就是凶狠电话最近收集整理的关于javaweb项目多个过滤器设置cookie过期时间不生效的全部内容,更多相关javaweb项目多个过滤器设置cookie过期时间不生效内容请搜索靠谱客的其他文章。
发表评论 取消回复