最近在做的一个java web项目,要求登录界面信息提交时使用https,登录成功后页面使用http,同时全站使用csrf防御。
然后https和http的访问会分别创建两个session,csrf的token存在于https创建的session中,当验证用户身份通过后,跳转到http进入时,新建的session中没有csrfToken,因此被403拒绝访问。
解决方法为:在身份验证成功后,跳转页面的action中加入
Cookie nck = new Cookie("JSESSIONID",request.getSession().getId());
nck.setPath("/");
nck.setSecure(true);
response.addCookie(nck);这样就可以保证跳转前后的session保持一致了。
但新的需求又来了:在某些action处理过程中,需要更新session id,可以参考《spring security 集成csrf与会话更新》,也可以修改spring security源码。
spring security的CsrfFilter.java文件中,在filterChain执行完回调后,再添加一次token到session中即可:
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {

在Java Web项目中,配置Spring Security启用CSRF防御时,遇到HTTPS与HTTP切换导致的session问题。当用户身份验证成功并跳转到HTTP时,由于session变化,新的session缺少CSRF Token引发403错误。解决方案是在验证成功后的跳转action中更新session。此外,为应对session ID更新需求,可能需要修改Spring Security源码,确保在filterChain执行后重新添加CSRF Token到session。
最低0.47元/天 解锁文章
8490

被折叠的 条评论
为什么被折叠?



