Spring中将header头转换为参数
项目中遇到一类请求,所有的请求都会将请求参数放在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头转换为参数相关推荐
- php重定向在header头加参数,php的header重定向的域名参数后边可以加路由吗?
结果为: 如果域名后边不添加admin参数的话是可以正常重定向的! 它会重定向到网站首页,我是想让它重定向到后台登入页面,所以才添加admin参数. 回复内容: 结果为: 如果域名后边不添加admin ...
- php curl post get请求header头带参数
get方式: //getpublic function curlGet($url){$header = array('APIKEY:'.$this->APIKEY,);$ch = curl_in ...
- spring cloud 微服务之间添加自定义的header头
spring cloud 微服务之间添加自定义的header头 spring cloud 微服务之间添加自定义的header头 创建注册中心 创建生产者 创建消费者 验证结果 spring cloud ...
- php 跨域 验证_php 前后端分离开发进行跨域请求时ajax发送验证参数token的header头解决方法...
php前后端分离开发中要实现前后端参数信息交互,必须解决token标识验证问题. 步骤如下: 1.前端ajax发送请求时,要设置一个自定义header头.代码如下: $.ajax({ url:&quo ...
- 获取头信息header中参数access_token失败,获取header头信息中带下划线参数失败
今天获取header头信息中参数access_token返回为null,本地用postman测试没问题,发布到线上环境就出问题了. 后面发现是nginx代理的过程中参数被过滤了,ngi ...
- axios 登录后设置header,vue+axios 全局添加请求头和参数操作
vue+axios 全局添加请求头和参数操作 走登录的接口都会返回一个 token 值, 然后存起来方便之后调接口的时候给后台传过去, 传给后台的方式有两种:(具体使用哪种需要和后台商量) 1, 放在 ...
- android 4.4 flac,如何在Android中将音频原始转换为FLAC
我使用audioRecord类录制音频.现在我想将音频原始文件转换为* flac格式.我转换*原始文件为WAV下一方式:如何在Android中将音频原始转换为FLAC private void cop ...
- 企业实战之Spring拦截器《统一参数校验》
在前面的一些文章中我们有讲到,通过拦截器我们可以做很多的事情,包括接口统一的 参数校验. 登录校验.权限校验等,也可以做一些HTTP响应体写入逻辑,比如我们另一篇文章所说的<解决跨域问题> ...
- php header setcookie,php中header头设置Cookie与内置setCookie的区别,和js对cookie操作
首先声明,浏览的Cookie操作都是通过HTTP Header(俗称"Http头") 来实现.所有的服务器与客户端之间Cookie数据传输都是通过Http请求头来操作. PHP中* ...
最新文章
- Beaglebone Back学习七(URAT串口测试)
- 首家中国快递公司赴美上市!总市值达141亿美元
- strcpy 通过指针复制字符串出错问题
- 锁、C#中Monitor和Lock以及区别
- 团队建设及管理上的举措_为什么在副项目上工作是您作为开发人员的最佳举措...
- CF962E Byteland, Berland and Disputed Cities
- 数据结构 5分钟带你搞定哈希表(建议收藏)!!!
- web前端如何提升自我
- 一分钟教你搞定chrome的安装---redhat7.6如何安装谷歌浏览器
- Windows 桌面美化
- SJF调度算法(操作系统)短作业优先和最短剩余时间优先
- kobo glo安装koreader(刷ksm后)
- Part1---3.数据库编程与完整性
- 数据分析报告中如何选择合适的统计图表
- 椭圆型偏微分方程和格林函数
- Win10蓝牙设备删除后无法连接解决办法
- top期刊,顶级期刊,顶级期刊,jcr分区和中科院分区
- 数据库课程设计:物流信息管理系统(PyCharm+MySQL)
- 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面鸡和兔子的总数a和脚的总数b,问笼子里面有多少只鸡,有多少只兔子
- 如何在线将XPS转成Word
热门文章
- Cheatsheet: 2011 09.13 ~ 09.19
- 第一章:React入门
- [Vue.js] 基础 -- 综合案例 -- 图书管理
- CSS3 过渡和动画
- 7-37 整数分解为若干项之和 (20 分)(dfs)
- R7-9 模拟EXCEL排序 (25 分)
- 计算机网络 ospf重点,计算机网络:OSPF协议概述
- 双向循环链表中结点的交换(C++)
- android封装aidl接口,Android远端接口AIDL及服务回调用法
- FPGA内部硬件结构简介