记一次 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注解作用

posted @   用不完的小神  阅读(3842)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示