自定义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 ...
随机推荐
- 分享一下我写的.net 2.0的orm类,实现mvc。可以用于webform等环境中,这是orm的原理部分。
using System;using System.Collections.Generic;using System.Configuration;using System.Data;using Sys ...
- JS操作checkBox
代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w ...
- centos 安装squid http代理
yum -y install squid service squid start service iptables stop
- /proc/sys/shm/drop_caches
author:skate time:2012/02/22 手工释放linux内存--/proc/sys/vm/drop_cache 转载一篇文章 linux的内存查看: [root@localhost ...
- objdump
objdump -h test (show section headers) test.c #include <stdio.h> int main() { static int xxxxx ...
- jquery验证前端页面
一共三个页面 jquery.html文件(前端页面,jquery验证用户信息) jquerytest.php文件(后台处理页面) jquerydb.php文件(数据库) 数据表结构 jquery.ht ...
- 【C语言】指针增减
int *pa = NULL; ; printf("%x\n", pb); char *pca = NULL; ; printf("%x\n", pcb); s ...
- Java android DES+Base64加密解密
服务器与客户端加密解密传输, 中间遇到各种坑,客户端无论用AES还是DES解密时都会出现错误,后来才看到好多人说要用AES/DES加完密后还要BASE64加密,照做时发现android和java的Ba ...
- (4)C#工具箱-菜单和工具栏
1.ContextMenuStrip(右键菜单栏) 把contextMenuStrip控件拖到窗体上,会在窗体下面显示,点击控件在最上行显示菜单栏,可以任意设置.(运行以后不会在界面上显示,它需要预控 ...
- POJ 2337 Catenyms (欧拉图)
本文链接http://i.cnblogs.com/EditPosts.aspx?postid=5402042 题意: 给你N个单词,让你把这些单词排成一个序列,使得每个单词的第一个字母和上一个字单词的 ...