网站建设费用怎么做分录,如何获取永久免费域名,个人创业怎样开公司,ds2600ii色带由浏览器发送后台请求会携带cookie#xff0c;在后台服务中会通过拦截器拦截到请求#xff0c;并通过session来获取当前用户是否登录#xff0c;即便httpsession是springSession实现分布式session共享#xff0c;它通过对request和response和session的包装类实现了自己的se…由浏览器发送后台请求会携带cookie在后台服务中会通过拦截器拦截到请求并通过session来获取当前用户是否登录即便httpsession是springSession实现分布式session共享它通过对request和response和session的包装类实现了自己的session存储流程对原有的使用不受影响把seession存储到redis中通过浏览器发送请求共享登录数据没有问题当后端模块依赖其他模块同样方式访问open feign构建的request是没有提供请求头的信息也没有携带cookie信息这导致本来已经登录的用户去访问其他服务获取到当前用户登录的购物车解果是拦截器的prehandler并没有获取到redis中的session也获取不到当前用户的购物车中的购物项这是远程调用构造请求时默认不会携带cookie导致。
解决:在feign调用远程服务时构建了request Template然后会调用拦截器对该模板设置属性我们自定义指定拦截器让它在远程调用时发生作用设置上请求头参数。流程如下第一次请求到静态页面地址时在请求函数中接受浏览器有效的session他会把session的属性在当前线程环境中继续向下传并在有效的会话间保留到服务当静态页面获取数据时当前线程的请求发起远程调用后端在发起远程feign构建请求后没有携带当前浏览器端的cookie通过自定义拦截器设置feign构建的请求头的信息我们实现拦截器重写apply方法在当前方法中接收浏览器请求的方法中的httpServletRequest参数他会在此线程上下文中共享在拦截器中使用request contextholder.getRequestAttributes()把他转为servletRequestAttributes然后获取到上一步骤的请求对象gitRequest最终获取到完整信息的请求头Request Context holder实现原理是threadlocal获取到前端的有效请求后获取cookie把他设置到新的请求中那么远程调用服务时被他的拦截器拦截验证远程已经登录返回正确信息。