Springboot通过过滤器实现对请求头的修改

简介: 之前在一个项目中有一个API服务需要重构,尤其是接口的用户身份校验,原先的实现是将用户token放在URL请求参数中,然后通过AOP进行校验,现在要统一将token放在header中,但是这样修改会让用户也相应的修改他们的客户端,为了使版本发布后不至于对用户的服务产生太大影响,所以我们不仅能通过he

Springboot通过过滤器实现对请求头的修改


之前在一个项目中有一个API服务需要重构,尤其是接口的用户身份校验,原先的实现是将用户token放在URL请求参数中,然后通过AOP进行校验,现在要统一将token放在header中,但是这样修改会让用户也相应的修改他们的客户端,为了使版本发布后不至于对用户的服务产生太大影响,所以我们不仅能通过header进行token校验,也要能通过URL参数进行token校验。


那么对于这个问题我们可以直接修改AOP,在里面增加获取URL参数的实现,但是这样做修改改了原有代码,我们本身初衷是给用户一个过渡的阶段,一旦用户对自己的服务做了修改,那么我们也就不需要在支持以前的形式了,所以我们可以写一个过滤器重写请求头的获取的实现,就可以解决这个问题了,当用户自己的服务都修改好之后,我们只需要删掉过滤器就可以了。


首先,我们要实现一个过滤器,并通过一个匿名类重写HttpServletRequestWrapper的 getHeader方法,代码如下:


import org.apache.commons.lang3.StringUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; import java.io.IOException;
/**
* Created by yangy-r on 2019/3/1. */
@WebFilter
public class AuthHeaderSettingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
    {
        HttpServletRequestWrapper requestWrapper = new 
        HttpServletRequestWrapper((HttpServletRequest) request) {
            /**
            * 当调用request.getHeader("token")时,则获取请求参数中token值并当做Header的值返回 * @param name
            * @return
            */
            @Override
            public String getHeader(String name) {
                // 先从原本的Request中获取头,如果为空且名字为token,则从参数中查找并返回
                String superHeader = super.getHeader(name);
                if("Authorization".equals(name) && StringUtils.isEmpty(superHeader)){
                    String token = request.getParameter("token"); 
                    if (StringUtils.isNotEmpty(token)) {
                        return token ; 
                    }
                }
                return superHeader; 
            }
        };
        chain.doFilter(requestWrapper,response); 
    }
    @Override
    public void destroy() { }
}


我们重写的getHeader方法的逻辑就是:


1、先获取指定的header;


2、如果是取的Authorization并且没有取到对应的数据,那么从URL的参数中获取token。


最后别忘了加入过滤器的配置类:


@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean modifyParametersFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean(); 
        registration.setFilter(new AuthHeaderSettingFilter()); 
        registration.addUrlPatterns("/*"); 
        registration.setName("authHeaderSettingFilter"); 
        registration.setOrder(1);
        return registration; 
    }
}


分类: JAVA

相关文章
|
3月前
|
Java 容器
如何在SpringBoot项目中使用过滤器和拦截器
过滤器和拦截器是日常开发中常用技术,用于对特定请求进行增强处理,如插入自定义代码以实现特定功能。过滤器在请求到达 `servlet` 前执行,而拦截器在请求到达 `servlet` 后执行。`SpringBoot` 中的拦截器依赖于 `SpringBoot` 容器,过滤器则由 `servlet` 提供。通过实现 `Filter` 接口并重写 `doFilter()` 方法可实现过滤器;通过实现 `HandlerInterceptor` 接口并重写相应方法可实现拦截器。两者的主要区别在于执行时机的不同,需根据具体场景选择使用。
198 4
如何在SpringBoot项目中使用过滤器和拦截器
|
7月前
|
Java Spring 容器
【二十二】springboot整合拦截器实战并对比过滤器
【二十二】springboot整合拦截器实战并对比过滤器
84 0
|
7月前
|
Java 数据库
SpringBoot中如何在过滤器中取get的参数值
SpringBoot中如何在过滤器中取get的参数值
204 0
|
4月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
278 0
|
2月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
40 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
6月前
|
Java API 数据安全/隐私保护
在Spring Boot中,过滤器(Filter)是一种非常有用的组件
在Spring Boot中,过滤器(Filter)是一种非常有用的组件
92 6
|
5月前
|
安全 Java Spring
Spring Boot中的自定义过滤器
Spring Boot中的自定义过滤器
|
6月前
|
安全 Java Spring
Spring Boot中的自定义过滤器
Spring Boot中的自定义过滤器
|
JSON 安全 Java
Spring Boot中的安全过滤器及使用方法
Spring Boot中的安全过滤器及使用方法
|
7月前
|
存储 前端开发 NoSQL
【二十一】springboot整合过滤器实战
【二十一】springboot整合过滤器实战
50 0