本質上來說,request請求當中的參數是沒法更改的,也不能添加或者刪除。
但在後臺程序中,通常對request的參數的操做,都是經過request的getParameter、getParameterNames、getParameterValues等方法執行的;因此咱們要是能重寫這些方法,就從側面改變了request的請求參數。剛好,servlet就提供了一個HttpServletRequestWrapper類來供你們去繼承(該類是HttpServletRequest的封裝類),重寫request相關方法。java
這樣能夠修改好比shiro框架中的JSESSIONID,使單頁H5中調用接口時只須要在頭部添加在別處登陸以後拿到的jsessionid的值,就能保證是登陸狀態。web
具體服務端實現以下:spring
package webapp.conf; import org.apache.tomcat.util.http.MimeHeaders; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.*; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Field; import java.util.*; /** * 攔截器配置 */ @Configuration public class FilterConfig { @Bean public FilterRegistrationBean modifyParametersFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new ModifyParametersFilter()); registration.addUrlPatterns("/*"); // 攔截路徑 registration.setName("modifyParametersFilter"); // 攔截器名稱 registration.setOrder(1); // 順序 return registration; } /** * 自定義攔截器 */ class ModifyParametersFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 修改請求頭 Map<String, String> map = new HashMap<>(); modifyHeaders(map, request); // 修改cookie ModifyHttpServletRequestWrapper requestWrapper = new ModifyHttpServletRequestWrapper(request); String token = request.getHeader("token"); if (token != null && !"".equals(token)) { requestWrapper.putCookie("SHIROSESSIONID", token); } // finish filterChain.doFilter(requestWrapper, response); } } /** * 修改請求頭信息 * @param headerses * @param request */ private void modifyHeaders(Map<String, String> headerses, HttpServletRequest request) { if (headerses == null || headerses.isEmpty()) { return; } Class<? extends HttpServletRequest> requestClass = request.getClass(); try { Field request1 = requestClass.getDeclaredField("request"); request1.setAccessible(true); Object o = request1.get(request); Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest"); coyoteRequest.setAccessible(true); Object o1 = coyoteRequest.get(o); Field headers = o1.getClass().getDeclaredField("headers"); headers.setAccessible(true); MimeHeaders o2 = (MimeHeaders)headers.get(o1); for (Map.Entry<String, String> entry : headerses.entrySet()) { o2.removeHeader(entry.getKey()); o2.addValue(entry.getKey()).setString(entry.getValue()); } } catch (Exception e) { e.printStackTrace(); } } /** * 修改cookie信息 */ class ModifyHttpServletRequestWrapper extends HttpServletRequestWrapper { private Map<String, String> mapCookies; ModifyHttpServletRequestWrapper(HttpServletRequest request) { super(request); this.mapCookies = new HashMap<>(); } public void putCookie(String name, String value) { this.mapCookies.put(name, value); } public Cookie[] getCookies() { HttpServletRequest request = (HttpServletRequest) getRequest(); Cookie[] cookies = request.getCookies(); if (mapCookies == null || mapCookies.isEmpty()) { return cookies; } if (cookies == null || cookies.length == 0) { List<Cookie> cookieList = new LinkedList<>(); for (Map.Entry<String, String> entry : mapCookies.entrySet()) { String key = entry.getKey(); if (key != null && !"".equals(key)) { cookieList.add(new Cookie(key, entry.getValue())); } } if (cookieList.isEmpty()) { return cookies; } return cookieList.toArray(new Cookie[cookieList.size()]); } else { List<Cookie> cookieList = new ArrayList<>(Arrays.asList(cookies)); for (Map.Entry<String, String> entry : mapCookies.entrySet()) { String key = entry.getKey(); if (key != null && !"".equals(key)) { for (int i = 0; i < cookieList.size(); i++) { if(cookieList.get(i).getName().equals(key)){ cookieList.remove(i); } } cookieList.add(new Cookie(key, entry.getValue())); } } return cookieList.toArray(new Cookie[cookieList.size()]); } } } }