Spring中將header頭轉換爲參數

項目中遇到一類請求,全部的請求都會將請求參數放在header頭中,每一個接口都須要單獨處理,所以考慮作一層封裝,統一進行轉換。java

基本思路是增長一個攔截器,由攔截器對請求頭進行解析,並轉換爲參數web

首先集成一個HttpServletRequestWrapper,使得當前請求持有全部的參數表spring

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

public class ParameterRequestWrapper extends HttpServletRequestWrapper {

  private Map<String, String[]> params = new HashMap<>();

  /**
   * Constructs a request object wrapping the given request.
   *
   * @param request
   * @throws IllegalArgumentException if the request is null
   */
  public ParameterRequestWrapper(HttpServletRequest request) {
    super(request);
    //將參數表,賦予給當前的Map以便於持有request中的參數
    this.params.putAll(request.getParameterMap());
  }

  /**
   * 重載構造方法
   */

  public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
    this(request);
    //這裏將擴展參數寫入參數表
    addAllParameters(extendParams);
  }

  /**
   * 在獲取全部的參數名,必須重寫此方法,不然對象中參數值映射不上
   *
   * @return
   */
  @Override
  public Enumeration<String> getParameterNames() {
    return new Vector(params.keySet()).elements();
  }

  /**
   * 重寫getParameter方法
   *
   * @param name 參數名
   * @return 返回參數值
   */
  @Override
  public String getParameter(String name) {
    String[] values = params.get(name);
    if (values == null || values.length == 0) {
      return null;
    }
    return values[0];
  }

  @Override
  public String[] getParameterValues(String name) {
    String[] values = params.get(name);
    if (values == null || values.length == 0) {
      return null;
    }
    return values;
  }

  /**
   * 增長多個參數
   *
   * @param otherParams 增長的多個參數
   */
  public void addAllParameters(Map<String, Object> otherParams) {
    for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
      addParameter(entry.getKey(), entry.getValue());
    }
  }

  /**
   * 增長參數
   *
   * @param name  參數名
   * @param value 參數值
   */
  public void addParameter(String name, Object value) {
    if (value != null) {
      if (value instanceof String[]) {
        params.put(name, (String[]) value);
      } else if (value instanceof String) {
        params.put(name, new String[]{(String) value});
      } else {
        params.put(name, new String[]{String.valueOf(value)});
      }
    }
  }
}
複製代碼

其次,集成一個Filterapache

import app.config.ParameterRequestWrapper;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Component
public class ParamFilter extends OncePerRequestFilter {

 


  private final SiteUidRelatedUtils uidRelatedUtils;

  @Autowired
  public ParamFilter(SiteUidRelatedUtils uidRelatedUtils) {
    this.uidRelatedUtils = uidRelatedUtils;
  }


  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
      Map<String,Object> paramter = new HashMap<>(16);

      //這裏獲取請求頭信息,並填入參數表
      String token = request.getHeader(TOKEN);
      paramter.put("token", token);
      
      //其它參數......

      ParameterRequestWrapper wrapper = new ParameterRequestWrapper(request, paramter);
      filterChain.doFilter(wrapper, response);
      return;
    }
    filterChain.doFilter(request, response);
}

複製代碼

至此,將請求頭的內容轉換成參數,就能夠經過實體類進行接收了。bash

相關文章
相關標籤/搜索