定义一个过滤器并实现如下方法

@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请求参数只能拿一次就失效的问题的更多相关文章

  1. 大白话讲解如何解决HttpServletRequest的请求参数只能读取一次的问题

    大家在开发过程中,可能会遇到对请求参数做下处理的场景,比如读取上送的参数中看调用方上送的系统编号是否是白名单里面的(更多的会用request中获取IP地址判断).需要对请求方上送的参数进行大小写转换或 ...

  2. SpringMVC 完美解决PUT请求参数绑定问题(普通表单和文件表单)

    一 解决方案 修改web.xml配置文件 将下面配置拷贝进去(在原有的web-app节点里面配置 其它配置不变) <!-- 处理PUT提交参数(只对基础表单生效) --> <filt ...

  3. request请求参数与http请求过程

    request请求参数

  4. JSP中解决获取请求参数中文乱码问题

    分两种情况: 1.获取访问请求参数时乱码 解决方法:构造一个新的String String user = new String(request.getParameter("user" ...

  5. 解决jmeter 请求参数中文乱码

    今天在用jmeter 写脚本时发现查看结果树request post请求中文参数值是乱码,故记录下解决过程. 解决过程如下: 1.修改本地配置文件 因为此处的数据,还没有发送出去,所以,肯定是这个变量 ...

  6. asp.net中Request请求参数的自动封装

    这两天在测一个小Demo的时候发现一个很蛋疼的问题----请求参数的获取和封装,例: 方便测试用所以这里是一个很简单的表单. <!DOCTYPE html> <html xmlns= ...

  7. 修改request请求参数

    本质上来讲,request请求当中的参数是无法更改的,也不能添加或者删除: 但在后台程序中,一般对request的参数的操作,都是通过request的getParameter.getParameter ...

  8. 2017.9.26 request请求参数用法

    4.2 访问请求参数 request对象的getParamter()方法,可以用来获取用户(客户端)提交的数据 4.2.1 访问请求参数的方法 String 自符串变量 =request.getPar ...

  9. 解决solr 请求参数过长报错too many boolean clauses Exception

    booleanClauses属性的意义 貌似是查询条件有几个逻辑判断而不是参数长度. 如下面两种情况 a:1 OR b:2 AND C:3那么此时booleanClauses=3 id(1 2 3 4 ...

随机推荐

  1. Balanced Lineup(RMQ)

    原题传送门 就是裸RMQ啊.. 求区间最大值和区间最小值,一看就像RMQ,当然线段树貌似也可以. 至于算法嘛.自己学~(好吧,放个传送门...) 然后就是最后把maxsum-minsum就好啦233~ ...

  2. VS MFC 改变AfxMessageBox标题 AFX_IDS_APP_TITLE

    其实这个标题在资源String Table里就能找到,查找AFX_IDS_APP_TITLE,在这里你就能轻而易举的改变标题了. 注意:有的工程的资源String Table里面没有添加AFX_IDS ...

  3. 常用PHP数组函数总结

    1.array_values()  以索引数组的形式返回数组的中所有元素的值 array_keys()  以索引数组的形式返回数组的中所有元素的值 2.in_array()   检查数组中是否存在某值 ...

  4. MSSQL 让排序更方便灵活

    SQL: SELECT * FROM table1 ORDER BY CASE WHEN field=value THEN 1 ELSE 0 END (ASC/DESC) 是不是很方便呢,哈哈

  5. 在C#中将金额转换成中文大写金额

    具体代码如下: /// <summary> /// 金额转换成中文大写金额 /// </summary> /// <param name="LowerMoney ...

  6. asp.net 网站模板怎么用,就是16aspx上面下下来的模板,里面有个sln文件,其他全是文件夹的东西

    .net写的程序模板一般都被写死了.那样只有通过程序改了.

  7. vue插槽slot的理解与使用

    一.个人理解及插槽的使用场景 刚开始看教程我的疑惑是为什么要用插槽,它的使用场景是什么,很多解释都是“父组件向子组件传递dom时会用到插槽”,这并不能很好的解决我的疑惑.既然你用了子组件,你为什么要给 ...

  8. 洛谷——P2640 神秘磁石

    P2640 神秘磁石 题目背景 在遥远的阿拉德大陆,有一种神秘的磁石,是由魔皇制作出来的, 题目描述 1.若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小, ...

  9. 初步接触LVS

    今天整理下思绪,定下要掌握LVS原理和使用方法.于是,看了部分关于LVS的概述和文章. 章博士在2002年写的LVS的几篇文章,在我看来,今天都值得一看.http://www.linuxvirtual ...

  10. Could not automatically select an Xcode project

    当把CocoaPods生成的workspace移动到上层目录时,需要改下Pods.xcconfig和工程里的一些设置,就通常没什么难度. 当遇到这个问题时: Could not automatical ...