一、未登录
当用户请求受保护的接口时,要先判断用户是否处于登录状态,未登录踢回登录页面,使用重定向使用户处在登陆页面。
重定向两个重要的参数:重定向状态码,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);
}