未登录踢回登录页面及用户id穿透

一、未登录

        当用户请求受保护的接口时,要先判断用户是否处于登录状态,未登录踢回登录页面,使用重定向使用户处在登陆页面。

        重定向两个重要的参数:重定向状态码,302.  重定向url,登陆页面url

注意重定向的时候需要保存原始的请求地址,以便登录成功后直接反返回原始的请求地址.

    //重定向方法
    private Mono<Void> locationUrl(ServerWebExchange exchange) {
        //获取原始请求的地址,登录成功后直接跳转到原始的请求地址
        String path = exchange.getRequest().getURI().toString();
        ServerHttpResponse httpResponse = exchange.getResponse();
        //重定向状态码 302
        httpResponse.setStatusCode(HttpStatus.FOUND);
        //重定向地址
        httpResponse.getHeaders().set("Location", authUrlProperties.getLoginPageUrl()+"?originUrl=" + path);

        return httpResponse.setComplete();
    }

二、用户id穿透

        让购物车模块使用用户id来存储相应用户的订单,或者其他微服务模块可能使用用户id。

解决方案:

        方案一:在每一个微服务中获取单独获取Cookie中的token或者header中的token,然后根据token从Redis中查询用户数据得到用户id

        方案二:在网关中统一获取token,统一查询Redis获取用户id,并且进行id透传

实现思路:构建一个新的request对象,然后把用户id存入请求头中,放行的时候使用新的请求对象

 

    private void userIdThrought(ServerWebExchange exchange, GatewayFilterChain chain, UserInfo userInfo) {
        /**
         * 实现思路:构建一个新的request对象,然后把用户id存入请求头中,放行的时候使用新的请求对象
         */
        //获取用户id
        Long userInfoId = userInfo.getId();
        //获取请求对象
        ServerHttpRequest httpRequest = exchange.getRequest();
        //构建新的请求头对象把用户id放进去
        ServerHttpRequest serverHttpRequest = httpRequest.mutate().header("userId", userInfoId.toString()).build();

        //构建新的exchange对象并封装request对象(一般封装request和response对象,response对象使用原来的就行)
        ServerWebExchange serverWebExchange = exchange.mutate().request(serverHttpRequest).response(exchange.getResponse()).build();
        //放行
        chain.filter(serverWebExchange);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值