关于spring cloud遇到问题(三)-feign-session丢失
feign-session丢失
昨天把spring session与redis实现session共享完成了,本来以为session应该没有问题了,今天使用feign远程调用时发现session不一样。使用feign调用某个远程API,这个远程API需要传递一个鉴权信息,我们可以把cookie里面的session信息放到Header里面,这个Header是动态的,跟你的HttpRequest相关,我们选择编写一个拦截器来实现Header的传递,也就是需要实现RequestInterceptor接口
@Configuration
@EnableFeignClients
public class FeignRequestIntercepter implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
//通过RequestContextHolder获取本地请求
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes == null) {
return;
}
//获取本地线程绑定的请求对象
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
System.out.println("=session-id: "+request.getSession().getId());
//给请求模板附加本地线程头部信息,主要是cookie信息
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
Enumeration<String> values = request.getHeaders(name);
while (values.hasMoreElements()) {
String value = values.nextElement();
template.header(name, value);
}
}
}
}
}
由于我现在还没有使用Hystrix熔断,所以配置这个接口就🆗了这时候session已经弄好了。
redis存对象
在使用过程中发现我如果是要spring session存对象时,根据拦截器发现session又不一样了,但也存到session中了,当你在用getAttribute获取对象时候,报了给反系列化的问题.而且主要我那个对象还在redis里面,就会一直报错,什么页面都访问不了,这时候使用redis-cli登录,使用FLUSHALL全部删除。
那我们要怎么存对象呢,有一个简单的方法,就是转成字符串获取出来后再转成对象
首先引入fastjson包,转化我们要用到JSON
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>
居然有A 和 B,A中setAttribute() B中gettAttribute
//A如下
//创建request
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
//已有对象member
//创建httpSession
HttpSession session = request.getSession();
//将member对象转成字符串
String memberStr = JSON.toJSONString(member);
//将数据加到redis
session.setAttribute("member",memberStr);
//B如下
//创建request
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
//创建httpSession
HttpSession session = request.getSession();
//获取数据并转成字符串
String memberStr = session.getAttribute("member").toString();
//使用JSON.parseObject()方法将memberStr转成member对象
Member member = JSON.parseObject(memberStr, Member.class);
再这里问一下技术大牛,我用了session+redis后网页打开的特别慢,是因为我redis是装在阿里云上面因为网络的问题吗?我网络确实挺慢的…谢谢