分析

既然需要动态获取那么只有两种方式:要么每次下游请求过来时从请求头中获取,要么定义统一的拦截器自动获取。

实现

那么我们就先来实现一下吧。

第一种比较简单,直接使用springboot获取请求头的方式,从controller方法入口处使用: @requestheader(value = “xxxx”,required = false) string appuser的方式获取请求头

代码如下:

@requestmapping(name = "获取用户详情信息",value = "/getuserdetail",method=get)
 
public string getuserdetail(@requestheader(value = "app-user",required = false) string appuser, @requestparam(name = "search") string search){       
 
    log.info("------>拿到的请求头是:"+appuser);    
 
    return "success";
 
}

此种方法虽然可以获取,但是太过low b,而且如果有几十个接口那么都要这么写,过于累赘

还是使用拦截器的方式吧

具体如下:

首先,定义一个拦截器,需要实现handlerinterceptor,其中包含prehandler以及aftercompletion分别对应调用前以及调用完成后

package com.xxxx.cc.admin.interceptor;
 
 
 
 
 
import com.alibaba.fastjson.jsonobject;
 
import com.ddmc.cc.admin.support.threadlocalutils;
 
import lombok.extern.slf4j.slf4j;
 
import org.apache.commons.lang.stringutils;
 
import org.springframework.stereotype.component;
 
import org.springframework.web.servlet.handlerinterceptor;
 
 
 
import javax.servlet.http.httpservletrequest;
 
import javax.servlet.http.httpservletresponse;
 
 
 
/**
* copyright (c), 2017-2021 
* author: sjugg
* date: 2021/5/19 10:39
* filename: authinterceptor
* description: 交易前置拦截器
*/
 
@component
 
@slf4j
 
public class authinfointerceptor implements handlerinterceptor {
 
 
 
    @override
 
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
 
        string userinfo = request.getheader("app-user");
 
        log.info(">>>>>>>拦截到api相关请求头<<<<<<<<"+userinfo);
 
        if(stringutils.isnotempty(userinfo)){
 
            //直接搂下来,放到threadlocal中 后续直接从中获取
 
           threadlocalutils.set(maicaiapiconstants.mai_cai_app_user,userinfo);
 
        }
 
        return true;//注意 这里必须是true否则请求将就此终止。
 
    }
 
 
    @override
 
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception {
 
        //移除app-user
 
        threadlocalutils.remove("app-user");
 
        log.info("移除请求头中的app-user:"+threadlocalutils.get("app-user"));
 
    }
 
}

后面只要从threadlocal中按key去拿就可以了。

另外需要做的是

添加web过滤器

1、添加web 过滤器,管理过滤的类,以及过滤的请求路径

2、继承webmvcconfigurationsupport 类 和上面一样generate,复写父类的方法 addinterceptors

3、通过registry.addinterceptor拦截类,addpathpatterns拦截路径,excludepathpatterns添加允许路径

这里我拦截的是以xxxx开头的请求。

package com.ddmc.cc.admin.config;
 
 
import com.ddmc.cc.admin.interceptor.authinfointerceptor;
 
import org.springframework.beans.factory.annotation.autowired;
 
import org.springframework.web.servlet.config.annotation.interceptorregistry;
 
import org.springframework.web.servlet.config.annotation.webmvcconfigurer;
 
 
 
/**
* 
*
* @author sjugg
* @since 2021/5/13 4:43 下午
*/
 
@configuration
 
public class webconfig implements webmvcconfigurer {
 
 
    @autowired
 
    private authinfointerceptor authinfointerceptor;
 
 
    @override
 
    public void addinterceptors(interceptorregistry registry) {
 
        registry.addinterceptor(authinfointerceptor).addpathpatterns("/xxxx/*");
 
    }
 
}

执行效果如下

请求头里设置app-user信息

 

可以看到controller中已经拿到请求头里的信息

获取head的代码:

@requestmapping(name = "获取用户详情信息",value = "/getuserdetail",method=get)
 
public string getuserdetail(@requestparam(name = "search") string search){
 
    log.info("-----> heard info here: "+threadlocalutils.get("app-user"));
 
    return "success";
}

方法执行完之后对应的threadlocal变量也被清除

 

到此这篇关于教你用springboot实现拦截器获取header内容的文章就介绍到这了,更多相关springboot获取header内容内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!