IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Springboot实现拦截器获取header内容 -> 正文阅读

[网络协议]Springboot实现拦截器获取header内容

1、利用注解

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

    @ApiOperation(value = "特定用户的租户分页", notes = "特定用户的租户分页")
    @GetMapping(value = "/queryByUserName")
    public Response queryByUserName(/*@RequestHeader Map<String, String> headers*/
                                    @RequestHeader(value = "user",required = false) String user,
                                    @RequestParam("pageNum") Integer pageNum,
                                    @RequestParam("pageSize") Integer pageSize
                                   ) {

     
        log.info("------>拿到的请求头是:"+user);
        JSONObject jsonObject = JSONObject.parseObject(user);
        String userName= (String)jsonObject.get("user_name");
        // sun_13989882379
        log.debug(userName+ "");
       
        Page<TenantPO> pageInfo = tenantServiceFeign.selectByUserName(pageNum,pageSize,userName);
        return Response.ok(PageOut.build(pageInfo, TenantDto.class));
    }

可以利用下面的方式获取所有的请求头:

 @ApiOperation(value = "特定用户的租户分页", notes = "特定用户的租户分页")
    @GetMapping(value = "/queryByUserName")
    public Response queryByUserName(@RequestHeader Map<String, String> headers,
                                    @RequestParam("pageNum") Integer pageNum,
                                    @RequestParam("pageSize") Integer pageSize
                                   ) {
       headers.forEach((key, value) -> {
            // 日志中输出所有请求头
            // Header 'user' = {"JWT_USER_ID_":1,"user_name":"sunj_13989882379","scope":["all"],"exp":1634643867,"JWT_USER_NAME_":"sunj_13989882379",
            // "jti":"e24ef65b-8302-41d3-91f3-2f92366d51fe","client_id":"clientapp"}
            log.debug(String.format("Header '%s' = %s", key, value));
        });
        
        Page<TenantPO> pageInfo = tenantServiceFeign.selectByUserName(pageNum,pageSize,userName);
        return Response.ok(PageOut.build(pageInfo, TenantDto.class));
    }

2、使用拦截器

如果有几十个接口那么都要使用注解写,过于累赘,可以使用拦截器进行开发,代码如下。

(1)声明 上下文

/**
 * 规定所有的Http头中必须携带Token 来验证用户身份,采用在拦截器用户名信息绑定到ThreadLocal,以供后续方法使用
 * 声明 上下文
 */
public class RequestHeaderContext {

    private static final ThreadLocal<RequestHeaderContext> REQUEST_HEADER_CONTEXT_THREAD_LOCAL=new ThreadLocal<>();
    private String userName;
   // private String token;

    public String getUserName() {
        return userName;
    }

    /*public String getToken() {
        return token;
    }*/

    public static RequestHeaderContext getInstance(){
        return REQUEST_HEADER_CONTEXT_THREAD_LOCAL.get();
    }

    public void setContext(RequestHeaderContext context){
        REQUEST_HEADER_CONTEXT_THREAD_LOCAL.set(context);
    }

    public static void clean(){
        REQUEST_HEADER_CONTEXT_THREAD_LOCAL.remove();
    }

    private RequestHeaderContext(RequestHeaderContextBuild requestHeaderContextBuild){
        this.userName=requestHeaderContextBuild.userName;
        // this.token=requestHeaderContextBuild.token;
        setContext(this);
    }

    public static class RequestHeaderContextBuild{
        private String userName;
        // private String token;

        public RequestHeaderContextBuild userName(String userName){
            this.userName=userName;
            return this;
        }

        /*public RequestHeaderContextBuild token(String token){
            this.token=token;
            return this;
        }*/
        public RequestHeaderContext bulid(){
            return new RequestHeaderContext(this);
        }
    }
}

(2)声明拦截器

/**
 * 声明拦截器
 */
@Slf4j
public class RequestHeaderContextInterceptor extends HandlerInterceptorAdapter {
    // private static final String HEAD_USER_NAME = "user_name";
    private static final String HEAD_TOKEN = "token";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        initHeaderContext(request);
        return super.preHandle(request, response, handler);
    }

    private void initHeaderContext(HttpServletRequest request){

        String userInfo = request.getHeader("user");
        log.info(">>>>>>>拦截到api相关请求头<<<<<<<<"+userInfo);

        JSONObject jsonObject = JSONObject.parseObject(userInfo);
        String user_name = (String) jsonObject.get("user_name");

        new RequestHeaderContext.RequestHeaderContextBuild()
                //.token(request.getHeader(HEAD_TOKEN))
                .userName(user_name)
                .bulid();
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        RequestHeaderContext.clean();
        super.postHandle(request, response, handler, modelAndView);
    }
}

(3)绑定拦截器

/**
 * 绑定拦截器
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Bean
    public HandlerInterceptor requestHeaderContextInterceptor() {
        return new RequestHeaderContextInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(requestHeaderContextInterceptor()).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

(4)使用

@ApiOperation(value = "特定用户的租户分页", notes = "特定用户的租户分页")
    @GetMapping(value = "/queryByUserName")
    public Response queryByUserName(
                                    @RequestParam("pageNum") Integer pageNum,
                                    @RequestParam("pageSize") Integer pageSize
                                   ) {

        String userName = RequestHeaderContext.getInstance().getUserName();
        log.debug( "user_name ---> " + RequestHeaderContext.getInstance().getUserName());

        // 此租户的分页查询是查询所有的租户,而不是查询一个用户下关联的租户
        // 需要先根据用户名,筛选出相关的租户id,然后根据租户id得到租户的信息
        Page<TenantPO> pageInfo = tenantServiceFeign.selectByUserName(pageNum,pageSize,userName);
        return Response.ok(PageOut.build(pageInfo, TenantDto.class));
    }
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:51:43  更:2021-10-20 12:53:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/1 21:50:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码