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

@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. vs 2013 update2无法打开 edmx文件

    解决方案:在edmx文件上右键,选择ado.net entity data model designer,即可正常打开!

  2. win8启用.net framework3.5方法

    管理员命令下执行dism.exe /online /enable-feature /featurename:NetFX3 /Source:L:\sources\sxs

  3. 官网cocos2d

    http://cocos2d.spritebuilder.com/download           官网 https://github.com/cocos2d/cocos2d-spritebuil ...

  4. Sqlite插入、修改、删除表里面的数据

    转载 2014年05月10日 10:38:21 标签: sqlite3 / 数据库 8688 转自:http://www.cnblogs.com/myqiao/archive/2011/07/13/2 ...

  5. source insight setting

    adjust source code font size Options -> File Type Options -> Screen Font -> Size adjust dis ...

  6. TaobaoVM

    作者:Andoter链接:https://www.zhihu.com/question/275665265/answer/416021488来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...

  7. luogu 2509. 森林大礼包

    2509. 森林大礼包 ★   输入文件:three_squirrels.in   输出文件:three_squirrels.out   简单对比时间限制:1 s   内存限制:256 MB [题目描 ...

  8. POJ 3469 Dual Core CPU(最小割)

    [题目链接] http://poj.org/problem?id=3469 [题目大意] 有N个模块要在A,B两台机器上执行,在不同机器上有不同的花费 另有M个模块组(a,b),如果a和b在同一台机子 ...

  9. 彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误、安装包与之前设备上的安装包签名不一致

    有时候开发的问题:会遇到在公司上班的时候,公司的IDE能跑程序,把程序拷贝回家,再跑一次,就会出现以下错误: INSTALL_FAILED_UPDATE_INCOMPATIBLE 原因:就是你的安装包 ...

  10. 4.NFC前台调度系统

    使用目的:当前Activity能直接响应NFC标签,而不需要用户在choose所有能处理的Activity. 使用步骤: 第一步:在onCreate()方法中,创建一个PendingIntent对象 ...