spring mvc 中 使用filter 对http请求中的参数做一些简单的校验工作

时间:2021-09-27 23:16:53

1. 在在说本篇文章正文之前,先简单了解一下spring mvc 中整个请求的响应流程

Spring MVC整个框架是围绕DispatcherServlet这个核心来展开的,他负责截获http请求并将请求分发给响应的处理器处理,最终返回请求响应,下面用一个简单的图来描述一下整个请求的过程。

spring mvc 中 使用filter 对http请求中的参数做一些简单的校验工作

在Http请求中,包含请求行,请求头,空行和请求体,所以我们可以在请求还没有到达最终的处理器之前对请求参数进行一定的过滤,包括安全过滤。

2. 下面就讲解如何在spring mvc中配置过滤器。

   2.1 首先在代码中定义一个我们自己的过滤器,实现javax.servlet.Filter接口

   spring mvc 中 使用filter 对http请求中的参数做一些简单的校验工作

2.2 我们还需要一个继承HttpServletRequestWrapper的类,用来获取请求头和请求体的参数和值

public class HttpServletRequestParameterWrapper extends HttpServletRequestWrapper {

    public HttpServletRequestParameterWrapper(HttpServletRequest request) {
        super(request);
    }

    /**  * 删除空白字符  * @param parameter  * @return  */  @Override
    public String[] getParameterValues(String parameter) {
        String[] results = super.getParameterValues(parameter);
        if (results == null) {
            return null;
        }
        int count = results.length;
        String[] trimResults = new String[count];

        for (int i = 0; i < count; i++) {
            trimResults[i] = results[i].trim();
        }
        return trimResults;
    }

    /**  * 覆盖getParameter方法,将请求参数名和参数值都做xss过滤  * @param name  * @return  */  @Override
    public String getParameter(String name) {
        String value = super.getParameter(xssEncode(name));
        if (value != null) {
            value = xssEncode(value);
        }
        return value;
    }

    /**  * 覆盖getHeader方法,将请求头中参数名和参数值都做xss过滤  * @param name  * @return  */  @Override
    public String getHeader(String name) {
        String value = super.getHeader(xssEncode(name));
        if (value != null) {
            value = xssEncode(value);
        }
        return value;
    }

    private String xssEncode(String value) {
        value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
        value = value.replaceAll("script", "");
        return value;
    }

3. 过滤器代码写完之后还需要在web.xml中配置

    

<!-- 自定义过滤器 -->
<filter>
  <filter-name>ghubFilter</filter-name>
  <filter-class>com.ctp.ghub.filter.GhubFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>ghubFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 自定义过滤器 -->

<!-- Spring MVC初始化 -->
<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/spring-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
至此,自定义的过滤器就已经配置完了,项目启动的时候,访问controller中的接口,在过滤器中打断点,就会发现请求会进入断点,并对其中的请求参数和值做出相应的过滤。每天学习一点,进步一点!