HttpServletRequest + Filter 添加 header


HttpServletRequest + Filter 添加 header

Filter 能夠獲得 HttpServletRequest 暴露的接口,但由於 HttpServletRequets 沒有 setter方法,因此HttpServletRequest 是只可讀的。但很多情況需要往HttpServletRequset 添加 header 參數,例如 tokenuserId

1、自定義配置類

配置類繼承 HttpServletRequestWrapper

public class CustomHttpServletRequest extends HttpServletRequestWrapper {
    private final Map<String, String> hashMap;

    /**
     * 初始化
     *
     * @param request
     */
    public CustomHttpServletRequest(HttpServletRequest request) {
        super(request);
        hashMap = new HashMap<>();
    }

    /**
     * 添加key、value
     *
     * @param key
     * @param value
     */
    public void addHeader(String key, String value) {
        hashMap.put(key, value);
    }

    /**
     * 獲得value
     *
     * @param key
     * @return
     */
    @Override
    public String getHeader(String key) {
        String value = super.getHeader(key);
        if (value == null) {
            value = hashMap.get(key);
        }
        return value;
    }

    /**
     * 獲得value集合
     *
     * @param key
     * @return
     */
    @Override
    public Enumeration<String> getHeaders(String key) {
        Enumeration<String> enumeration = super.getHeaders(key);
        List<String> valueList = Collections.list(enumeration);
        if (hashMap.containsKey(key)) {
            valueList.add(hashMap.get(key));
        }
        return Collections.enumeration(valueList);
    }
    
    /**
     * 獲得key集合
     *
     * @return
     */
    @Override
    public Enumeration<String> getHeaderNames(){
        List<String> keyList = Collections.list(super.getHeaderNames());
        keyList.addAll(hashMap.keySet());
        return Collections.enumeration(keyList);
    }
}

2、Filter

Filter 調用配置類對象並添加 header

@WebFilter(filterName = "AccessFilter", urlPatterns = "/*")
@Order(1)
public class AccessFilter implements Filter {
    Logger logger = LoggerFactory.getLogger(AccessFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        CustomHttpServletRequest customHttpServletRequest = new CustomHttpServletRequest(request);
        //添加header
        customHttpServletRequest.addHeader("test", "123");
        filterChain.doFilter(customHttpServletRequest, servletResponse);
    }

    @Override
    public void destroy() {
    }

啟動類添加 ServletComponentScan注解

@MapperScan({"com.lin.mapper"})
@SpringBootApplication
@EnableTransactionManagement
@ServletComponentScan
public class MybatisPlusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}

3、測試

調用接口進行測試

@GetMapping(value = "/findById")
@ResponseBody
public Result findById(@RequestParam(value = "id", required = true, defaultValue = "2") Long id,
                       HttpServletRequest request) {
    User user = userService.findById(id);
    logger.info("===========" + request.getHeader("test") + "==========");
    return ResultUtil.success(user);
}

打印出結果:

INFO 13880 --- [nio-8080-exec-2] com.lin.controller.UserController        : ===========123==========

總結:自定義配置類繼承 HttpServletRequestWrapper,Filter 調用配置類並添加 header, 接口通過 getheader 方法獲得已添加的 header。

參考資料:HttpServletRequest添加header


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM