`

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

    博客分类:
  • 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 内部转发不在过滤之内。

    RemoveSpace.rar

    Spring环境中用Filter(过滤器)去除参数前后所有空格

    ASP ISchool随机抽题考试系统

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

    TrueCrypt的国内延伸版本CnCrypt1.0

    增加了与Windows资源管理器的集成(加载加密卷,保存至加密卷,粉碎选择文件) 增加了悬浮框,支持拖放右键等功能 在子界面中增加了Banner 托盘菜单支持快速加载,支持加载历史记录,加载收藏卷等功能。 对加密卷...

    DotNetTextBox所见即所得编辑器控件 v3.3.1

    3) 上传功能增加过滤显示的功能,文件列表将只会显示当前上传功能所允许上传类型的文件。如图片上传功能里文件列表将只会显示*.jpg、*.gif、*.png、*.bmp等图像文件。 4) 修正了上传功能中重命名文件的时候...

    商用版本文本编辑器DotNetTextBoxV6.0.8Source 源码

    2)更强大的Word文档导入编辑器功能,无需特殊的服务器权限或安装客户端组件,只要拥有最基本的ASP.NET读写文件权限即可实现导入Word文档,并且还支持最新的DOCX文档格式! 3)更细致的工具栏区域划分! 4)全新的可隐藏...

    TrueCrypt的国内延伸版本CnCrypt V1.11(单一文件绿色版)

    去除了有关系统盘\系统驱动器部分(UEFI之后已无法支持之前实现方式) 增加加密卷擦除功能 增加密码生成器功能 增加了密码输入软键盘功能 增加了磁盘痕迹擦除工具 增加了悬浮框,支持拖放加载,右键功能菜单等。 ...

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

    主要介绍了Asp.net MVC 如何对所有用户输入的字符串字段做Trim处理,需要的朋友可以参考下

    禅道项目管理软件 6.2.stable 版

    1167 邮件配置参数中过滤空格字符 1208 项目中bug列表的优先级还是用图标来显示 1437 调整桌面提醒工具权限错误的提示 1358 计划列表页面描述里面P标签的margin去掉。 1433 调整项目各个操作的界面。 1343 从用例...

    DotNetTextBox V6.0.10 商业版 下载 (已知最新)

    2)更强大的Word文档导入编辑器功能,无需特殊的服务器权限或安装客户端组件,只要拥有最基本的ASP.NET读写文件权限即可实现导入Word文档,并且还支持最新的DOCX文档格式! 3)更细致的工具栏区域划分! 4)全新的可...

    补丁模块(带源码)InlinePatch,Hook,内存DLL注入等等

    参数 过滤器, 文本型, 可空, 格式:“MP3文件(*.mp3)|*.mp3|媒体文件(*.mpg)|*.mpg” .参数 初始路径, 文本型, 可空, 可以被省略。如果本参数被省略,默认从“我的文档”开始。否则,请给出盘符,如“d:” .子程序 ...

    精易模块[源码] V5.15

    精易模块 V5.15 what’s new:(2015XXXX) 1、新增“线程_枚举”枚举指定进程ID中所有线程列表,成功返回线程数量,失败...10、新增“进程_取IO写入计数”,功能与XP系统下任务管理器一样。 11、新增“进程_取IO写入...

    Python Cookbook

    1.5 去除字符串两端的空格 11 1.6 合并字符串 11 1.7 将字符串逐字符或逐词反转 14 1.8 检查字符串中是否包含某字符集合中的字符 15 1.9 简化字符串的translate方法的使用 18 1.10 过滤字符串中不属于指定集合...

    《程序天下:JavaScript实例自学手册》光盘源码

    3.12 去除字符串的前后空格 3.13 刷新时清空所有文本框 3.14 随意改变大小的文本框 3.15 文本框的自动全选 3.16 文本框滚动导航 3.17 按钮获取焦点 3.18 文本框获取焦点弹出下拉框 3.19 文本框简单的单击效果 3.20 ...

    程序天下:JavaScript实例自学手册

    3.12 去除字符串的前后空格 3.13 刷新时清空所有文本框 3.14 随意改变大小的文本框 3.15 文本框的自动全选 3.16 文本框滚动导航 3.17 按钮获取焦点 3.18 文本框获取焦点弹出下拉框 3.19 文本框简单的单击效果 3.20 ...

    net学习笔记及其他代码应用

    9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。 10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text....

    C#编程经验技巧宝典

    85 &lt;br&gt;0131 巧截字符串的数字 86 &lt;br&gt;0132 如何存储变长字符串 86 &lt;br&gt;0133 在进行字符串比较时忽略大小写 87 &lt;br&gt;0134 如何去除字符串尾空格 87 &lt;br&gt;0135 如何去掉字符串中所有空格 ...

    Delphi开发范例宝典目录

    实例299 多功能查询过滤器 396 9.2 查询变量 401 实例300 利用变量查询字符串数据 402 实例301 利用变量查询字符串型数据 403 实例302 利用变量查询日期型数据 404 9.3 数据前若干名 406 实例303 查询...

Global site tag (gtag.js) - Google Analytics