自定义HttpReqeust,解决request请求参数只能拿一次就失效的问题
定义一个过滤器并实现如下方法
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
super.doFilterInternal(new HttpRequestWrapper(request), response, filterChain);
}
自定义HttpReqeust HttpRequestWrapper
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map; import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.io.IOUtils; /**
* Wrap the generic httpServletRequest
*/
public class HttpRequestWrapper extends HttpServletRequestWrapper { private String body; private ServletInputStream inputStream; private BufferedReader reader; private String requestURI; private StringBuilder requestURL; private String servletPath; private Map<String, ?> params; public HttpRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
if (!isMultipart()) {
preLoadBody(request);
}
} private void preLoadBody(HttpServletRequest request) throws IOException {
Charset charset = Charset.forName(getCharacterEncoding());
byte[] bodyBytes = IOUtils.toByteArray(request.getInputStream());
body = new String(bodyBytes, charset);
inputStream = new RequestCachingInputStream(body.getBytes(getCharacterEncoding()));
} public final boolean isMultipart() {
String contentType = getContentType();
return contentType != null && contentType.toLowerCase().startsWith("multipart/");
} @Override
public final String getContentType() {
String _contentType = getParameter("_contentType");
if (_contentType != null) return _contentType;
return super.getContentType();
} public String getBody() {
if (isMultipart()) throw new IllegalStateException("multipart request does not support preloaded body");
return body;
} @Override
public String getMethod() {
String _method = getParameter("_method");
if (_method != null) return _method;
return super.getMethod();
} @Override
public ServletInputStream getInputStream() throws IOException {
if (inputStream != null) return inputStream;
return super.getInputStream();
} @Override
public BufferedReader getReader() throws IOException {
if (reader == null) {
reader = new BufferedReader(new InputStreamReader(inputStream, getCharacterEncoding()));
}
return reader;
} @Override
public final String getCharacterEncoding() {
String defaultEncoding = super.getCharacterEncoding();
return defaultEncoding != null ? defaultEncoding : "UTF-8";
} public void setParams(Map<String, ?> params) {
this.params = params;
}
/**
* used to cache the request inputstream
* @author sylorl
* @date Mar 10, 2015
*/
private static class RequestCachingInputStream extends ServletInputStream { private final ByteArrayInputStream inputStream; public RequestCachingInputStream(byte[] bytes) {
inputStream = new ByteArrayInputStream(bytes);
} @Override
public int read() throws IOException {
return inputStream.read();
}
} @Override
public String getRequestURI() {
if(this.requestURI == null) {
return super.getRequestURI();
}
return super.getRequestURI();
} @Override
public StringBuffer getRequestURL() {
if(this.requestURL == null) {
return super.getRequestURL();
}
return new StringBuffer(this.requestURL.toString());
} @Override
public String getServletPath() {
if(servletPath == null) {
return super.getServletPath();
}
return this.servletPath;
} public void setRequestURI(String requestURI, HttpServletRequest request) {
this.servletPath = requestURI;
this.requestURI = request.getContextPath() + requestURI;
this.requestURL = new StringBuilder().append(request.getProtocol())
.append("://")
.append(request.getLocalAddr())
.append("/")
.append(servletPath);
} public String[] getParameterValues(String name) {
if(params != null) {
Object v = params.get(name);
if (v==null) {
return null;
} else if(v instanceof String[]) {
return (String[]) v;
} else if(v instanceof String) {
return new String[]{(String) v};
} else {
return new String[]{v.toString()};
}
}
return super.getParameterValues(name);
} public String getParameter(String name) {
if(params != null) {
Object v = params.get(name);
if(v == null) {
return null;
} else if(v instanceof String[]) {
String []strArr = (String[]) v;
if(strArr.length > 0){
return strArr[0];
} else {
return null;
}
} else if(v instanceof String) {
return (String) v;
} else {
return v.toString();
}
}
return super.getParameter(name);
} @SuppressWarnings("unchecked")
public Map<String, String[]> getParameterMap() {
if(params != null){
Map<String, String[]> map = new HashMap<String, String[]>();
for(Object key:params.keySet()){
Object v = params.get((String)key);
String[] strArr = null;
if(v == null){
return null;
} else if(v instanceof String[]) {
strArr = (String[]) v;
} else if(v instanceof String) {
strArr = new String[1];
strArr[0] = (String) v;
} else {
strArr = new String[1];
strArr[0] = v.toString();
}
map.put((String)key, strArr);
}
return map;
}
return super.getParameterMap();
}
}
自定义HttpReqeust,解决request请求参数只能拿一次就失效的问题的更多相关文章
- 大白话讲解如何解决HttpServletRequest的请求参数只能读取一次的问题
大家在开发过程中,可能会遇到对请求参数做下处理的场景,比如读取上送的参数中看调用方上送的系统编号是否是白名单里面的(更多的会用request中获取IP地址判断).需要对请求方上送的参数进行大小写转换或 ...
- SpringMVC 完美解决PUT请求参数绑定问题(普通表单和文件表单)
一 解决方案 修改web.xml配置文件 将下面配置拷贝进去(在原有的web-app节点里面配置 其它配置不变) <!-- 处理PUT提交参数(只对基础表单生效) --> <filt ...
- request请求参数与http请求过程
request请求参数
- JSP中解决获取请求参数中文乱码问题
分两种情况: 1.获取访问请求参数时乱码 解决方法:构造一个新的String String user = new String(request.getParameter("user" ...
- 解决jmeter 请求参数中文乱码
今天在用jmeter 写脚本时发现查看结果树request post请求中文参数值是乱码,故记录下解决过程. 解决过程如下: 1.修改本地配置文件 因为此处的数据,还没有发送出去,所以,肯定是这个变量 ...
- asp.net中Request请求参数的自动封装
这两天在测一个小Demo的时候发现一个很蛋疼的问题----请求参数的获取和封装,例: 方便测试用所以这里是一个很简单的表单. <!DOCTYPE html> <html xmlns= ...
- 修改request请求参数
本质上来讲,request请求当中的参数是无法更改的,也不能添加或者删除: 但在后台程序中,一般对request的参数的操作,都是通过request的getParameter.getParameter ...
- 2017.9.26 request请求参数用法
4.2 访问请求参数 request对象的getParamter()方法,可以用来获取用户(客户端)提交的数据 4.2.1 访问请求参数的方法 String 自符串变量 =request.getPar ...
- 解决solr 请求参数过长报错too many boolean clauses Exception
booleanClauses属性的意义 貌似是查询条件有几个逻辑判断而不是参数长度. 如下面两种情况 a:1 OR b:2 AND C:3那么此时booleanClauses=3 id(1 2 3 4 ...
随机推荐
- Selenium2设置隐式等待和显示等待
1. 设置显示等待 Java代码: public static WebElement WaitForElement(WebDriver driver, String locator) { WebEle ...
- selenium访问百度 然后获取百度logo的截图
#!/usr/bin/env python # encoding: utf-8 import time from selenium import webdriver from PIL import I ...
- Kubernetes网络配置
#flannel#所有node都安装#下载https://github.com/coreos/flannel/releases#解压并把flanneld和mk-codker-opts.sh复制到/us ...
- jQuery的动画方法
/* animate参数: 参数一:要改变的样式属性值,写成字典的形式 参数二:动画持续的时间,单位为毫秒,一般不写单位 参数三:动画曲线,默认为‘swing’,缓冲运动,还可以设置为‘linear’ ...
- python每日一类(2):platform
根据官方文档的解释(https://docs.python.org/3.5/library/platform.html#module-platform): 学习其他人的代码如下: # python p ...
- 利用JavaScript打印出Fibonacci数(不使用全局变量)
从汤姆大叔的博客里看到了6个基础题目:本篇是第4题 - 利用JavaScript打印出Fibonacci数(不使用全局变量) 解题关键: 1.Fibonacci数列的规律 2.递归 解点1:Fibon ...
- BZOJ 4589 Hard Nim(FWT加速DP)
题目链接 Hard Nim 设$f[i][j]$表示前$i$个数结束后异或和为$j$的方案数 那么$f[i][j] = f[i-1][j$ $\hat{}$ $k]$,满足$k$为不大于$m$的质数 ...
- Wannafly挑战赛10 D 小H的询问(线段树)
题目链接 Problem D 这个题类似 SPOJ GSS3 做过那个题之后其实就可以秒掉这题了. 考虑当前线段树维护的结点 在那道题的基础上,这个题要多维护几个东西,大概就是左端点的奇偶性,右端点 ...
- 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- 杨老师的游戏
链接:https://www.nowcoder.com/acm/contest/116/B来源:牛客网 题目描述 杨老师给同学们玩个游戏,要求使用乘法和减法来表示一个数,他给大家9张卡片,然后报出一个 ...
- Jmeter正则表达式提取器--将上一个请求的结果作为下一个请求的参数
正则表达式提取器是一个后置处理器,作用是在请求完成后,从响应数据中截取一部分字符串保存到变量中,以便下一个请求使用 1.首先在线程组下添加两个HTTP请求, 2.添加好两个HTTP请求后,在每个HTT ...