前言
" 部署测试,部署预发布,一切测试就绪,上生产。
发布生产
闪退
What???
马上回滚
开始排查
后端一模一样的代码,不是 APP 端的问题吧。可 APP 端没有发版啊。
…… 一番排查
原来是 APP 端打包,测试和预发布包 Header 传的都是 Authorization ,生产传的是 authorization 。就是大小写问题,那赶紧改。 "
1
背景
首页接口只有登录才可以进入,因为首页要展示获取用户账户的一些信息。这里使用的是统一拦截,从 Header 中获取 token 后,使用 token 获取用户信息。
而现在要改为用户未登录也可以查看首页信息中的宣传文案等等,只不过账户信息不显示。
原流程
整个过程代码在 ThreadLocal 底层原理 里面有所介绍。这里省略一部分代码。
@Componentpublic class TokenInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { LocalUserUtils.remove(); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 请求方法是否存在注解 boolean assignableFrom = handler.getClass().isAssignableFrom(HandlerMethod.class); if (!assignableFrom) { return true; } CheckToken checkToken = null; if (handler instanceof HandlerMethod) { checkToken = ((HandlerMethod) handler).getMethodAnnotation(CheckToken.class); } // 没有加注解 直接放过 if (checkToken == null) { return true; } // 从Header中获取Authorization String authorization = request.getHeader("Authorization"); log.info("header authorization : {}", authorization); if (StringUtils.isBlank(authorization)) { log.error("从Header中获取Authorization失败"); throw CustomExceptionEnum.NOT_HAVE_TOKEN.throwCustomException(); } // 其他代码省略 return true; }}
从代码中可以看出这里大概过程如下:
- 是使用拦截器拦截请求
- 如果方法没有 CheckToken 注解直接放过
- 有 CheckToken 注解,则从 request 的 header 中获取 Authorization
新需求
这里想到只需要把注解去掉,然后从请求参数中获取 token 即可。获取到走原逻辑,获取不到则只返回宣传文案等信息。
2
从 Header 中获取信息
直接获取请求头某一个 headerName
@PostMapping("/getAuthorizationByKey")public String getAuthorizationByKey(@RequestHeader("Authorization") String authorization) { log.info("获取 Authorization --->{}", authorization); return authorization;}
使用 Map 获取所有请求头
@PostMapping("/getAuthorizationByMap")public String getAuthorizationByMap(@RequestHeader Map map) { String authorization = map.get("Authorization"); log.info("获取 Authorization --->{}", authorization); return authorization;}