Filter过滤器除去部分URL链接

在web.xml中配置的Filter如下:

<filter>
    <filter-name>HazardousParametersFilter</filter-name>
    <filter-class>com.galaxy.apps.common.HazardousParametersFilter</filter-class>
    <init-param>
	<param-name>ignoreRegex</param-name>
	<param-value>/upload/mobileUploadPic</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>HazardousParametersFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

可以看到url-pattern的设置里面过滤的url规则是/*,如果要把/upload/mobileUploadPic排除在过滤url之外。

可以结合init-param的初始化参数和HttpServletRequest的getServletPath()方法来判断。

 <init-param>
    <param-name>ignoreRegex</param-name>
    <param-value>/upload/mobileUploadPic</param-value>
 </init-param>

下面是是过滤器HazardousParametersFilter中的具体操作

package com.galaxy.apps.common;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

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 org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.galaxy.apps.utils.HazardousParameterHelper;
import com.jovtec.galaxy.util.RequestHelper;
import com.jovtec.galaxy.util.StringHelper;

public class HazardousParametersFilter implements Filter {
	private static final Log logger = LogFactory.getLog("SecurityLogger");

	private String ignoreRegex;
	private String[] ignoreRegexArray;

	public String getIgnoreRegex() {
		return ignoreRegex;
	}

	public void setIgnoreRegex(String ignoreRegex) {
		this.ignoreRegex = ignoreRegex;
	}

	public String[] getIgnoreRegexArray() {
		return ignoreRegexArray;
	}

	public void setIgnoreRegexArray(String[] ignoreRegexArray) {
		this.ignoreRegexArray = ignoreRegexArray;
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		ignoreRegex = filterConfig.getInitParameter("ignoreRegex");
		if (StringUtils.isNotEmpty(ignoreRegex)) {
			ignoreRegexArray = ignoreRegex.split(",");
		}
		return;
	}

	public void destroy() {
	}

	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		String requestURI = request.getRequestURI();

		boolean isExcludedPage = false;
		for (String page : ignoreRegexArray) {// 判断是否在过滤url之外
			if (request.getServletPath().equals(page)) {
				isExcludedPage = true;
				break;
			}
		}

		// 如果得不到URI,或者URI是后台地址,则直接返回
		if (StringHelper.isEmpty(requestURI) || requestURI.startsWith("/portal/") || isExcludedPage) {
			filterChain.doFilter(servletRequest, servletResponse);
			return;
		}

		// TODO html、shtml如何优化性能?也需要过滤,否则shtml的include无法进入本filter
		// TODO 忽略ignoreRegex指定的URL,/portal/也应该到这个里面去忽略

		boolean hasHazardous = false;
		Map pm = servletRequest.getParameterMap();
		if (pm != null && !pm.isEmpty()) { // 性能优化
			Set keySet = pm.keySet();
			for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
				String key = (String) iterator.next();
				String[] values = (String[]) pm.get(key);
				if (HazardousParameterHelper.hasHazardousChar(values)) {
					hasHazardous = true;
					break;
				}
			}
		}

		// 如果有风险字符,则将其转义,记录日志,继续执行程序
		if (hasHazardous) {
			logger.info("该URL接收了风险字符参数:" + request.getRequestURL() + ",客户IP:" + request.getRemoteAddr() + ",参数列表:"
					+ RequestHelper.getParameterMapToString(pm));
			HazardousRequestWrapper hazReqWrapper = new HazardousRequestWrapper(request);
			filterChain.doFilter(hazReqWrapper, servletResponse);
		} else {
			filterChain.doFilter(servletRequest, servletResponse);
		}
	}
}

完~

时间: 2024-12-16 13:56:21

Filter过滤器除去部分URL链接的相关文章

Filter 过滤器

Filter 过滤器 原文链接:http://tianweili.github.io/blog/2015/01/26/java-filter/ 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处

[Java] JSP笔记 - Filter 过滤器

一.什么是Web过滤器 Servlet API 很久以前就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充. Servlet 过滤器是可插入的 Web 组件,它允许我们实现 Web 应用程序中的预处理和后期处理逻辑.过滤器支持 servlet 和 JSP 页面的基本请求处理功能,比如日志记录.性能.安全.会话处理.XSLT 转换,等等. 过滤器最初是随 Java Servlet 2.3 规范发布的. Servlet 过滤器是什么?Servlet 过滤器是

javaweb学习总结(四十二)——Filter(过滤器)学习

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过F

Java Web总结十九Filter过滤器

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:例如Jsp,Servlet,静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.自动登录.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发Web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter.通过

ElKstack-解决nginx日志url链接包含中文logstash报错问题

logstash报错现象 Trouble parsing json {:source=>"message", :raw=>"{\"@timestamp\":\"2016-05-30T14:51:27+08:00\",\"host\":\"10.139.48.166\",\"clientip\":\"180.109.110.203\",\"

Filter过滤器(1)

Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 其顺序图如下(Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filt

javaweb之Filter过滤器详解

快速入门 1.新建一个类,实现Filter接口 2.实现doFilter()方法,打印一句话,来证明能够进行拦截 3.在web.xml中进行配置(参照Servlet配置) 4.访问一个页面,看看能不能拦截 例子: import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.serv

Filter过滤器

一,概念 Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 二.Filter简介 Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filt

Java中的Filter过滤器

Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理.使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交