记一次 response重定向后 cookie跨域失效以及解决办法
问题:
后端一个接口结束之后,需要对页面进行重定向,springboot项目,使用
response.sendRedirect("url")
但重定向完成后,页面从原先的host1:port/api(后端接口url)变成了前端页面地址host2:80/index,此时domain发生改变。
而上述接口,会往cookie写入user信息,目前在于在
HandlerInterceptor
中,判断用户是否登录。但domain改变之后,会cookie无效或者cookie不会服务端认同的情况。
HttpSession session = request.getSession();
//统一拦截(查询当前session是否存在user)(这里user会在每次登录成功后,写入session)
if (session.getAttribute(MgmConstants.SESSION_FLAG) != null) {
return Boolean.TRUE;
}
//抛出一个特定类型的异常
throw new AuthorizationFailException("认证失败");
上诉的session(我这里用的是spring session)中无任何attribute,拦截器判断为未登录。
实际上,该用户已经登录并创建session,,写入cookie到客户端了,目前逻辑不符合预期。
原因:
重定向时,发生了跨域,导致cookie失效,或者会出现写了cookie到浏览器,结果未看到的情况。如
应该是cookie的samesite限制所致,具体说明见:https://www.jianshu.com/p/687c1ffb0da4
解决办法:
分两个地方:
第一个,在config类中
@Bean
public DefaultCookieSerializer defaultCookieSerializer() {
DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
defaultCookieSerializer.setCookiePath("/");
//defaultCookieSerializer.setDomainName("你的ip地址");
defaultCookieSerializer.setSameSite(null);
return defaultCookieSerializer;
}
第二个,保证后端服务的域(协议+ip+port)与前端页面一致,问题来了,前端与后端不在一台机器上,怎么保持ip+port一致呢?通过如nginx之类代理工具,
将前端程序的api请求代理到后端机器上。如http://后端ip+port//api/sso/login proxy到http://前端ip+port/api/sso/login上,login接口完成后,重定向到http://前端ip+port//index上。
就无跨域问题了!
下一篇,给大家介绍mybatis框架中的@param注解作用


浙公网安备 33010602011771号