文档章节

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

Juno1842
 Juno1842
发布于 2016/12/07 09:30
字数 842
阅读 205
收藏 0
点赞 0
评论 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
博文 8
码字总数 36434
作品 0
佛山
javaweb开发之Filter

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

小米米儿小 ⋅ 2013/12/06 ⋅ 0

关于HTTP请求的post与get

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

manlianman ⋅ 2014/04/10 ⋅ 0

责任链设计模式应用场景示例(过滤器、拦截器)

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

凯文加内特 ⋅ 2016/04/19 ⋅ 0

JAVAWeb对ajax中get与post的使用

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

meiqi0538 ⋅ 04/04 ⋅ 0

Javaweb组件--Filter

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

a1ie2 ⋅ 2017/11/16 ⋅ 0

servlet 拦截器、过滤器、监听器区别

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

小风89 ⋅ 2016/06/30 ⋅ 0

Javaweb组件--Servlet

今天要学习的是Javaweb的三大组件:Servlet 因为框架(包括Spring Boot)本质上是对原始的JavaWeb的高度封装,如果了解JavaWeb的开发基础,框架学起来也会相对的很轻松。 Servlet是用来处理客户...

a1ie2 ⋅ 2017/11/16 ⋅ 0

javaweb入门笔记(2)-http入门

javaweb入门笔记(2)-http入门 标签: javaweb http [TOC] 对HTTP协议早有了解,最近在看javaweb,视频中讲到了这部分,就把视频的内容整理归纳下 请求(Request) 一个完整的HTTP请求包括:一个...

brianway ⋅ 2016/02/06 ⋅ 0

JavaWeb(五)Servlet-2

1、HTTP简介 WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。 HTTP是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议集...

leeqico ⋅ 05/12 ⋅ 0

Servlet的Filter的使用

Filter可认为是Servlet的“加强版”,主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成相应,这一点与Servlet相同,但...

摆渡者 ⋅ 2014/03/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL 数据库设计总结

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节...

OSC_cnhwTY ⋅ 47分钟前 ⋅ 0

多线程(四)

线程池和Exector框架 什么是线程池? 降低资源的消耗 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3 提高线程的可管理性。 线程池要做些什...

这很耳东先生 ⋅ 54分钟前 ⋅ 0

使用SpringMVC的@Validated注解验证

1、SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 [java] view plain copy edit.userna...

瑟青豆 ⋅ 今天 ⋅ 0

19.压缩工具gzip bzip2 xz

6月22日任务 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍: linux中常见的一些压缩文件 .zip .gz .bz2 .xz .tar .gz .tar .bz2 .tar.xz 建立一些文...

王鑫linux ⋅ 今天 ⋅ 0

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 今天 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 今天 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 今天 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 今天 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 今天 ⋅ 0

Linux(CentOS)下配置php运行环境及nginx解析php

【part1:搭建php环境】 1.选在自己需要安装的安装包版本,wget命令下载到服务器响应目录 http://php.net/releases/ 2.解压安装包 tar zxf php-x.x.x 3.cd到解压目录执行如下操作 cd ../php-...

硅谷课堂 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部