`

如何使用wrapper在filter修改request参数(转)

    博客分类:
  • web
 
阅读更多

在filter里如何修改提交的参数呢? 

整个request接口是没有提供这样的API的,即使取出ParameterMap,也是只读的。 

必须创建一个wrapper:class ParameterRequestWrapper,继承:HttpServletRequestWrapper,里面至少要实现这些方法: 

Java代码  收藏代码
  1. private Map params;  
  2. public ParameterRequestWrapper(HttpServletRequest request,Map newParams) {  
  3.   super(request);  
  4.   this.params=newParams;  
  5. }  
  6. public Map getParameterMap() {  
  7.   return params;  
  8. }  
  9. public Enumeration getParameterNames() {  
  10.   Vector l=new Vector(params.keySet());  
  11.   return l.elements();  
  12. }  
  13. public String[] getParameterValues(String name) {  
  14.   Object v = params.get(name);  
  15.   if(v==null){  
  16.     return null;  
  17.   }else if(v instanceof String[]){  
  18.     return (String[]) v;  
  19.   }else if(v instanceof String){  
  20.     return new String[]{(String) v};  
  21.   }else{  
  22.     return new String[]{v.toString()};  
  23.   }  
  24. }  
  25. public String getParameter(String name) {  
  26.   Object v = params.get(name);  
  27.   if(v==null){  
  28.     return null;  
  29.   }else if(v instanceof String[]){            
  30.     String []strArr=(String[]) v;  
  31.     if(strArr.length>0){  
  32.       return strArr[0];  
  33.     }else{  
  34.       return null;  
  35.     }  
  36.   }else if(v instanceof String){  
  37.     return (String) v;  
  38.   }else{  
  39.     return v.toString();  
  40.   }  
  41. }      


map, names, values, 一个都不能少啊。 


在filter里,这样写: 

Java代码  收藏代码
  1. HttpServletRequest request=(HttpServletRequest) req;  
  2. HashMap m=new HashMap(request.getParameterMap());  
  3. String fullURL = request.getRequestURI()+"?"+request.getQueryString();  
  4. if(matchURL(fullURL) && processParamsters(m)){  
  5.   ParameterRequestWrapper wrapRequest=new ParameterRequestWrapper(request,m);         
  6.   chain.doFilter(wrapRequest, resp);  
  7. }else{  
  8.   chain.doFilter(req, resp);  
  9. }  


matchURL是匹配url来决定是否生效,processParamsters是自定义函数,想怎么处理就怎么处理。 

这样的话,经过filter之后,实际上request变成了ParameterRequestWrapper,以后的filter将会操作这个类。不过似乎用在ActionForward上有点问题,还没解决。 

这也是j2ee推荐的办法,除了改参数外还可以作很多事,完全可以定制request。

分享到:
评论

相关推荐

    使用HttpServletRequestWrapper在filter修改request参数

    标题“使用HttpServletRequestWrapper在filter修改request参数”揭示了主要知识点,即如何在过滤器中通过自定义`HttpServletRequestWrapper` 子类来动态改变请求参数。这通常用于处理如数据验证、安全过滤、参数转换...

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

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

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

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

    cas 配置client 1.0 &2.0 及proxy DEMO 说明

    server-3.3.1-release\cas-server-3.3.1\modules ,将cas-server-webapp-3.3.1.war 重命名为cas.war,并将war包拷贝到tomcat5.5以上版本的webapps目录下(在此对server jdbc支持不做详细解读,测试使用CAS simaple...

    RemoveSpace.rar

    本文将深入探讨如何使用`Filter`(过滤器)来去除参数前后所有的空格,以确保数据的准确性和一致性。这在处理用户输入或者进行数据验证时尤其重要,因为额外的空格可能会导致业务逻辑错误或者数据存储问题。 首先,让...

    Web开发 乱码过滤器.zip

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

    spring boot整合CAS Client实现单点登陆验证的示例

    此外,我们还可以配置其他的认证参数,例如 cas.authentication-url-patterns、cas.validation-url-patterns、cas.request-wrapper-url-patterns 等。 在手动配置 CAS Client 时,我们需要在 web.xml 文件中添加...

    Gzip工具打包JS、CSS文件,后台解压缩

    本文将详细介绍如何使用Gzip来打包JS和CSS文件,并在Java后台通过Filter实现解压缩。 首先,我们需要了解Gzip的工作原理。Gzip基于DEFLATE算法,该算法结合了LZ77(一种无损数据压缩算法)和霍夫曼编码。它通过查找...

    Python装饰器用法示例小结

    装饰器接收一个函数`fun`作为参数,并在其内部定义了一个新的函数`wrapper`。`wrapper`函数执行原始函数(在这里是`func1`),并在其前后添加额外的行为,即打印"over!"。 ```python def outer(fun): # 返回一个新...

    JAVA Web 用过滤器和包装器消除乱码

    过滤器(Filter)和包装器(Wrapper)是解决此类问题的有效工具。本文将深入探讨如何使用JAVA Web的过滤器和包装器来消除乱码问题。 首先,我们来看过滤器(Filter)。在JAVA Web中,过滤器是Servlet规范的一部分,...

    Java笔记word.docx

    多个参数查询:MyBatis使用参数为Map 在处理多个参数查询时,可以将这些参数封装成一个`Map`对象,然后在SQL语句中通过`#{key}`的方式引用这些参数。 **示例**: ```java Map, Object> params = new HashMap(); ...

    Android编程向服务器发送请求时出现中文乱码问题的解决方法

    1. **编码参数值**:在Android应用中,使用`URLEncoder.encode(value, "UTF-8")`对包含中文的参数值进行编码,这里的"UTF-8"是目标编码格式。例如,如果你有一个名为`value`的字符串,应该在发送前使用此函数进行...

    tomcat7.070 源码及转成eclipse

    在Java Web开发领域,Apache Tomcat是一个广泛使用的开源应用服务器,尤其在处理Servlet和JSP方面。Tomcat 7.0.70是7.x系列的一个版本,它包含了对Java Servlet 3.0规范的支持,以及其他一些性能改进和bug修复。源码...

    Java简单实现session保存到redis的方法示例

    该方法通过配置web.xml文件中的过滤器,使用RedisTemplate来保存session数据,并在过滤器中实现对session的读取和写入操作。 配置Web.xml文件 在Web.xml文件中,需要添加一个过滤器,以便对session进行处理。该...

    servlet2.4doc

    The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. doGet...

    tomcat6源码,学习服务引擎

    《深入解析Tomcat6:源码剖析与服务...这将有助于在实际项目中更高效地使用和定制Tomcat,进一步提升开发效率和系统性能。同时,这种深入的学习也能为开发者向Tomcat7、Tomcat8甚至更高级别的版本迁移打下坚实基础。

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    3.3.3.5 获取参数 16 3.3.3.6 创建HttpResponse对象 16 3.3.3.7 静态资源处理器和servlet处理器 17 第4章 tomcat的默认连接器 18 4.1 简介 18 4.2 HTTP1.1的新特性 18 4.2.1 持久化连接 18 4.2.2 编码 18 4.2.3 状态...

    Java servlet-api应用文档

    - `ServletConfig`接口:每个Servlet实例在初始化时都会获得一个`ServletConfig`对象,它包含了Servlet的初始化参数。 - `ServletContext`接口:代表整个Web应用程序的共享环境,可以存储全局信息,监听器可以监听...

    tomcat 7.0源码

    3. **请求分发**:请求通过`org.apache.catalina.connector.Request`类进行进一步处理,找到对应的Context、Wrapper(Servlet)。 4. **Servlet调用**:调用Servlet的`service`方法,执行业务逻辑。 5. **响应生成**...

    React-Testing-Frameworks:测试React组件和Redux 利用酶,Moxios等

    在React开发中,确保代码的质量和可维护性是至关重要的,而进行测试是达到这一目标的关键步骤。本文将深入探讨如何使用React测试框架,特别是酶(Enzyme)和Moxios,来测试React组件以及与Redux的集成。 **React测试...

Global site tag (gtag.js) - Google Analytics