feign-session丢失

关于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是装在阿里云上面因为网络的问题吗?我网络确实挺慢的…谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值