最近在做的一个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 doFil