Spring中将header头转换为参数

栏目: Java · 发布时间: 5年前

内容简介:项目中遇到一类请求,所有的请求都会将请求参数放在header头中,每个接口都需要单独处理,因此考虑做一层封装,统一进行转换。基本思路是增加一个拦截器,由拦截器对请求头进行解析,并转换为参数首先集成一个HttpServletRequestWrapper,使得当前请求持有所有的参数表

项目中遇到一类请求,所有的请求都会将请求参数放在header头中,每个接口都需要单独处理,因此考虑做一层封装,统一进行转换。

基本思路是增加一个拦截器,由拦截器对请求头进行解析,并转换为参数

首先集成一个HttpServletRequestWrapper,使得当前请求持有所有的参数表

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)});
      }
    }
  }
}
复制代码

其次,集成一个Filter

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

复制代码

至此,将请求头的内容转换成参数,就可以通过实体类进行接收了。


以上所述就是小编给大家介绍的《Spring中将header头转换为参数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JAVA 2核心技术 卷Ⅰ

JAVA 2核心技术 卷Ⅰ

[美] 霍斯特曼、[美] 科奈尔 / 叶乃文、邝劲筠 等 / 机械工业出版社 / 2006-5 / 88.00元

本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI工具箱进行图形用户界面设计,异常处理、流输入/输出和对象序列化、泛型程序设计等。 本书内容翔实、深入浅出,附有大量程序实例,极具实用价值,是Java初学者和Java程序员......一起来看看 《JAVA 2核心技术 卷Ⅰ》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具