项目中遇到一类请求,所有的请求都会将请求参数放在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*/@Overridepublic Enumeration<String> getParameterNames() {return new Vector(params.keySet()).elements();}/*** 重写getParameter方法** @param name 参数名* @return 返回参数值*/@Overridepublic String getParameter(String name) {String[] values = params.get(name);if (values == null || values.length == 0) {return null;}return values[0];}@Overridepublic 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;@Autowiredpublic ParamFilter(SiteUidRelatedUtils uidRelatedUtils) {this.uidRelatedUtils = uidRelatedUtils;}@Overrideprotected 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);
}复制代码

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

转载于:https://juejin.im/post/5d0ae37ef265da1b6e65a826

Spring中将header头转换为参数相关推荐

  1. php重定向在header头加参数,php的header重定向的域名参数后边可以加路由吗?

    结果为: 如果域名后边不添加admin参数的话是可以正常重定向的! 它会重定向到网站首页,我是想让它重定向到后台登入页面,所以才添加admin参数. 回复内容: 结果为: 如果域名后边不添加admin ...

  2. php curl post get请求header头带参数

    get方式: //getpublic function curlGet($url){$header = array('APIKEY:'.$this->APIKEY,);$ch = curl_in ...

  3. spring cloud 微服务之间添加自定义的header头

    spring cloud 微服务之间添加自定义的header头 spring cloud 微服务之间添加自定义的header头 创建注册中心 创建生产者 创建消费者 验证结果 spring cloud ...

  4. php 跨域 验证_php 前后端分离开发进行跨域请求时ajax发送验证参数token的header头解决方法...

    php前后端分离开发中要实现前后端参数信息交互,必须解决token标识验证问题. 步骤如下: 1.前端ajax发送请求时,要设置一个自定义header头.代码如下: $.ajax({ url:&quo ...

  5. 获取头信息header中参数access_token失败,获取header头信息中带下划线参数失败

    今天获取header头信息中参数access_token返回为null,本地用postman测试没问题,发布到线上环境就出问题了.         后面发现是nginx代理的过程中参数被过滤了,ngi ...

  6. axios 登录后设置header,vue+axios 全局添加请求头和参数操作

    vue+axios 全局添加请求头和参数操作 走登录的接口都会返回一个 token 值, 然后存起来方便之后调接口的时候给后台传过去, 传给后台的方式有两种:(具体使用哪种需要和后台商量) 1, 放在 ...

  7. android 4.4 flac,如何在Android中将音频原始转换为FLAC

    我使用audioRecord类录制音频.现在我想将音频原始文件转换为* flac格式.我转换*原始文件为WAV下一方式:如何在Android中将音频原始转换为FLAC private void cop ...

  8. 企业实战之Spring拦截器《统一参数校验》

    在前面的一些文章中我们有讲到,通过拦截器我们可以做很多的事情,包括接口统一的 参数校验. 登录校验.权限校验等,也可以做一些HTTP响应体写入逻辑,比如我们另一篇文章所说的<解决跨域问题> ...

  9. php header setcookie,php中header头设置Cookie与内置setCookie的区别,和js对cookie操作

    首先声明,浏览的Cookie操作都是通过HTTP Header(俗称"Http头") 来实现.所有的服务器与客户端之间Cookie数据传输都是通过Http请求头来操作. PHP中* ...

最新文章

  1. Beaglebone Back学习七(URAT串口测试)
  2. 首家中国快递公司赴美上市!总市值达141亿美元
  3. strcpy 通过指针复制字符串出错问题
  4. 锁、C#中Monitor和Lock以及区别
  5. 团队建设及管理上的举措_为什么在副项目上工作是您作为开发人员的最佳举措...
  6. CF962E Byteland, Berland and Disputed Cities
  7. 数据结构 5分钟带你搞定哈希表(建议收藏)!!!
  8. web前端如何提升自我
  9. 一分钟教你搞定chrome的安装---redhat7.6如何安装谷歌浏览器
  10. Windows 桌面美化
  11. SJF调度算法(操作系统)短作业优先和最短剩余时间优先
  12. kobo glo安装koreader(刷ksm后)
  13. Part1---3.数据库编程与完整性
  14. 数据分析报告中如何选择合适的统计图表
  15. 椭圆型偏微分方程和格林函数
  16. Win10蓝牙设备删除后无法连接解决办法
  17. top期刊,顶级期刊,顶级期刊,jcr分区和中科院分区
  18. 数据库课程设计:物流信息管理系统(PyCharm+MySQL)
  19. 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面鸡和兔子的总数a和脚的总数b,问笼子里面有多少只鸡,有多少只兔子
  20. 如何在线将XPS转成Word

热门文章

  1. Cheatsheet: 2011 09.13 ~ 09.19
  2. 第一章:React入门
  3. [Vue.js] 基础 -- 综合案例 -- 图书管理
  4. CSS3 过渡和动画
  5. 7-37 整数分解为若干项之和 (20 分)(dfs)
  6. R7-9 模拟EXCEL排序 (25 分)
  7. 计算机网络 ospf重点,计算机网络:OSPF协议概述
  8. 双向循环链表中结点的交换(C++)
  9. android封装aidl接口,Android远端接口AIDL及服务回调用法
  10. FPGA内部硬件结构简介