java获取authorization_作为开发:从 Header 获取数据这个坑你必须了解一下

本文讲述了在生产环境中因APP端Header的Authorization字段大小写问题导致服务闪退,进而深入研究不同容器(如Tomcat、Undertow、Jetty)对Header处理方式的差异,以及如何正确从Header中获取Authorization信息。
摘要由CSDN通过智能技术生成
7334b13f8a9e40ae93512e51167df83d

前言

" 部署测试,部署预发布,一切测试就绪,上生产。

发布生产

闪退

What???

马上回滚

开始排查

后端一模一样的代码,不是 APP 端的问题吧。可 APP 端没有发版啊。

…… 一番排查

原来是 APP 端打包,测试和预发布包 Header 传的都是 Authorization ,生产传的是 authorization 。就是大小写问题,那赶紧改。 "

1

背景

首页接口只有登录才可以进入,因为首页要展示获取用户账户的一些信息。这里使用的是统一拦截,从 Header 中获取 token 后,使用 token 获取用户信息。

而现在要改为用户未登录也可以查看首页信息中的宣传文案等等,只不过账户信息不显示。

原流程

607ba3d0297142fa809d67f2bc82f784

整个过程代码在 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;    }}

从代码中可以看出这里大概过程如下:

  1. 是使用拦截器拦截请求
  2. 如果方法没有 CheckToken 注解直接放过
  3. 有 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;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值