记一次 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注解作用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具