Filter中获取传递参数(解决post请求参数问题)
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请求参数问题)相关推荐
- 解决springmvc在multipart/form-data方式提交请求在过滤器Filter中获取不到参数的问题
解决springmvc在multipart/form-data方式提交请求在过滤器Filter中获取不到参数的问题 参考文章: (1)解决springmvc在multipart/form-data方式 ...
- springboot配置拦截器,在拦截器中获取@RequestBody注解参数和post请求参数以及get请求参数
1.配置拦截器 package com.jy.gxw.config.interceptor;import org.springframework.beans.factory.annotation.Au ...
- AS:Flash AS3中获取浏览器信息及URL相关参数(并非swf url地址)
原文链接:AS:Flash AS3中获取浏览器信息及URL相关参数(并非swf url地址) 好久没来这里了,最近发现网络上对此类信息的封装少的可怜,没有一个是比较完整的,今天又是周未,不敲点代码手痒 ...
- vue从url中获取token并加入到 请求头里_轻流amp;amp;企业微信——获取打卡数据...
企业微信开放了打卡应用的api,功能包括查询打卡数据,能获取到用户.地点.时间.打卡类型等信息,在轻流中可以基于以上数据做一段时间内的迟到/事假等统计,以及更深层数据处理,方便管理. 第一步:获取ac ...
- AutoCAD.net 插件中获取AutoCAD 启动命令行的参数
今天一个童鞋问到如何在AutoCAD插件中获取AutoCAD 启动时的参数.用户故事是这样的,AutoCAD启动之前先由自己写的一个winform程序进行用户验证,如果验证通过则通过Process.S ...
- 但是尚未从池中获取连接_解决报错“超时时间已到。超时时间已到,但是尚未从池中获取连接”的方案...
超时时间已到.超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小. DataReader是独占连接的,就是说你的程序可能设计上有问题.比如说最大连接设 ...
- 在servlet中或者在filter中获取spring容器中的bean
1 配置spring文件 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate ...
- 如何解决Http请求参数中加号变空格问题
问题描述: 当使用.NET编写Winform程序,构建Http Post 请求,并传递若干参数给远程服务器时,如果参数中包含加号'+'等符号时,http请求发送后,服务器收到并解析时,加号会被解码为空 ...
- 在执行方法和Web资源中获取传递过来参数的值
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复228或者20161026可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- 解决url请求参数带中文时后台获取出现乱码问题
第一种方法: var url = encodeURI(url);前端js先编码一次, 后台:String test=newString(request.getParameter("test& ...
最新文章
- Access外键 级联更新、删除
- Strong Consistency, 强一致性技术概述
- 划时代的项目管理核心引擎——DynamicGantt 动态图甘特图
- UIDatePicker 日期/时间选取器(滚轮)—IOS开发
- 【若依(ruoyi)】layui upload
- 事件参数对象下的几个属性 mouseenter与mouseover的区别
- java数组个数无限_基于Java代码实现数字在数组中出现次数超过一半
- 万特电能表接线仿真系统 软件_【学习软件】嘘!此3款10万级专业解锁版神器全网已绝迹!(物理实验室)...
- 小技巧 ----- 通过二进制串的位运算进行一维指数型枚举
- 记录一下很好用的java爬虫代码-很有意思,原理也很简单,一看就懂
- ubuntu16.4 配置logstash6.3.2 kibanan6.3.2
- Bar函数--Matplotlib
- C#语言和SQL Server数据库技术_前四章错题
- 微型计算机工作最小时间单位,2010~2011学年第1学期微机原理2试卷A(答案)
- excel下载模版(数据字典)
- TFS 2010安装指南
- 从零开始写RISC-V处理器
- C++Primer 第9章 顺序容器
- 搞点好玩儿的,如何做一个你自己的ad-block插件
- 哈工大软件构造期末复习(根据老师复习提纲整理)
热门文章
- cad 切图_CAD怎么切图?
- 安装oracle提示javaw,为什么oracle 9i 安装时,setup exe javaw exe进程消失
- 谁是卧底 python_xpose和sxpose,谁是卧底?
- ubuntu安装WPS字体缺失的解决办法
- 广外男生病毒代码剖析
- Ubuntu 20.04 更换阿里源
- Java代码实现24点计算
- mvvm框架 android,Android MVVM 框架 MVVMFramework
- 26 图的邻接矩阵:深度优先遍历
- 【转载】HTTPS那些事(图文版)-Network Tips