1. 程式人生 > >springboot專案使用攔截器修改/新增前端傳輸到後臺header的Cookie引數

springboot專案使用攔截器修改/新增前端傳輸到後臺header的Cookie引數

  本質上來講,request請求當中的引數是無法更改的,也不能新增或者刪除。
  但在後臺程式中,一般對request的引數的操作,都是通過request的getParameter、getParameterNames、getParameterValues等方法執行的;所以我們要是能重寫這些方法,就從側面改變了request的請求引數。恰好,servlet就提供了一個HttpServletRequestWrapper類來供大家去繼承(該類是HttpServletRequest的封裝類),重寫request相關方法。

這樣可以修改比如shiro框架中的JSESSIONID,使單頁H5中呼叫介面時只需要在頭部新增在別處登入之後拿到的jsessionid的值,就能保證是登入狀態。

       headers: {
            "token":"JSESSIONID=xxxx"
        }

具體服務端實現如下:

package webapp.conf;

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.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 { ModifyHttpServletRequestWrapper requestWrapper = new ModifyHttpServletRequestWrapper(request); filterChain.doFilter(requestWrapper, response); } } /** * cookie配置 */ class ModifyHttpServletRequestWrapper extends HttpServletRequestWrapper { ModifyHttpServletRequestWrapper(HttpServletRequest request) { super(request); } // 設定/更新自定義cookie public Cookie[] getCookies() { HttpServletRequest request = (HttpServletRequest) getRequest(); // 獲取前端頭部傳輸的token String token = request.getHeader("token"); Cookie[] cookies = request.getCookies(); if (token != null && !"".equals(token)) { Cookie jCookie = new Cookie("JSESSIONID", token); if (cookies == null || cookies.length == 0) { cookies = new Cookie[]{jCookie}; return cookies; } else { List<Cookie> cookieList = new ArrayList<>(Arrays.asList(cookies)); cookieList.add(jCookie); Cookie[] modifyCookies = new Cookie[cookies.length + 1]; for (int i = 0; i < cookieList.size(); i++) { modifyCookies[i] = cookieList.get(i); } return modifyCookies; } } return cookies; } } }

上面的JSESSIONID為cookie的key,可以自行設定。