首页 > 其他分享 >记一次 response重定向后 cookie跨域失效以及解决办法

记一次 response重定向后 cookie跨域失效以及解决办法

时间:2023-02-23 19:11:34浏览次数:49  
标签:10.100 重定向 defaultCookieSerializer session cookie response 跨域

问题:

后端一个接口结束之后,需要对页面进行重定向,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

相关文章

  • SpringBoot解决跨域方案
    SpringBoot解决跨域的几种方式跨域资源共享(CORS):通过修改Http协议header的方式,实现跨域。说的简单点就是,通过设置HTTP的响应头信息,告知浏览器哪些情况在不符合同源策略的条......
  • 测试公开课资料系列01--Fiddler之AutoResponse在线调试利器
     前言做的技艺来自做的过程。明天晚上,笔者在腾讯课堂开播一堂Fiddler实战公开课,嗯~先预先筹备一些课堂资料给大家来分享一、Fiddler在线调试介绍Fiddler在线调试-->Fid......
  • cookie,session,token,drf-jwt
    1.cookie,session,token发展史引入:我们都知道http协议本身是一种无状态的协议,一个普通的http请求简单分为三步:客户端发送请求request服务端收到请求并进行处理服务端将结......
  • 怎样解决跨域?
    跨域的原因跨域是是因为浏览器的同源策略限制,是浏览器的一种安全机制,服务端之间是不存在跨域的。所谓同源指的是两个页面具有相同的协议、主机和端口,三者有任一不相......
  • django-drf跨域
    django使用django-cors-headers解决跨域问题1、使用pip安装pipinstalldjango-cors-headers2、添加到setting的app中INSTALLED_APPS=( ... 'corsheaders', ........
  • 第十三天笔记Cookie
    第十三天笔记Cookie计算机重要的四个内容数据结构数据存储的结构及逻辑的体现,以及相关数据结构之间的操作(算法)操作系统windows(dos命令)、linux(指令操作)计网网......
  • 开发日志02-解决`response`和SpringAop层相关冲突报错问题
    解决一个Bug在昨晚的开发中遇到了一个非常令人头疼的Bugjava.lang.IllegalStateException:getOutputStream()hasalreadybeencalledforthisresponse报错信息如下......
  • 在不修改代码情况下解决 Chrome 浏览器跨域
    前言:    在前后台分离的项目,跨域是经常遇到的问题了。是实际解决方案中,大部分采用服务端配置,而如果只是调试,可以通过配置Chrome浏览器实现跨域,以下以NodeJs服......
  • JMeter报Non HTTP response message: Address already in use: connect错误问题
    场景:用JMeter做压力测试的时候,一段时间后AggregateReport报告里的错误率就一直上升,查看ViewResultsTree报告时发现报如下错误:Responsecode:NonHTTPresponsecode:j......
  • Jmeter压测报错记录(Non HTTP response code: java.net.SocketException)
    报错Responsecode:NonHTTPresponsecode:java.net.SocketExceptionResponsemessage:NonHTTPresponsemessage:Socketclosed模拟200个用户访问,可以正常执行 ......