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

场景复现

在本地项目启动后,通过浏览器访问,查看浏览器中的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,鄙人看到会及时回复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ssy03092919

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值