zuul 作为路由 filter校验token时需要向下游服务传递userId null值 的坑
@Override
public Object run() throws ZuulException {
// ThreadLocal
RequestContext ctx = RequestContext.getCurrentContext();
// 获取当前请求和返回值
HttpServletRequest request = ctx.getRequest();
HttpServletResponse response = ctx.getResponse();
// 1、验证Token有效性 -> 用户是否登录过
final String requestHeader = request.getHeader(jwtProperties.getHeader());
String authToken = null;
// Bearer header.payload.sign
if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
authToken = requestHeader.substring(7);
//TODO 验证token
// 验证通过把userId写入header
if(true){
/*注意 addZuulRequestHeader方法会把name强制转为小写
* userId 转为 userid 应直接全部使用小写 避免出现错误
*/
ctx.addZuulRequestHeader("userId", userId);
}
}
...
}
public class UserMemberController {
@Autowired
private HttpServletRequest request;
@RequestMapping(value = "", method = RequestMethod.GET)
public BaseResponseVO getPage() {
String userId = request.getHeader("userid");
...
}
}
addZuulRequestHeader方法会把name强制转为小写 下面是源码
public void addZuulRequestHeader(String name, String value) {
this.getZuulRequestHeaders().put(name.toLowerCase(), value);
}