XssFilter 创建与配置

简介: XssFilter 创建与配置


XssFilter 创建与配置


增加XssFilter过滤器

创建XssFilter

package com.dongao.filter;
import com.alibaba.druid.util.DruidWebUtils;
import com.alibaba.druid.util.PatternMatcher;
import com.alibaba.druid.util.ServletPathMatcher;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class XssFilter implements Filter {
  private String initParameter;
  private Set<String> initParameters;
  protected PatternMatcher pathMatcher = new ServletPathMatcher();
  private String contextPath;
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    //初始化加载需要排除,无需过滤的后缀
    initParameter = filterConfig.getInitParameter("exclude");
    if (initParameter != null && initParameter.trim().length() != 0) {
      initParameters = new HashSet<String>(Arrays.asList(initParameter.split("\\s*,\\s*")));
    }
    contextPath = DruidWebUtils.getContextPath(context);
  }
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String requestURI = httpRequest.getRequestURI();
    if (isExclusion(requestURI)) { // 无需过滤
      chain.doFilter(request, response);
      return;
    }else { // 需过滤
      chain.doFilter(new XssHttpServletRequestWrapper(httpRequest), response);
    }
  }
  @Override
  public void destroy() {
  }
  public boolean isExclusion(String requestURI) {
    if (initParameters == null) {
      return false;
    }
    if (contextPath != null && requestURI.startsWith(contextPath)) {
      requestURI = requestURI.substring(contextPath.length());
      if (!requestURI.startsWith("/")) {
        requestURI = "/" + requestURI;
      }
    }
    for (String pattern : initParameters) {
      if (pathMatcher.matches(pattern, requestURI)) {
        return true;
      }
    }
    return false;
  }
}


创建XssHttpServletRequestWrapper

package com.dongao.filter;
import org.apache.commons.lang3.StringEscapeUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.regex.Pattern;
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
    /**
     * Xss请求适配器
     * @param request
     */
  public XssHttpServletRequestWrapper(HttpServletRequest request) {
    super(request);
  }
    /**
     *对请求头部过滤
     * @param name
     * @return
     */
    @Override
    public String getHeader(String name) {
        String value = super.getHeader(name);
        if (value == null) {
            return null;
        }
        return StringEscapeUtils.escapeHtml4(value);
    }
    /**
     *对参数过滤
     * @param name
     * @return
     */
    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        if (value == null) {
            return null;
        }
        return StringEscapeUtils.escapeHtml4(value);
   }
    /**
     *对数组参数过滤
     * @param name
     * @return
     */
    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if(values != null) {
            int length = values.length;   
            String[] escapseValues = new String[length];
            for(int i = 0; i < length; i++){
                escapseValues[i] = StringEscapeUtils.escapeHtml4(values[i]);
            }
            return escapseValues;
        }
        return super.getParameterValues(name);
    }
}


在web.xml增加过滤器

  <filter>
    <filter-name>XssEscape</filter-name>
    <filter-class>com.dongao.filter.XssFilter</filter-class>
    <!--无需过滤的后缀-->
    <init-param>
      <param-name>exclude</param-name>
      <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>XssEscape</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

相关文章
|
7月前
|
JavaScript
创建应用
创建应用
54 6
|
7月前
|
自然语言处理 算法
WordPiece词表的创建
WordPiece词表的创建
49 0
|
7月前
|
Python
默认的模板配置
默认的模板配置。
35 1
|
计算机视觉
VS2019如何添加已有的配置表(使得之前已经配置好的属性可以无需配置直接使用)
VS2019如何添加已有的配置表(使得之前已经配置好的属性可以无需配置直接使用)
182 0
|
Kubernetes NoSQL 网络协议
初识 K8s,创建一个 guestbook 留言簿应用
本文介绍一个简单的 K8s 上手应用,希望通过这个简单的实践让大家对 K8s 的核心概念有更深入的理解。这个案例要在 Kubernetes 集群上部署一个名叫 guestbook 的 CURD 应用。guestbook 是 Kubernetes 社区的一个经典的应用示例,它有一个 Web 界面来让用户进行 CURD 操作,然后向一个 Redis 主节点写入数据,从多个 Redis 从节点读去数据。
|
存储 Java Linux
创建和删除|学习笔记
快速学习创建和删除。
|
JavaScript CDN
创建一个简单的色轮
创建一个简单的色轮
245 0
创建一个简单的色轮
|
数据挖掘 Windows
如何快速创建 Rproject 文件?
昨晚在看公众号的时候,发生信技能树写了这么一篇文章:你还在复制粘贴一个Rproject文件吗。在 windows 中使用 ContextMenuManager 帮助你右键新建一个 Rproject 文件。
681 0
如何快速创建 Rproject 文件?
|
设计模式 安全
单例的创建步骤和使用说明
单例的创建步骤和使用说明
174 0
单例的创建步骤和使用说明
|
运维 Linux
RH236创建Brick
RH236创建Brick
148 0
RH236创建Brick