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

  1. <filter>
  2. <filter-name>HazardousParametersFilter</filter-name>
  3. <filter-class>com.galaxy.apps.common.HazardousParametersFilter</filter-class>
  4. <init-param>
  5. <param-name>ignoreRegex</param-name>
  6. <param-value>/upload/mobileUploadPic</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>HazardousParametersFilter</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

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

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

  1. <init-param>
  2. <param-name>ignoreRegex</param-name>
  3. <param-value>/upload/mobileUploadPic</param-value>
  4. </init-param>

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

  1. package com.galaxy.apps.common;
  2.  
  3. import java.io.IOException;
  4. import java.util.Iterator;
  5. import java.util.Map;
  6. import java.util.Set;
  7.  
  8. import javax.servlet.Filter;
  9. import javax.servlet.FilterChain;
  10. import javax.servlet.FilterConfig;
  11. import javax.servlet.ServletException;
  12. import javax.servlet.ServletRequest;
  13. import javax.servlet.ServletResponse;
  14. import javax.servlet.http.HttpServletRequest;
  15.  
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.apache.commons.logging.Log;
  18. import org.apache.commons.logging.LogFactory;
  19.  
  20. import com.galaxy.apps.utils.HazardousParameterHelper;
  21. import com.jovtec.galaxy.util.RequestHelper;
  22. import com.jovtec.galaxy.util.StringHelper;
  23.  
  24. public class HazardousParametersFilter implements Filter {
  25. private static final Log logger = LogFactory.getLog("SecurityLogger");
  26.  
  27. private String ignoreRegex;
  28. private String[] ignoreRegexArray;
  29.  
  30. public String getIgnoreRegex() {
  31. return ignoreRegex;
  32. }
  33.  
  34. public void setIgnoreRegex(String ignoreRegex) {
  35. this.ignoreRegex = ignoreRegex;
  36. }
  37.  
  38. public String[] getIgnoreRegexArray() {
  39. return ignoreRegexArray;
  40. }
  41.  
  42. public void setIgnoreRegexArray(String[] ignoreRegexArray) {
  43. this.ignoreRegexArray = ignoreRegexArray;
  44. }
  45.  
  46. public void init(FilterConfig filterConfig) throws ServletException {
  47. ignoreRegex = filterConfig.getInitParameter("ignoreRegex");
  48. if (StringUtils.isNotEmpty(ignoreRegex)) {
  49. ignoreRegexArray = ignoreRegex.split(",");
  50. }
  51. return;
  52. }
  53.  
  54. public void destroy() {
  55. }
  56.  
  57. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
  58. throws IOException, ServletException {
  59. HttpServletRequest request = (HttpServletRequest) servletRequest;
  60. String requestURI = request.getRequestURI();
  61.  
  62. boolean isExcludedPage = false;
  63. for (String page : ignoreRegexArray) {// 判断是否在过滤url之外
  64. if (request.getServletPath().equals(page)) {
  65. isExcludedPage = true;
  66. break;
  67. }
  68. }
  69.  
  70. // 如果得不到URI,或者URI是后台地址,则直接返回
  71. if (StringHelper.isEmpty(requestURI) || requestURI.startsWith("/portal/") || isExcludedPage) {
  72. filterChain.doFilter(servletRequest, servletResponse);
  73. return;
  74. }
  75.  
  76. // TODO html、shtml如何优化性能?也需要过滤,否则shtml的include无法进入本filter
  77. // TODO 忽略ignoreRegex指定的URL,/portal/也应该到这个里面去忽略
  78.  
  79. boolean hasHazardous = false;
  80. Map pm = servletRequest.getParameterMap();
  81. if (pm != null && !pm.isEmpty()) { // 性能优化
  82. Set keySet = pm.keySet();
  83. for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
  84. String key = (String) iterator.next();
  85. String[] values = (String[]) pm.get(key);
  86. if (HazardousParameterHelper.hasHazardousChar(values)) {
  87. hasHazardous = true;
  88. break;
  89. }
  90. }
  91. }
  92.  
  93. // 如果有风险字符,则将其转义,记录日志,继续执行程序
  94. if (hasHazardous) {
  95. logger.info("该URL接收了风险字符参数:" + request.getRequestURL() + ",客户IP:" + request.getRemoteAddr() + ",参数列表:"
  96. + RequestHelper.getParameterMapToString(pm));
  97. HazardousRequestWrapper hazReqWrapper = new HazardousRequestWrapper(request);
  98. filterChain.doFilter(hazReqWrapper, servletResponse);
  99. } else {
  100. filterChain.doFilter(servletRequest, servletResponse);
  101. }
  102. }
  103. }

完~

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

  1. [Java] JSP笔记 - Filter 过滤器

    一.什么是Web过滤器 Servlet API 很久以前就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充. Servlet 过滤器是可插入的 Web 组件, ...

  2. Filter过滤器介绍

    简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ht ...

  3. filter 过滤器(监听)

    Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...

  4. Java 中的 Filter 过滤器详解

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

  5. Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  6. spring filter过滤器

    1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...

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

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  8. Java Web进阶——Filter过滤器

    一.过滤器的介绍: 在Servlet规范2.3中定义了过滤器,它是一个服务器端的组件,可以截取用户端的请求与响应信息,并且对这些信息进行过滤. Servlet过滤器本身并不生成请求和响应对象,只是提供 ...

  9. Java中的Filter过滤器

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

随机推荐

  1. 被自己以为的GZIP秀到了

    问题的开始 我司某产品线有这么一个神奇接口 (https://host/path/customQuery) 该接口在预发或线上缓存正常的情况下TTFB为150ms左右(可以认为服务处理时间差不多就是T ...

  2. mysql5.7.20压缩版安装

    1.官网下载.zip格式的MySQL Server的压缩包,选择x86或x64版,并解压. 2. 创建 data文件夹 及 my.ini文件,并编辑 [mysqld] # 设置为自己MYSQL的安装目 ...

  3. Android网络笔记

    (1)网络状态: ConnectivityManager负责管理所有连接的服务(如:系统服务,3G/4G,WiFi,蓝牙等).查看网络状态的类是NetWorkInfo,它是通过Connectivity ...

  4. [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  5. linq to entity不识别方法"System.String ToString()"

    将班级id以字符串形式输入如:"1111,1112,1113".数据库里的id为int型,在数据路里找到匹配的相应班级转换成列表.在这里爆出问题:不识别方法"System ...

  6. tree 中文(转)

    原文:http://www.dutor.net/index.php/2009/05/tree-cn-code/ 简介: tree命令可以以目录树的形式显示指定(默认显示这个文件系统)目录的所有文件夹和 ...

  7. oracle range分区表已经有了MAXVALUE 分区,如何添加分区?要不能删除MAXVALUE分区里的数据,不影响在线应用。

    来做个实验说明该问题:1.创建个分区表SQL> create table p_range_test 2 (id number,name varchar2(100)) 3 partition by ...

  8. LeetCode167 两数之和 II - 输入有序数组

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  9. Flutter 应用入门:计数器

    用Android Studio创建的Flutter应用模板默认是一个简单的计数器示例. // 导入包 import 'package:flutter/material.dart'; // 应用入口,启 ...

  10. 【Oracle】查看表或视图的创建语句

    这里用到的是Oracle的DDL语句的用法 用于获得某个schema下所有的表.索引.视图.存储过程.函数的DDL set pagesize 0 set long 90000 set feedback ...