1. GET中传递的参数可以直接通过request.getParameter获取。

2. Post 传递的产生不能过直接从request.getInputStream() 读取,必须要进行重新写。(request.getInputStream()只能够读取一次

方式: 通过重写 HttpServletRequestWrapper 类 获取getInputStream中的流数据,然后在将body数据进行重新写入传递下去。

XyRequestWrapper 类:

package com.xy.boot.cmiap.filter;import com.alibaba.fastjson.JSONObject;
import com.xy.boot.common.util.StringUtils;
import org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper;
import org.apache.commons.codec.Charsets;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;/*** Created by fuwenshen* Date:2018/10/26* Time:12:21*/
public class XyRequestWrapper extends HttpServletRequestWrapper {private String body;public XyRequestWrapper(HttpServletRequest request) throws IOException {super(request);StringBuilder stringBuilder = new StringBuilder();BufferedReader bufferedReader = null;try {InputStream inputStream = request.getInputStream();if (inputStream != null) {bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));char[] charBuffer = new char[128];int bytesRead = -1;while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {stringBuilder.append(charBuffer, 0, bytesRead);}} else {stringBuilder.append("");}} catch (IOException ex) {throw ex;} finally {if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException ex) {throw ex;}}}body = stringBuilder.toString();}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes("UTF-8"));ServletInputStream servletInputStream = new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() throws IOException {return byteArrayInputStream.read();}};return servletInputStream;}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream(), Charsets.UTF_8));}public String getBody() {return this.body;}@Overridepublic String getParameter(String name) {return super.getParameter(name);}@Overridepublic Map<String, String[]> getParameterMap() {return super.getParameterMap();}@Overridepublic Enumeration<String> getParameterNames() {return super.getParameterNames();}@Overridepublic String[] getParameterValues(String name) {return super.getParameterValues(name);}/*** 设置自定义post参数 //** @param paramMaps* @return*/public void setParamsMaps(Map paramMaps) {Map paramBodyMap = new HashMap();if (!StringUtils.isEmpty(body)) {paramBodyMap = JSONObject.parseObject(body, Map.class);}paramBodyMap.putAll(paramMaps);body = JSONObject.toJSONString(paramBodyMap);}
}
XySecurityFilter
package com.xy.boot.cmiap.filter;import com.alibaba.fastjson.JSONObject;
import com.xy.boot.cmiap.bo.VerifyTokenResultBO;
import com.xy.boot.cmiap.constant.HttpConstant;
import com.xy.boot.cmiap.entity.enums.XyHttpCodeEnum;
import com.xy.boot.cmiap.service.IXySecurityService;
import com.xy.boot.cmiap.service.helper.XyHttpSecurityHelper;
import com.xy.boot.common.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;/*** Created by fuwenshen* Date:2018/10/29* Time:15:36*/
@Component
@Slf4j
@WebFilter(filterName = "xySecurityFilter", urlPatterns = {"/api/adv/*"})
public class XySecurityFilter implements Filter {@Value("${verify_token_switch}")private boolean tokenSwitch;@Value("${zy.app_secret}")private String zyAppSecret;@Value("${zy.token}")private String zyToken;//验证 token boprivate VerifyTokenResultBO tokenBO=null;@Autowiredprivate IXySecurityService iXySecurityService;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {log.debug("进入XySecurityFilter!");// 参数集合 初始化TreeMap paramsMaps = new TreeMap();String token = null, v = null, timestamp = null, sign = null;HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;resp.setCharacterEncoding("UTF-8");resp.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);/*** 验证通用请求头是否完整*/token = req.getHeader(HttpConstant.TOKEN);v = req.getHeader(HttpConstant.V);timestamp = req.getHeader(HttpConstant.TIMESTAMP);sign = req.getHeader(HttpConstant.SIGN);if (StringUtils.isEmpty(token) || StringUtils.isEmpty(v) || StringUtils.isEmpty(timestamp) || StringUtils.isEmpty(sign)) {resp.sendError(XyHttpCodeEnum.ILLEGAL_REQUEST.getCode(), XyHttpCodeEnum.ILLEGAL_REQUEST.getMessage());return;}// 防止流读取一次后就没有了, 所以需要将流继续写出去XyRequestWrapper requestWrapper = new XyRequestWrapper(req);/*** 校验token*//*********************************************************//*** 获取请求参数*/if ("POST".equals(req.getMethod().toUpperCase())) {String body = requestWrapper.getBody();paramsMaps = JSONObject.parseObject(body, TreeMap.class);log.debug("parameterMap:" + paramsMaps.toString());} else {Map<String, String[]> parameterMap = requestWrapper.getParameterMap();Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();Iterator<Map.Entry<String, String[]>> iterator = entries.iterator();while (iterator.hasNext()) {Map.Entry<String, String[]> next = iterator.next();paramsMaps.put(next.getKey(), next.getValue()[0]);}log.debug("parameterMap:" + paramsMaps.toString());}/*** 验证签名是否合法*//***************************************///设置企业信息(自定义参数)if(tokenBO!=null){Map paramsPlus = new HashMap();paramsPlus.put(HttpConstant.TOKEN, tokenBO.getTokenCode());paramsPlus.put(HttpConstant.APPID, tokenBO.getAppid());requestWrapper.setParamsMaps(paramsPlus);}chain.doFilter(requestWrapper, response);}@Overridepublic void destroy() {}
}

Filter中获取传递参数(解决post请求参数问题)相关推荐

  1. 解决springmvc在multipart/form-data方式提交请求在过滤器Filter中获取不到参数的问题

    解决springmvc在multipart/form-data方式提交请求在过滤器Filter中获取不到参数的问题 参考文章: (1)解决springmvc在multipart/form-data方式 ...

  2. springboot配置拦截器,在拦截器中获取@RequestBody注解参数和post请求参数以及get请求参数

    1.配置拦截器 package com.jy.gxw.config.interceptor;import org.springframework.beans.factory.annotation.Au ...

  3. AS:Flash AS3中获取浏览器信息及URL相关参数(并非swf url地址)

    原文链接:AS:Flash AS3中获取浏览器信息及URL相关参数(并非swf url地址) 好久没来这里了,最近发现网络上对此类信息的封装少的可怜,没有一个是比较完整的,今天又是周未,不敲点代码手痒 ...

  4. vue从url中获取token并加入到 请求头里_轻流amp;amp;企业微信——获取打卡数据...

    企业微信开放了打卡应用的api,功能包括查询打卡数据,能获取到用户.地点.时间.打卡类型等信息,在轻流中可以基于以上数据做一段时间内的迟到/事假等统计,以及更深层数据处理,方便管理. 第一步:获取ac ...

  5. AutoCAD.net 插件中获取AutoCAD 启动命令行的参数

    今天一个童鞋问到如何在AutoCAD插件中获取AutoCAD 启动时的参数.用户故事是这样的,AutoCAD启动之前先由自己写的一个winform程序进行用户验证,如果验证通过则通过Process.S ...

  6. 但是尚未从池中获取连接_解决报错“超时时间已到。超时时间已到,但是尚未从池中获取连接”的方案...

    超时时间已到.超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小. DataReader是独占连接的,就是说你的程序可能设计上有问题.比如说最大连接设 ...

  7. 在servlet中或者在filter中获取spring容器中的bean

    1 配置spring文件 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate ...

  8. 如何解决Http请求参数中加号变空格问题

    问题描述: 当使用.NET编写Winform程序,构建Http Post 请求,并传递若干参数给远程服务器时,如果参数中包含加号'+'等符号时,http请求发送后,服务器收到并解析时,加号会被解码为空 ...

  9. 在执行方法和Web资源中获取传递过来参数的值

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复228或者20161026可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  10. 解决url请求参数带中文时后台获取出现乱码问题

    第一种方法: var url = encodeURI(url);前端js先编码一次, 后台:String test=newString(request.getParameter("test& ...

最新文章

  1. Access外键 级联更新、删除
  2. Strong Consistency, 强一致性技术概述
  3. 划时代的项目管理核心引擎——DynamicGantt 动态图甘特图
  4. UIDatePicker 日期/时间选取器(滚轮)—IOS开发
  5. 【若依(ruoyi)】layui upload
  6. 事件参数对象下的几个属性 mouseenter与mouseover的区别
  7. java数组个数无限_基于Java代码实现数字在数组中出现次数超过一半
  8. 万特电能表接线仿真系统 软件_【学习软件】嘘!此3款10万级专业解锁版神器全网已绝迹!(物理实验室)...
  9. 小技巧 ----- 通过二进制串的位运算进行一维指数型枚举
  10. 记录一下很好用的java爬虫代码-很有意思,原理也很简单,一看就懂
  11. ubuntu16.4 配置logstash6.3.2 kibanan6.3.2
  12. Bar函数--Matplotlib
  13. C#语言和SQL Server数据库技术_前四章错题
  14. 微型计算机工作最小时间单位,2010~2011学年第1学期微机原理2试卷A(答案)
  15. excel下载模版(数据字典)
  16. TFS 2010安装指南
  17. 从零开始写RISC-V处理器
  18. C++Primer 第9章 顺序容器
  19. 搞点好玩儿的,如何做一个你自己的ad-block插件
  20. 哈工大软件构造期末复习(根据老师复习提纲整理)

热门文章

  1. cad 切图_CAD怎么切图?
  2. 安装oracle提示javaw,为什么oracle 9i 安装时,setup exe javaw exe进程消失
  3. 谁是卧底 python_xpose和sxpose,谁是卧底?
  4. ubuntu安装WPS字体缺失的解决办法
  5. 广外男生病毒代码剖析
  6. Ubuntu 20.04 更换阿里源
  7. Java代码实现24点计算
  8. mvvm框架 android,Android MVVM 框架 MVVMFramework
  9. 26 图的邻接矩阵:深度优先遍历
  10. 【转载】HTTPS那些事(图文版)-Network Tips