那么對於這個問題我們可以直接修改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;
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; } }
