文档章节

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

Juno1842
 Juno1842
发布于 2016/12/07 09:30
字数 842
阅读 207
收藏 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
博文 89
码字总数 38898
作品 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对ajax中get与post的使用

JAVAWeb对ajax中get与post的使用 01.使用背景及ajax的介绍 在进行javaWeb的开发中难免会遇到异步请求的情况,为了使网站局部的信息发生变化,而不影响整个页面的话,博主知道的也只用ajax了。...

meiqi0538
04/04
0
0
Javaweb组件--Filter

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

a1ie2
2017/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
2
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
7
0
在Ubuntu安装和配置Sphinx

Ubuntu系统默认是配置有sphinx的,先检查一下,别多此一举。。。。。 在开始本指南之前,您需要: 一个Ubuntu 16.04服务器。 sudo的一个非root用户,您可以通过以下设置本教程 。 安装在服务...

阿锋zxf
今天
1
0
Qt编写输入法V2018超级终结版

对于qt嵌入式linux开发人员来说,输入法一直是个鸡肋问题,要么不支持实体键盘同步,要么不能汉字输入,要么不支持网页输入等,这几年通过陆续接触大量的各种输入法应用场景客户,得到真实需...

飞扬青云
今天
2
0
TypeScript基础入门之高级类型的多态的 this类型

转发 TypeScript基础入门之高级类型的多态的 this类型 高级类型 多态的this类型 多态的this类型表示的是某个包含类或接口的子类型。 这被称做F-bounded多态性。 它能很容易的表现连贯接口间的...

durban
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部