处理过程:
(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,
分享到:
相关推荐
对request请求进行拦截,对请求参数修改。常用于前台提交表单参数关键字的过滤。此工具可以对参数拦截并转义后提交到对应的处理类。 除了添加两个JsFilter.java和GetHttpServletRequestWrapper.java之外,需要在web....
虽然修改请求参数在某些场景下很有用,但需要注意的是,这可能会影响应用程序的安全性和性能。修改参数值可能破坏原有的业务逻辑,因此只应在必要时进行。同时,Filter的执行会增加服务器的处理时间,所以要优化...
### Java Filter 打印请求返回参数详解 #### 一、背景与目的 在Web开发过程中,经常需要在请求处理流程中增加一些通用的功能,比如日志记录、性能监控、安全控制等。Java Servlet规范提供了Filter机制来实现这些...
在`doFilter()`方法中,可以读取原始请求参数,进行修改,然后使用`HttpServletRequestWrapper`包装修改后的参数,再继续请求链。 3. **处理逻辑内修改**:如果修改参数的逻辑比较单一,也可以选择在具体处理请求的...
在实际应用中,我们还需要创建一个Servlet或者Filter来拦截请求,然后使用`HttpServletRequestWrapper`的实例替换原始的请求。这样,所有的文件上传操作都会通过我们的包装类进行,从而实现自定义的处理逻辑。 总结...
在Java Web开发中,过滤器(Filter)是一个非常重要的组件,它允许我们在请求到达目标Servlet之前对其进行处理,或者在响应返回给客户端之后进行操作。在本篇内容中,我们将深入探讨如何实现一个过滤器来包装request...
然而,如果在处理JSON类型的POST请求时,直接在Filter中打印请求参数,可能会遇到一些问题,如上述描述中的`IOException: Stream closed`异常。这是因为当我们读取请求体时,如果没有正确地管理流,流可能在我们尝试...
- **功能描述**:`XssHttpServletRequestWrapper`类继承自`HttpServletRequestWrapper`,其主要任务是对`HttpServletRequest`的方法进行重写,以便在获取请求参数时进行过滤操作。 - **实现细节**:具体来说,需要...
在Struts框架中,请求(Request)扮演着至关重要的角色,因为它承载了客户端的所有请求信息。本篇文章将深入探讨“Struts的request包装替换的思想”,以及如何通过自定义Filter来实现这一过程。 在标准的Struts框架...
在JavaWeb开发中,`Filter`(过滤器)是一种非常重要的组件,它主要用于对用户请求进行预处理或者对响应结果进行后处理。通过合理的配置和设计,开发者可以利用`Filter`来实现诸如统一字符编码设置、权限验证、日志...
对于GET请求,由于HTTP规范要求GET请求的参数应在URL中编码,所以直接使用`Request`包装原始请求,通过`Request`的重写方法来确保获取的参数已经过正确的编码转换。 总的来说,`TomcatFormFilter`通过在请求到达...
在`web.xml`文件中,XSSFilter被定义为一个过滤器,并通过以下参数进行配置: 1. **`excludeUrls`**: - **作用**:指定不需要经过XSS过滤的URL列表。 - **示例**:`/member/contribute@/admin/cms@/flow_...
例如,可以使用`HttpServletRequestWrapper`和`HttpServletResponseWrapper`来实现这一功能。要改变某个方法的行为,通常需要继承这些包装类并重写相应的方法。 #### 总结 过滤器在Struts框架中扮演着关键角色,...
在Filter中,我们可以使用自定义的HttpServletRequestWrapper来实现流的重复读取。例如: ```java @Component @WebFilter public class RequestSqlValidFilter implements Filter { private final Logger logger = ...
3. **替换敏感词**:在`HttpReqWrapper`类中重写了`getParameter()`方法,该方法遍历`map`中的所有键值对,如果请求参数中包含键,则用对应的值(通常是星号)进行替换。 4. **销毁**:`destroy()`方法在容器卸载...
开发者通常会创建一个包裹类(Wrapper)来覆盖默认的行为,确保请求参数在解码时使用正确的字符编码。例如,`GetRequest.java`可能重写了`getParameter()`和`getParameterValues()`方法,使用UTF-8编码来解析请求...
通过这种方式,装饰模式使得在不修改HttpServletRequest本身的情况下,我们可以扩展其功能,解决了在Servlet过滤器中无法直接修改请求参数的问题。 总之,装饰模式在Servlet编程中提供了一种灵活的、非侵入式的扩展...
然而,在使用这些服务器时,中文乱码问题总是会出现。这是因为在编码和解码过程中存在不一致的问题。幸运的是,这个问题可以通过简单的解决方案来解决。 乱码的根本原因 中文乱码问题的根本原因是编码和解码的不...
而在JSP中,通常情况下,如果服务器或者浏览器的默认编码不是UTF-8,而是其他编码(如GBK等),那么在使用Post或Get方法提交或获取中文参数时,就会出现乱码。 在JSP中,过滤器(Filter)是用于拦截请求和响应,...