教你用Springboot实现拦截器获取header内容

 更新时间:2021年5月22日 10:01  点击:2023

分析

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

实现

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

第一种比较简单,直接使用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内容内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • 解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题

    这篇文章主要介绍了解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-28
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • 详解springBoot启动时找不到或无法加载主类解决办法

    这篇文章主要介绍了详解springBoot启动时找不到或无法加载主类解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-16
  • SpringBoot集成Redis实现消息队列的方法

    这篇文章主要介绍了SpringBoot集成Redis实现消息队列的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
  • 解决Springboot get请求是参数过长的情况

    这篇文章主要介绍了解决Springboot get请求是参数过长的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-17
  • Spring Boot项目@RestController使用重定向redirect方式

    这篇文章主要介绍了Spring Boot项目@RestController使用重定向redirect方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-02
  • Springboot+TCP监听服务器搭建过程图解

    这篇文章主要介绍了Springboot+TCP监听服务器搭建过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-28
  • springBoot 项目排除数据库启动方式

    这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
  • 详解SpringBoot之访问静态资源(webapp...)

    这篇文章主要介绍了详解SpringBoot之访问静态资源(webapp...),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-14
  • SpringBoot接口接收json参数解析

    这篇文章主要介绍了SpringBoot接口接收json参数解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-19
  • springboot中使用@Transactional注解事物不生效的坑

    这篇文章主要介绍了springboot中使用@Transactional注解事物不生效的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-26
  • springboot多模块包扫描问题的解决方法

    这篇文章主要介绍了springboot多模块包扫描问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-16
  • Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用详解

    这篇文章主要介绍了Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-18
  • Springboot+MDC+traceId日志中打印唯一traceId

    本文主要介绍了Springboot+MDC+traceId日志中打印唯一traceId,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-17
  • Springboot实现多线程注入bean的工具类操作

    这篇文章主要介绍了Springboot实现多线程注入bean的工具类操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-27
  • SpringBoot部署到Linux读取resources下的文件及遇到的坑

    本文主要给大家介绍SpringBoot部署到Linux读取resources下的文件,在平时业务开发过程中,很多朋友在获取到文件内容乱码或者文件读取不到的问题,今天给大家分享小编遇到的坑及处理方案,感兴趣的朋友跟随小编一起看看吧...2021-06-21
  • 关于springboot中nacos动态路由的配置

    这篇文章主要介绍了springboot中nacos动态路由的配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • SpringBoot高版本修改为低版本时测试类报错的解决方案

    这篇文章主要介绍了SpringBoot高版本修改为低版本时测试类报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-18
  • 解决Springboot整合shiro时静态资源被拦截的问题

    这篇文章主要介绍了解决Springboot整合shiro时静态资源被拦截的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-26
  • 详解SpringBoot读取配置文件的N种方法

    这篇文章主要介绍了详解SpringBoot读取配置文件的N种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10