本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(2)

javaweb项目多个过滤器设置cookie过期时间不生效

发布于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类似,项目Btomcat容器中部署启动后,在浏览器中访问后,查看浏览器中的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添加到最后


补充

  1. 在web.xml中多个过滤器的执行顺序与<filter-mapping></filter-mapping>配置顺序的先后有关,最先配置的最先执行,依次类推;
  2. 经以上调试,tomcat中对web.xml中过滤器的执行顺序有要求,而weblogic对过滤器的执行顺序无要求,在weblogic容器中,无论LoginFilter在第几位执行,cookie信息的过期时间都会自动更新,对于这一点,还未深入研究,如有时间后续会在更新这一点。。。

author:su1573
鄙人记录生活点滴,学习并分享,请多指教!!!
如需交流,请联系 sph1573@163.com,鄙人看到会及时回复



所属网站分类: 技术文章 > 博客

作者:我是一个射手

链接:http://www.javaheidong.com/blog/article/207682/3d986f90ebc9739e75c6/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)