`
rensanning
  • 浏览: 3552774 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38220
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607621
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682803
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89541
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:402152
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69761
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91838
社区版块
存档分类
最新评论

使用HttpServletRequestWrapper在filter修改request参数

    博客分类:
  • Java
 
阅读更多
处理过程:
(1)页面提交请求“/sa?userid=123456789&username=rensanning”
(2)通过Filter处理加入新参数“name=newname”
(3)sa的Servlet中forward到“/sb?myname=rensanning&mycountry=china”
(4)sb的Servlet中生成页面输出所有参数:userid、username、myname、mycountry、name

第一步:
最简单,在页面上先输出一个href为改地址的链接即可。
<a href="<%=request.getContextPath()%>/sa?userid=123456789&username=rensanning">Click me!!!</a>


第二步:
新作Filter类:ParameterFilter,配置web.xml
<filter-mapping>
	<filter-name>ParameterFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>


在doFilter方法中包装request,设置新参数值。
Map<String,String[]> m = new HashMap<String,String[]>(req.getParameterMap());
m.put("name", new String[]{"newname"});
req = new ParameterRequestWrapper((HttpServletRequest)req, m);

chain.doFilter(req, res);


包装类代码如下:
class ParameterRequestWrapper extends HttpServletRequestWrapper {

	private Map<String, String[]> params;

	public ParameterRequestWrapper(HttpServletRequest request,
			Map<String, String[]> newParams) {
		super(request);
		
		this.params = newParams;
	}

	@Override
	public String getParameter(String name) {
		String result = "";
		
		Object v = params.get(name);
		if (v == null) {
			result = null;
		} else if (v instanceof String[]) {
			String[] strArr = (String[]) v;
			if (strArr.length > 0) {
				result =  strArr[0];
			} else {
				result = null;
			}
		} else if (v instanceof String) {
			result = (String) v;
		} else {
			result =  v.toString();
		}
		
		return result;
	}

	@Override
	public Map getParameterMap() {
		return params;
	}

	@Override
	public Enumeration getParameterNames() {
		return new Vector(params.keySet()).elements();
	}

	@Override
	public String[] getParameterValues(String name) {
		String[] result = null;
		
		Object v = params.get(name);
		if (v == null) {
			result =  null;
		} else if (v instanceof String[]) {
			result =  (String[]) v;
		} else if (v instanceof String) {
			result =  new String[] { (String) v };
		} else {
			result =  new String[] { v.toString() };
		}
		
		return result;
	}

}


第三步:
sa的Servlet中,doGet()方法做forward跳转。
RequestDispatcher rd = getServletContext().getRequestDispatcher("/sb?myname=rensanning&mycountry=china");

rd.forward(request, response);


第四步:
sb的Servlet中生成页面输出所有QueryString和ParameterMap的参数。(代码略)

问题:
(1)Filter也只执行了一次

由于RequestDispatcher.forward是Servlet之间的跳转,所以默认不走Filter。在Servlet2.4规范中定义了可以在web.xml中配置:
<filter-mapping>
	<filter-name>ParameterFilter</filter-name>
	<url-pattern>/*</url-pattern>
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>FORWARD</dispatcher>
</filter-mapping>


(2)结果的QueryString中存在forward时URL的两个参数(myname、mycountry),而ParameterMap中没有。

forward时QueryString中的参数未被放入ParameterMap???

如下修改wrapper类:
class ParameterRequestWrapper extends HttpServletRequestWrapper {

	private Map<String, String[]> params;

	public ParameterRequestWrapper(HttpServletRequest request,
			Map<String, String[]> newParams) {
		super(request);
		
		this.params = newParams;

		// RequestDispatcher.forward parameter
		renewParameterMap(request);
	}

	@Override
	public String getParameter(String name) {
		String result = "";
		
		Object v = params.get(name);
		if (v == null) {
			result = null;
		} else if (v instanceof String[]) {
			String[] strArr = (String[]) v;
			if (strArr.length > 0) {
				result =  strArr[0];
			} else {
				result = null;
			}
		} else if (v instanceof String) {
			result = (String) v;
		} else {
			result =  v.toString();
		}
		
		return result;
	}

	@Override
	public Map getParameterMap() {
		return params;
	}

	@Override
	public Enumeration getParameterNames() {
		return new Vector(params.keySet()).elements();
	}

	@Override
	public String[] getParameterValues(String name) {
		String[] result = null;
		
		Object v = params.get(name);
		if (v == null) {
			result =  null;
		} else if (v instanceof String[]) {
			result =  (String[]) v;
		} else if (v instanceof String) {
			result =  new String[] { (String) v };
		} else {
			result =  new String[] { v.toString() };
		}
		
		return result;
	}

	private void renewParameterMap(HttpServletRequest req) {

		String queryString = req.getQueryString();

		if (queryString != null && queryString.trim().length() > 0) {
			String[] params = queryString.split("&");

			for (int i = 0; i < params.length; i++) {
				int splitIndex = params[i].indexOf("=");
				if (splitIndex == -1) {
					continue;
				}
				
				String key = params[i].substring(0, splitIndex);

				if (!this.params.containsKey(key)) {
					if (splitIndex < params[i].length()) {
						String value = params[i].substring(splitIndex + 1);
						this.params.put(key, new String[] { value });
					}
				}
			}
		}
	}

}


再次运行代码:
(1)Filter进入两次:
引用
URL:http://localhost:8080/t/sa
***-----From QueryString-----***
userid=123456789
username=rensanning
***-----From ParameterMap-----***
username=rensanning,
userid=123456789,


引用
URL:http://localhost:8080/t/sb
***-----From QueryString-----***
myname=rensanning
mycountry=china
***-----From ParameterMap-----***
username=rensanning,
name=newname,
userid=123456789,


(2)最终页面结果:
引用

***-----From QueryString-----***

myname=rensanning

mycountry=china




***-----From ParameterMap-----***

username=rensanning,

name=newname,

userid=123456789,

mycountry=china,

myname=rensanning,

分享到:
评论
2 楼 rensanning 2013-10-10  
public class ParameterFilter implements Filter {

在Filter中调用ParameterRequestWrapper。源码:ForwardParameter.rar
1 楼 JavaSon_caibi 2013-10-10  
java.lang.InstantiationException:com.paic.web.filter.ParameterFilter 继承HttpServletRequestWrapper 报个实例化异常。

相关推荐

    filter对request请求拦截,对请求参数进行修改

    对request请求进行拦截,对请求参数修改。常用于前台提交表单参数关键字的过滤。此工具可以对参数拦截并转义后提交到对应的处理类。 除了添加两个JsFilter.java和GetHttpServletRequestWrapper.java之外,需要在web....

    java web 修改request携带的参数信息

    虽然修改请求参数在某些场景下很有用,但需要注意的是,这可能会影响应用程序的安全性和性能。修改参数值可能破坏原有的业务逻辑,因此只应在必要时进行。同时,Filter的执行会增加服务器的处理时间,所以要优化...

    java filter打印请求返回参数

    ### Java Filter 打印请求返回参数详解 #### 一、背景与目的 在Web开发过程中,经常需要在请求处理流程中增加一些通用的功能,比如日志记录、性能监控、安全控制等。Java Servlet规范提供了Filter机制来实现这些...

    java修改请求参数

    在`doFilter()`方法中,可以读取原始请求参数,进行修改,然后使用`HttpServletRequestWrapper`包装修改后的参数,再继续请求链。 3. **处理逻辑内修改**:如果修改参数的逻辑比较单一,也可以选择在具体处理请求的...

    HttpServletRequestWrapper应用(二):包装文件上传请求

    在实际应用中,我们还需要创建一个Servlet或者Filter来拦截请求,然后使用`HttpServletRequestWrapper`的实例替换原始的请求。这样,所有的文件上传操作都会通过我们的包装类进行,从而实现自定义的处理逻辑。 总结...

    在使用实现过滤器进行request包装,获取内层request的分析

    在Java Web开发中,过滤器(Filter)是一个非常重要的组件,它允许我们在请求到达目标Servlet之前对其进行处理,或者在响应返回给客户端之后进行操作。在本篇内容中,我们将深入探讨如何实现一个过滤器来包装request...

    在Spring MVC或Spring Boot中使用Filter打印请求参数问题

    然而,如果在处理JSON类型的POST请求时,直接在Filter中打印请求参数,可能会遇到一些问题,如上述描述中的`IOException: Stream closed`异常。这是因为当我们读取请求体时,如果没有正确地管理流,流可能在我们尝试...

    防止SQL注入和XSS攻击Filter

    - **功能描述**:`XssHttpServletRequestWrapper`类继承自`HttpServletRequestWrapper`,其主要任务是对`HttpServletRequest`的方法进行重写,以便在获取请求参数时进行过滤操作。 - **实现细节**:具体来说,需要...

    struts的request包装替换的思想

    在Struts框架中,请求(Request)扮演着至关重要的角色,因为它承载了客户端的所有请求信息。本篇文章将深入探讨“Struts的request包装替换的思想”,以及如何通过自定义Filter来实现这一过程。 在标准的Struts框架...

    javaweb中Filter(过滤器)的常见应用.docx

    在JavaWeb开发中,`Filter`(过滤器)是一种非常重要的组件,它主要用于对用户请求进行预处理或者对响应结果进行后处理。通过合理的配置和设计,开发者可以利用`Filter`来实现诸如统一字符编码设置、权限验证、日志...

    用Filter来解决中文表单提交问题

    对于GET请求,由于HTTP规范要求GET请求的参数应在URL中编码,所以直接使用`Request`包装原始请求,通过`Request`的重写方法来确保获取的参数已经过正确的编码转换。 总的来说,`TomcatFormFilter`通过在请求到达...

    XSSFilter源码

    在`web.xml`文件中,XSSFilter被定义为一个过滤器,并通过以下参数进行配置: 1. **`excludeUrls`**: - **作用**:指定不需要经过XSS过滤的URL列表。 - **示例**:`/member/contribute@/admin/cms@/flow_...

    STRUTS:filter过滤器

    例如,可以使用`HttpServletRequestWrapper`和`HttpServletResponseWrapper`来实现这一功能。要改变某个方法的行为,通常需要继承这些包装类并重写相应的方法。 #### 总结 过滤器在Struts框架中扮演着关键角色,...

    完美解决request请求流只能读取一次的问题

    在Filter中,我们可以使用自定义的HttpServletRequestWrapper来实现流的重复读取。例如: ```java @Component @WebFilter public class RequestSqlValidFilter implements Filter { private final Logger logger = ...

    jsp中Filter类实现过滤器功能

    3. **替换敏感词**:在`HttpReqWrapper`类中重写了`getParameter()`方法,该方法遍历`map`中的所有键值对,如果请求参数中包含键,则用对应的值(通常是星号)进行替换。 4. **销毁**:`destroy()`方法在容器卸载...

    Web开发 乱码过滤器.zip

    开发者通常会创建一个包裹类(Wrapper)来覆盖默认的行为,确保请求参数在解码时使用正确的字符编码。例如,`GetRequest.java`可能重写了`getParameter()`和`getParameterValues()`方法,使用UTF-8编码来解析请求...

    用装饰模式装饰HttpServletRequest对象

    通过这种方式,装饰模式使得在不修改HttpServletRequest本身的情况下,我们可以扩展其功能,解决了在Servlet过滤器中无法直接修改请求参数的问题。 总之,装饰模式在Servlet编程中提供了一种灵活的、非侵入式的扩展...

    Tomcat和weblogic中文乱码问题解决方案

    然而,在使用这些服务器时,中文乱码问题总是会出现。这是因为在编码和解码过程中存在不一致的问题。幸运的是,这个问题可以通过简单的解决方案来解决。 乱码的根本原因 中文乱码问题的根本原因是编码和解码的不...

    通过过滤器(Filter)解决JSP的Post和Request中文乱码问题

    而在JSP中,通常情况下,如果服务器或者浏览器的默认编码不是UTF-8,而是其他编码(如GBK等),那么在使用Post或Get方法提交或获取中文参数时,就会出现乱码。 在JSP中,过滤器(Filter)是用于拦截请求和响应,...

Global site tag (gtag.js) - Google Analytics