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; 
    }
}

 

 

 


免責聲明!

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



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