文档章节

JAVAWEB开发实现对请求头、请求参数的过滤

Juno1842
 Juno1842
发布于 2016/12/07 09:30
字数 842
阅读 209
收藏 0

1、服务器容器取得客户端发送的参数都是通过HttpServletRequest来获取的,HttpServletRequest存在如下三种获取参数的方法:

  • getParameter(name),返回单个值。
  • getParameterValues(name),返回一个数组。
  • getParameterMap(),把客户端提交参数封装为一个Map返回。K:name,V:value。

当我们使用servlet的时候一般都是使用前两种,struts1使用的第2种,struts2(xwork)则使用的第3种

2、 根据JavaEE servlet2.5规范要求,ServletRequest.getParameterMap()需返回一个immutable(不可改变)的java.util.Map实现,tomcat在这方面没有严格遵照规范,而weblogic严格遵照规范。JavaEE规范之所以这样要求,是出于“安全因素”的考虑。规范描述如下:
public java.util.Map getParameterMap()


Returns a java.util.Map of the parameters of this request. Request parameters are extra information sent with the request. For HTTP servlets, parameters are contained in the query string or posted form data.


Returns: an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.

3、对 2 中描述的情况进行代码调整,已在tomcat、weblogic下验证过,其中包括:请求装饰类、过滤器、web.xml下配置过滤器:

请求装饰类:JzHttpServletRequest

package com.juno.fw.wrapper;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang3.StringUtils;

/**
 * 使用装饰模块模式(Decorator)包装HttpServletRequest对象,实现请求头、请求参数的特定字符转义功能。
 * 
 * @author       Juno
 * @since		 1.6
 * @version      1.0
 * @date 	     2016.04.14
 * @date 	     Juno update at 2016.12.05
 */
public class JnHttpServletRequest extends HttpServletRequestWrapper {

    public HttpServletRequest request;
    public Map<String, String[]> params = new HashMap<String, String[]>(); 

    public JnHttpServletRequest(HttpServletRequest request) {
    	
        super(request);
        this.request = request;
        // 创建对象时,将immutable请求对象MAP复制到本实例的内部对象params中
        // 通过过滤params以实现过虑请求参数的特定字符
        this.params.putAll(request.getParameterMap()); 
    }

    @Override
	public String getHeader(String name) {
    	
    	String value = this.request.getHeader(name);
        if (value == null) {
            return null;
        }
        return filterDatas(value);
        // return super.getHeader(name);
	}

    @Override
    public String getParameter(String name) {
    	
    	
    	String value = super.getParameter(name);
    	if (value == null) {
            return null;
        }
    	return filterDatas(value);
    	
    	// return super.getParameter(name);
    }
    
    @Override
    public String[] getParameterValues(String name) {
        
        String[] values = super.getParameterValues(name);
        if (values != null) {
            for (int i = 0; i < values.length; i++) {
                values[i] = filterDatas(values[i]);
            }
        }
        return values;
        // return super.getParameterValues(name);
    }
    
    /*
     * STRUTS2调用此方法获取请求参数
     * 
     * WEBLOGIC下不允许修改request.getParameterMap()返回的MAP对象
     * 
     * 
     * @see javax.servlet.ServletRequestWrapper#getParameterMap()
     */
    @Override
    public Map<String, String[]> getParameterMap() {
    
    	// HashMap<String, String[]> paramMap = (HashMap<String, String[]>) super.getParameterMap();

        for (Iterator<Entry<String, String[]>> iterator = params.entrySet().iterator(); iterator.hasNext(); ) {
            Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) iterator.next();
            String[] values = (String[]) entry.getValue();
            for (int i = 0; i < values.length; i++) {
                if (values[i] instanceof String) {
                    values[i] = filterDatas(values[i]);
                }
            }
            entry.setValue(values);
        }
        
        return params;
        // super.getParameterMap();
    }
    
	/**
	 * 过滤参数内容中的敏感字符
	 * 
	 * @param input 被过滤字符串
	 * @return
	 * @author Juno add at 2016.09.05.
	 * @author Juno update at 2016.12.05.
	 */
	private String filterDatas(String input) {
		
		if (StringUtils.isBlank(input)) {
			return "";
		}
		// 过滤敏感字符
		return input.replaceAll("\\s+\'|\'\\s+|\\s+\"|\"\\s+|<|>|(?i)\\s+or\\s+|(?i)\\s+and\\s+|(?i)exec\\s+|(?i)insert\\s+|(?i)select\\s+|(?i)delete\\s+|(?i)update\\s+|(?i)count\\s+|(?i)chr\\s+|(?i)mid\\s+|(?i)master\\s+|(?i)truncate\\s+|(?i)char\\s+|(?i)declare\\s+|(?i)script\\s+|(?i)frame\\s+|(?i)etc\\s+|(?i)style\\s+|(?i)expression\\s+", "");
	}
}

过滤器类:

package com.jz.org.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;

import com.jz.org.wrapper.JzHttpServletRequest;

/**
 * HTTP请求头、请求参数等的转义过滤器
 * 
 * @author       Juno
 * @since		 1.6
 * @version      1.0
 * @date 	     Juno add at 2016.04.14
 */
public class JzServletRequestFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;

        JzHttpServletRequest jzHttpServletRequest = new JzHttpServletRequest(httpServletRequest);
        
        chain.doFilter(jzHttpServletRequest, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        
    }
    
    public void destroy() {
        
    }
}

过滤器配置:

  	<!-- 请求头、请求参数等的转义过滤器-->
  	<filter>
		<filter-name>JzServletRequestFilter</filter-name>
		<filter-class>com.jz.org.filter.JzServletRequestFilter</filter-class>
  	</filter>

	<filter-mapping>
		<filter-name>JzServletRequestFilter</filter-name>
		<url-pattern>/*</url-pattern>
  	</filter-mapping>

 

© 著作权归作者所有

共有 人打赏支持
Juno1842
粉丝 3
博文 95
码字总数 41134
作品 0
佛山
私信 提问
javaweb开发之Filter

一、简介 在Servlet2.3规范中定义了过滤器,它对servlet容器调用servlet的过程进行拦截,从而在servlet进行响应处理的前后实现一些特殊的功能。 过滤器实现了一个责任链的模式。多个过滤器形...

小米米儿小
2013/12/06
0
0
关于HTTP请求的post与get

HTTP定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST. HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每个HTTP-GE...

manlianman
2014/04/10
0
0
责任链设计模式应用场景示例(过滤器、拦截器)

责任链设计模式(Chain of Responsibility)的应用有:Java Web中的过滤器链、Struts2中的拦截器栈。 先看一个问题: 给定一个字符串“被就业了:),敏感信息,<script>”,对其中的HTML标记...

凯文加内特
2016/04/19
86
0
Javaweb组件--Filter

今天讲的是Javaweb的三大组件之:Filter Filter ,过滤器,主要是对web服务器管理的所有web资源,比如Jsp,Servlet,静态图片等进行拦截,从而实现一些特殊的功能。比如权限控制,请求拦截,...

a1ie2
2017/11/16
0
0
servlet 拦截器、过滤器、监听器区别

过滤器,是在JavaWeb中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后在传入Servlet或者Struts2的,action进行业务逻辑,比如过滤掉非法URL(不是login.do的请...

小风89
2016/06/30
148
0

没有更多内容

加载失败,请刷新页面

加载更多

IOC的学习(1)

1.IOC理论概要 java中,一个对象A怎么才能调用对象B? 当一个对象的构建,需要多个其他对象时,对象和对象有复杂的构建关系。spring帮助我们维系对象的依赖关系,降低系统的实现成本,前提是...

杨健-YJ
18分钟前
1
0
Spring 的 getBean 方法源码解析

文本将从以下几个方面介绍 相关文章 FactoryBean 接口 BeanFactory 接口 BeanFactory 接口 和 FactoryBean 接口的区别 getBean 方法的源码解析 Spring 循环依赖的解决方式 相关文章 Spring 中...

TSMYK
21分钟前
0
0
李鸿章六百多字参倒豪门重臣,晚清第一奏折,藏尽顶级权谋话术!

道光二十七年(1847年),二十四岁的李鸿章高中进士,列二甲第十三名。 在此期间,有桩轶事挺有意思。 会试时,李鸿章的房师为当时的名士孙锵鸣。发榜后,孙锵鸣见自己这一房只考中了李鸿章、...

乔老哥
27分钟前
1
0
PTA-基础编程题目集-7-14 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。 输入格式: 输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。 输出格式: 首先顺序输出从A到B的所有整数,每...

niithub
28分钟前
3
0
Spring Qualifier的使用

摘要 spring 的 qualifier 平常使用一般直接是使用id 来限定,不过spring给我们提供了更强大的功能。 使用方法 直接使用 直接在@Qualifier中限定bean的id 在bean上使用@Qualifier来指定后续使...

52iSilence7
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部