前言
项目是之前的老项目springmvc+jsp项目改的,因为需要对框架做改动,功能没有大改动,所以没有采用前后端分离的方式,后端采用springboot+spring security前端还是jsp,所以还是session验证的方式登录。但是整合好后测试发现问题,每次登录跳转到首页之后刷新页面又重定向到了login页面
问题解决
1、问题出现的原因
因为人比较懒,框架直接用之前前后端分离的项目,配置里面SecuityConfig也是延用前后端分离的配置,这样创建完就发现一个问题:每次请求后端接口的session都不一致,这时候刷新页面重新请求后台得到是新的session,系统判断没有登录就会重新跳转到login页面
在排查的时候发现Security的配置SecuityConfig里面有这一行:
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
这个是配置是session的生成策略,这个枚举类型,有几个类型,点击去查看
其中:
ALWAYS
总是创建HttpSession
IF_REQUIRED
Spring Security只会在需要时创建一个HttpSession
NEVER
Spring Security不会创建HttpSession,但如果它已经存在,将可以使用HttpSession
STATELESS
Spring Security永远不会创建HttpSession,它不会使用HttpSession来获取SecurityContext
问题就出在这里,我们的前端是jsp验证需要用session验证的方式,这样的配置session生成策略是STATELESS,就是不生成session,这样的配置还是之前前后端分离的配置,用在这里就不对了。
2、问题解决
咱们需要把生成session的策略改成ALWAYS,用session的方式验证。
将这个配置改成如下:
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.ALWAYS);
测试问题解决!
3、其他问题记录:
接口请求POST返回403,通过查阅资料,Security采用的CSRF(Cross-site request forgery跨站请求伪造)默认支持的方法: GET|HEAD|TRACE|OPTIONS,不支持POST。
需要在security在配置中禁用掉它。加如下配置:
.and().csrf().disable()
3、总结
其实是因为自己懒直接用之前的前后端分离的配置导致的,还有SpringSecurity有些配置还是需要了解他是做什么的,不然后面遇到其他问题也不知为什么。
这里就记录一下:
.cors()是开启跨域; .csrf().disable() 是禁用使用跨站请求,可解决POST请求403问题; .sessionManagement().sessionCreationPolicy(X)是session的生成策略,前后端分离的时候配置成STATELESS,非前后端分离的需要配置成ALWAYS
原创不易,转载请注明出处!