问题:
后端一个接口结束之后,需要对页面进行重定向,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("10.100.20.140"); defaultCookieSerializer.setSameSite(null); return defaultCookieSerializer; }
第二个,保证后端服务的域(协议+ip+port)与前端页面一致,问题来了,前端与后端不在一台机器上,怎么保持ip+port一致呢?通过如nginx之类代理工具,
将前端程序的api请求代理到后端机器上。如http://10.100.20.66:8080/api/sso/login proxy到http://10.100.20.140:8080/api/sso/login上,login接口完成后,重定向到http://10.100.20.140:8080/index上。
就无跨域问题了!
下一篇,给大家介绍mybatis框架中的@param注解作用
标签:10.100,重定向,defaultCookieSerializer,session,cookie,response,跨域 From: https://www.cnblogs.com/ask-answer/p/17149109.html