`

过滤器实现去除空格、增加参数功能

    博客分类:
  • JAVA
 
阅读更多

环境:JDK1.7 TOMCAT7 spring3.2

 1.过滤器代码

    1.1基于spring过滤器

    

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.filter.OncePerRequestFilter;

public class SessionFilter extends OncePerRequestFilter {

	@Override
	protected void doFilterInternal(HttpServletRequest request,
			HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
			ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper(request);
	        filterChain.doFilter(requestWrapper, response);
	}
}

 

   1.2基于javax.servlet.Filter
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/**
 * Servlet Filter implementation class CommonFilter
 */
public class CommonFilter implements Filter {

    /**
     * Default constructor. 
     */
    public CommonFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
                HttpServletRequest hr=(HttpServletRequest) request;
  
                String url = hr.getServletPath().trim();
                if (url.equals("xxx")){//不需要过滤的url,这里可以使用一个配置文件配置这些url,项目启动时读入内存一个map中,然后在这里进行判断
		    //我定义的是urlFilterMap,然后在这里urlFilterMap.containsValue(url)进行判断	
                    chain.doFilter(hr, response);
                }else{
                   ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest)request);
		   chain.doFilter(requestWrapper, response);
                }
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}
 2.过滤器包装类
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
    
    private Map<String , String[]> params = new HashMap<String, String[]>();

    @SuppressWarnings("unchecked")
	public ParameterRequestWrapper(HttpServletRequest request) {
        // 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似
        super(request);
        //将参数表,赋予给当前的Map以便于持有request中的参数
        this.params.putAll(request.getParameterMap());
        this.modifyParameterValues();
    }
    //重载一个构造方法
    public ParameterRequestWrapper(HttpServletRequest request , Map<String , Object> extendParams) {
        this(request);
        addAllParameters(extendParams);//这里将扩展参数写入参数表
    }
    
    public void modifyParameterValues(){//将parameter的值去除空格后重写回去
    	Set<String> set =params.keySet();
    	Iterator<String> it=set.iterator();
	    while(it.hasNext()){
           String key= (String) it.next();
           String[] values = params.get(key);
           values[0] = values[0].trim();
           params.put(key, values);
	     }
    }
    
    @Override
    public String getParameter(String name) {//重写getParameter,代表参数从当前类中的map获取
        String[]values = params.get(name);
        if(values == null || values.length == 0) {
            return null;
        }
        return values[0];
    }
    
    public String[] getParameterValues(String name) {//同上
         return params.get(name);
    }

   public void addAllParameters(Map<String , Object>otherParams) {//增加多个参数
        for(Map.Entry<String , Object>entry : otherParams.entrySet()) {
            addParameter(entry.getKey() , entry.getValue());
        }
    }


    public void addParameter(String name , Object value) {//增加参数
        if(value != null) {
            if(value instanceof String[]) {
                params.put(name , (String[])value);
            }else if(value instanceof String) {
                params.put(name , new String[] {(String)value});
            }else {
                params.put(name , new String[] {String.valueOf(value)});
            }
        }
    }
}
 
3.web.xml配置
3.1 基于spring 配置
<filter>
	<filter-name>sessionFilter</filter-name>
	<filter-class>com.cnpc.oms.common.service.SessionFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>sessionFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
 3.2基于javax.serlvet.Filter
 <filter>
	<filter-name>commonFilter</filter-name>
	<filter-class>com.cnpc.oms.common.service.CommonFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>commonFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
    
 
 
分享到:
评论
3 楼 machao299 2016-11-15  
楼主你好,现在测试发现有个问题,modifyParameterValues 已经被执行,但去空格后的内容没有回写到requerst里,程序里获取的字段依然是带空格的内容。
        this.params.putAll(request.getParameterMap()); 
        this.modifyParameterValues();

第17行取出所有parameter 放在了第10行的 private Map<String , String[]> params = new HashMap<String, String[]>(); 里, 然后modifyParameterValues做空格处理, 没看见你回写parameter 是不是应该有个和this.params.putAll(request.getParameterMap());   对应的回写动作?
2 楼 沉默的水 2016-07-28  
貌似所有的jsp:include通过jsp:param传进去的参数都变null了
1 楼 superscorpio 2013-05-16  
modifyParameterValues里获取的String数组可能是null吧 。

包结构都搞出来了。

相关推荐

    java过滤器对所有参数去除前后空格

    对项目中的所有参数去除前后空格...可以基于此过滤器实现过滤跨站脚本攻击,参数的增加,修改!敏感词汇过滤。实现原理为重写HttpServletRequestWrapper,获取参数的方法。include和 Forwarded 内部转发不在过滤之内。

    参数去空过滤器

    参数去空过滤器(Params Trim Filter)就是这类过滤器的一个实例,它的主要功能是对请求参数进行预处理,去除不必要的空格。在实际应用中,用户输入的数据可能会包含空格,这可能导致各种问题,如数据库查询错误、...

    url参数值过滤器

    在描述中提到的"paramsTrimFilter"可能是一个具体的过滤器实现,其功能是对URL参数的值进行修剪(trimming),即去除参数值前后的空白字符。这在处理用户输入时非常有用,因为用户可能会无意间在输入中添加额外的...

    struts2 trim拦截器 过滤首尾空格

    TrimInterceptor就是一个这样的拦截器,它的主要功能是过滤请求数据的首尾空格。 TrimInterceptor实现 TrimInterceptor继承自AbstractInterceptor,重写了intercept方法。在intercept方法中,首先获取了...

    用struts2拦截器实现输入数据过滤前后空格

    要实现输入数据过滤前后空格的功能,我们需要编写一个自定义的拦截器。首先,创建一个新的Java类,让它继承自`org.apache.struts2.interceptor.StrutsPrepareAndExecuteInterceptor`或者`...

    文本重行过滤器

    文本重行过滤器是一种在处理大量文本数据时非常实用的工具,它的主要功能是消除文本文件中的重复行,使得处理后的文件只包含唯一的、不重复的行内容。这个工具对于数据清洗、分析或者日志处理等领域有着广泛的应用,...

    ExtremeDoc文本过滤器(未完成)

    这通常涉及到导入项目的库文件,配置过滤器的参数,然后在代码中调用相应的函数。 例如,一个简单的使用示例可能是: ```java import com.extremedoc.filter.TextFilter; public class Main { public static ...

    VC复选框不响应空格按键

    - 程序级过滤:如果你的程序全局处理了空格键,可能会阻止复选框接收到该事件,需要检查全局消息过滤逻辑。 7. **调试与测试**: 使用MFC的调试工具,如监视窗口和断点,检查消息是否正确发送到你的处理函数,...

    过滤特殊字符及表情符

    - **自定义过滤器**:对于更复杂的需求,可以编写自定义过滤器,如提供的`TextWatcherImpl.java`和`MaxLengthInputFilter.java`,这两个文件可能是Android开发中的文本监听器和输入过滤器实现。 4. **TextWatcher...

    vue 过滤器filter实例详解

    Vue.js 提供了内置的过滤器以及自定义过滤器功能,使得我们可以根据项目需求定制自己的数据处理逻辑。 过滤器的使用方式主要有两种: 1. **管道操作符**:在模板中的双大括号 {{ }} 内,通过管道操作符(|)来调用...

    RemoveSpace.rar

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

    asp去除html标记与空格的正则

    - **HTA文件去除html控件认证和接收命令行参数**:HTA(HTML应用程序)是基于HTML的桌面应用,可以处理更高级的功能,如命令行参数和安全控制。 - **asp.net去除html的函数代码**:ASP.NET是ASP的升级版,提供了更多...

    angular-cleanurl:Angular Web 安全 url 字符串过滤器

    过滤器是Angular中一种特殊的服务,用于处理和格式化数据,`cleanurl`就是这样一个过滤器,它确保了用户输入的字符串能够安全地用作URL路径或参数。 `angular-cleanurl`过滤器的主要目的是消除或替换字符串中可能...

    用装饰模式装饰HttpServletRequest对象

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

    C# 去掉特定字符(使用ASC码)

    在C#编程中,有时我们需要处理字符串,去除其中的特定字符。这可能是因为这些字符对程序的处理或者数据的解析产生了不利影响。本方法提供了一种解决方案,即通过ASCII码来识别并移除字符串中的特定字符。下面我们将...

    php过滤危险html代码

    通过上述内容的学习,我们可以了解到如何使用PHP编写一个简单的过滤器函数来过滤潜在的恶意HTML代码。这种过滤方法不仅可以提高网站的安全性,还能确保页面布局的稳定性。在实际应用中,可以根据具体需求调整正则...

    Asp.net MVC 对所有用户输入的字符串字段做Trim处理的方法

    IModelBinder接口允许开发者自定义数据绑定逻辑,即在数据绑定到控制器动作(Action)的方法参数或模型(Model)属性之前,可以插入自定义的处理逻辑。 在MVC 4.6中,可以创建一个实现了IModelBinder接口的自定义...

    ASP ISchool随机抽题考试系统

    1.增加选择题添加自动过滤答案区域空格功能 修改 1.整理了考试页面函数 修正 1.修正抽题函数中的一个BUG 2.修正无法批量删除题目的BUG V3.3Sp2(20100429) 修改 1.改良安装权限检测 修正 1.修正主观题评分判断分值...

    python 模板语言 - jinja2 金家兔.pdf

    使用过滤器时,只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入。 for循环 jinja2中的for循环用于迭代Python的数据类型,包括列表、元组和字典。在jinja...

    vue实现多条件和模糊搜索功能

    - `filters`对象定义了自定义过滤器`filterSex`用于显示性别名称。 - `created`钩子函数中调用`search`方法进行数据初始化。 - `search`方法接收一个对象参数,包含搜索条件,通过`filter`函数返回筛选后的数据列表...

Global site tag (gtag.js) - Google Analytics