0x01 环境搭配

如果还不会搭建jsp环境的可以按照下面的文章跟着搭建

Mac版IDEA创建maven web项目-详细过程: https://www.yuque.com/pmiaowu/gpy1q8/npv0fr

0x02 前言

  1. 作用:Filter也叫过滤器,通常配置在MVCServletJSP请求前面
  2. 常用于后端权限控制
  3. 统一的Http请求参数过滤
  4. 统一的XSSSQL注入、SSRF
  5. 等等攻击检测的处理
  1. 前置操作-必须要做!!!!
  2. 1. 对准 webapp目录 右键
  3. 2. 标记 webapp目录 源码

image.png

0x03 配置Filter 与 基础例子

  1. WebFilter类,可配置的属性有这些

image.png

0x03.1 通过注解

0x03.1.1 通过注解配置映射关系

  1. 通过注解可以直接在GlobalFilter.java完成配置这样就无需在web.xml配置映射了
  1. 常用配置项
  2. 参数: urlPatterns
  3. 作用: 配置要拦截的资源
  4. 以指定资源匹配,例如:"/hello.jsp"
  5. 以目录匹配,例如:"/Servlet/*"
  6. 以后缀名匹配,例如:"*.jsp"
  7. 通配符,拦截所有web资源,例如:"/*"
  8. 例子:
  9. @WebFilter(
  10. // 过滤器的名字
  11. // 一般来说保持和类名一致即可
  12. filterName = "/GlobalFilter",
  13. // 拦截所有web资源
  14. urlPatterns = "/*")
  15. public class GlobalFilter implements Filter {
  1. 参数: initParams
  2. 作用: 配置初始化参数
  3. 例子:
  4. @WebFilter(
  5. // 过滤器的名字
  6. // 一般来说保持和类名一致即可
  7. filterName = "/GlobalFilter",
  8. // 初始化的参数,这里初始化了两个
  9. initParams = {
  10. @WebInitParam(name = "origin", value = "@WebFilter"),
  11. @WebInitParam(name = "testName", value = "testValue")
  12. })
  13. public class GlobalFilter implements Filter {
  1. 参数: dispatcherTypes
  2. 作用: 配置拦截的类型,可配置多个
  3. 默认为DispatcherType.REQUEST
  4. 其中DispatcherType是个枚举类型,有下面几个值
  5. FORWARD //转发的
  6. INCLUDE //包含在页面的
  7. REQUEST //请求的
  8. ASYNC //异步的
  9. ERROR //出错的
  10. 例子:
  11. @WebFilter(
  12. filterName = "/GlobalFilter",
  13. // 设置拦截
  14. dispatcherTypes = {
  15. DispatcherType.REQUEST,
  16. DispatcherType.ASYNC,
  17. DispatcherType.ERROR
  18. })
  19. public class GlobalFilter implements Filter {

0x03.1.1 通过注解运行-例子

  1. 在这目录: src->main->webapp->com->Filter
  2. 创建一个文件: GlobalFilter.java
  3. 创建完毕以后GlobalFilter.java需要实现了Filter接口,并实现了3个方法
  4. 3个方法的作用已经在注释中写清楚了
  5. package com.Filter;
  6. import javax.servlet.*;
  7. import javax.servlet.annotation.WebFilter;
  8. import javax.servlet.annotation.WebInitParam;
  9. import java.io.IOException;
  10. @WebFilter(
  11. filterName = "/GlobalFilter",
  12. urlPatterns = "/*",
  13. initParams = {
  14. @WebInitParam(name = "origin", value = "@WebFilter"),
  15. @WebInitParam(name = "testName", value = "testValue")
  16. },
  17. dispatcherTypes = {
  18. DispatcherType.REQUEST,
  19. DispatcherType.INCLUDE,
  20. DispatcherType.FORWARD,
  21. DispatcherType.ERROR,
  22. DispatcherType.ASYNC})
  23. public class GlobalFilter implements Filter {
  24. /**
  25. * web 应用程序启动时
  26. * web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能
  27. * 从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)
  28. * 开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象
  29. *
  30. * @param config
  31. * @throws ServletException
  32. */
  33. @Override
  34. public void init(FilterConfig config) throws ServletException {
  35. // 获取初始化参数
  36. String origin = config.getInitParameter("origin");
  37. String testName = config.getInitParameter("testName");
  38. // 输出初始化参数
  39. System.out.println("GlobalFilter类起源: " + origin);
  40. System.out.println("GlobalFilter类testName值: " + testName);
  41. }
  42. /**
  43. * 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法
  44. *
  45. * @param request 当前请求
  46. * @param response 当前响应
  47. * @param chain 用于访问后续过滤器
  48. * @throws IOException
  49. * @throws ServletException
  50. */
  51. @Override
  52. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  53. // 输出站点名称
  54. response.setCharacterEncoding("GBK");
  55. response.getWriter().println("我是全局过滤器: GlobalFilter类");
  56. // 允许访问目标资源,简称 放行
  57. chain.doFilter(request, response);
  58. }
  59. /**
  60. * Filter容器在销毁过滤器实例前调用该方法
  61. */
  62. @Override
  63. public void destroy() {
  64. System.out.println("GlobalFilter类,被摧毁了");
  65. }
  66. }

image.png

  1. 创建好GlobalFilter.java以后
  2. 这边设置的是 拦截所有web资源 urlPatterns = "/*"
  3. 启动项目以后,任意访问个文件即可
  4. 例如: http://127.0.0.1:8081/mavenJspTest_war/index.jsp

image.png
image.png

0x03.2 通过web.xml

0x03.2.1 通过web.xml配置映射关系

  1. 通过在web.xml也可以很方便的完成配置映射
  2. 打开 WEB-INF目录下的web.xml
  3. 最基础的样子如下:
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <web-app version="2.5"
  6. xmlns="http://java.sun.com/xml/ns/javaee"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  9. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  10. </web-app>
  1. 设置Filter
  2. 作用: 定义这个Filter等待其它程序调用
  3. 例如:
  4. <filter>
  5. <!-- 类名 -->
  6. <filter-name>HelloFilter</filter-name>
  7. <!-- 所在的包路径 -->
  8. <filter-class>com.Filter.HelloFilter</filter-class>
  9. </filter>
  10. 例子:
  11. <?xml version="1.0" encoding="UTF-8"?>
  12. <web-app version="2.5"
  13. xmlns="http://java.sun.com/xml/ns/javaee"
  14. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  15. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  16. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  17. <filter>
  18. <!-- 类名 -->
  19. <filter-name>HelloFilter</filter-name>
  20. <!-- 所在的包路径 -->
  21. <filter-class>com.Filter.HelloFilter</filter-class>
  22. </filter>
  23. </web-app>
  1. 常用配置项
  2. 标签: <url-pattern> </url-pattern>
  3. 作用: 配置要拦截的资源
  4. 以指定资源匹配,例如:"/hello.jsp"
  5. 以目录匹配,例如:"/Servlet/*"
  6. 以后缀名匹配,例如:"*.jsp"
  7. 通配符,拦截所有web资源,例如:"/*"
  8. 注意: 设置了这个才会正常运行这个filter
  9. 例如:
  10. <filter-mapping>
  11. <!-- 与 <filter> 标签里面的 <filter-name> 字段保持一致 -->
  12. <filter-name>HelloFilter</filter-name>
  13. <!--拦截路径,表示拦截/TomcatTest这个目录的所有资源-->
  14. <url-pattern>/TomcatTest/*</url-pattern>
  15. </filter-mapping>
  16. 例子:
  17. <?xml version="1.0" encoding="UTF-8"?>
  18. <web-app version="2.5"
  19. xmlns="http://java.sun.com/xml/ns/javaee"
  20. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  21. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  22. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  23. <filter>
  24. <!-- 类名 -->
  25. <filter-name>HelloFilter</filter-name>
  26. <!-- 所在的包路径 -->
  27. <filter-class>com.Filter.HelloFilter</filter-class>
  28. </filter>
  29. <filter-mapping>
  30. <!-- 与 <filter> 标签里面的 <filter-name> 字段保持一致 -->
  31. <filter-name>HelloFilter</filter-name>
  32. <!--拦截路径,表示拦截/TomcatTest这个目录的所有资源-->
  33. <url-pattern>/TomcatTest/*</url-pattern>
  34. </filter-mapping>
  35. </web-app>
  1. 标签: <init-param> </init-param>
  2. 作用: 配置初始化参数
  3. 例如:
  4. <init-param>
  5. <param-name>origin</param-name>
  6. <param-value>web.xml</param-value>
  7. </init-param>
  8. 例子:
  9. <?xml version="1.0" encoding="UTF-8"?>
  10. <web-app version="2.5"
  11. xmlns="http://java.sun.com/xml/ns/javaee"
  12. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  13. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  14. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  15. <filter>
  16. <!-- 类名 -->
  17. <filter-name>HelloFilter</filter-name>
  18. <!-- 所在的包路径 -->
  19. <filter-class>com.Filter.HelloFilter</filter-class>
  20. <init-param>
  21. <param-name>origin</param-name>
  22. <param-value>web.xml</param-value>
  23. </init-param>
  24. <init-param>
  25. <param-name>testName</param-name>
  26. <param-value>testValue</param-value>
  27. </init-param>
  28. </filter>
  29. </web-app>
  1. 标签: <dispatcher> </dispatcher>
  2. 作用: 配置拦截的类型,可配置多个
  3. 默认为DispatcherType.REQUEST
  4. 其中DispatcherType是个枚举类型,有下面几个值
  5. FORWARD //转发的
  6. INCLUDE //包含在页面的
  7. REQUEST //请求的
  8. ASYNC //异步的
  9. ERROR //出错的
  10. 例如:
  11. <dispatcher>REQUEST</dispatcher>
  12. 例子:
  13. <?xml version="1.0" encoding="UTF-8"?>
  14. <web-app version="2.5"
  15. xmlns="http://java.sun.com/xml/ns/javaee"
  16. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  17. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  18. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  19. <filter>
  20. <!-- 类名 -->
  21. <filter-name>HelloFilter</filter-name>
  22. <!-- 所在的包路径 -->
  23. <filter-class>com.Filter.HelloFilter</filter-class>
  24. </filter>
  25. <filter-mapping>
  26. <!-- 与 <filter> 标签里面的 <filter-name> 字段保持一致 -->
  27. <filter-name>HelloFilter</filter-name>
  28. <!--拦截路径,表示拦截/TomcatTest这个目录的所有资源-->
  29. <url-pattern>/TomcatTest/*</url-pattern>
  30. <dispatcher>REQUEST</dispatcher>
  31. <dispatcher>FORWARD</dispatcher>
  32. <dispatcher>INCLUDE</dispatcher>
  33. <dispatcher>ERROR</dispatcher>
  34. </filter-mapping>
  35. </web-app>

0x03.2.2 通过web.xml运行-例子

  1. 在这目录: src->main->webapp->com->Filter
  2. 创建一个文件: HelloFilter.java
  3. 在这目录: src->main->webapp->com->Filter
  4. 创建一个文件: HelloFilter.java
  5. 创建完毕以后HelloFilter.java需要实现了Filter接口,并实现了3个方法
  6. package com.Filter;
  7. import javax.servlet.*;
  8. import java.io.IOException;
  9. public class HelloFilter implements Filter {
  10. @Override
  11. public void init(FilterConfig config) throws ServletException {
  12. // 获取初始化参数
  13. String origin = config.getInitParameter("origin");
  14. String testName = config.getInitParameter("testName");
  15. // 输出初始化参数
  16. System.out.println("HelloFilter类起源: " + origin);
  17. System.out.println("HelloFilter类testName值: " + testName);
  18. }
  19. @Override
  20. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  21. // 输出站点名称
  22. response.setCharacterEncoding("GBK");
  23. response.getWriter().println("站点网址:http://pmiaowu.phpoop.com");
  24. // 允许访问目标资源,简称 放行
  25. chain.doFilter(request, response);
  26. }
  27. @Override
  28. public void destroy() {
  29. System.out.println("HelloFilter类,被摧毁了");
  30. }
  31. }
  1. 通过在web.xml也可以很方便的完成配置映射
  2. 打开 WEB-INF目录下的web.xml
  3. 修改为如下样子:
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <web-app version="2.5"
  6. xmlns="http://java.sun.com/xml/ns/javaee"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  9. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  10. <filter>
  11. <!-- 类名 -->
  12. <filter-name>HelloFilter</filter-name>
  13. <!-- 所在的包路径 -->
  14. <filter-class>com.Filter.HelloFilter</filter-class>
  15. <init-param>
  16. <param-name>origin</param-name>
  17. <param-value>web.xml</param-value>
  18. </init-param>
  19. <init-param>
  20. <param-name>testName</param-name>
  21. <param-value>testValue</param-value>
  22. </init-param>
  23. </filter>
  24. <filter-mapping>
  25. <!-- 与 <filter> 标签里面的 <filter-name> 字段保持一致 -->
  26. <filter-name>HelloFilter</filter-name>
  27. <!--拦截路径,表示拦截/TomcatTest这个目录的所有资源-->
  28. <url-pattern>/TomcatTest/*</url-pattern>
  29. <dispatcher>REQUEST</dispatcher>
  30. <dispatcher>FORWARD</dispatcher>
  31. <dispatcher>INCLUDE</dispatcher>
  32. <dispatcher>ERROR</dispatcher>
  33. </filter-mapping>
  34. <servlet>
  35. <!-- 类名 -->
  36. <servlet-name>HelloServlet</servlet-name>
  37. <!-- 所在的包路径 -->
  38. <servlet-class>com.Servlet.HelloServlet</servlet-class>
  39. </servlet>
  40. <servlet-mapping>
  41. <!-- 与 <servlet> 标签里面的 <servlet-name> 字段保持一致 -->
  42. <servlet-name>HelloServlet</servlet-name>
  43. <!-- web访问的网址 -->
  44. <url-pattern>/TomcatTest/HelloServlet</url-pattern>
  45. </servlet-mapping>
  46. </web-app>
  1. 创建好HelloFilter.java以后
  2. 这边设置的是拦截/TomcatTest这个目录的所有资源 <url-pattern>/*</url-pattern>
  3. 启动项目以后,任意访问带TomcatTest目录的即可
  4. 例如: http://127.0.0.1:8081/mavenJspTest_war/TomcatTest/HelloServlet

image.png

0x03.2.3 注意项

  1. 注意哦,web.xml拦截路径设置的是
  2. <filter-mapping>
  3. <!-- <filter> 标签里面的 <filter-name> 字段保持一致 -->
  4. <filter-name>HelloFilter</filter-name>
  5. <!--拦截路径,表示拦截/TomcatTest这个目录的所有资源-->
  6. <url-pattern>/TomcatTest/*</url-pattern>
  7. </filter-mapping>
  8. 这表示只有URL中是/TomcatTest/xxxx的才会拦截
  9. 例如-拦截的: http://127.0.0.1:8081/mavenJspTest_war/TomcatTest/HelloServlet
  10. 例如-不拦截的: http://127.0.0.1:8081/mavenJspTest_war/HelloServlet

0x04 多个Filter的执行顺序

  1. 1. 在我们的请求到达Servle之间是可以经过多个Filter
  2. 2. 使用注解的filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行
  3. 3. 如果一定要确保执行顺序,那么建议使用web.xml声明Filter
  4. 4. 程序会最优先执行web.xml中配置的Filter
  5. 5. web.xml中,filter执行顺序跟<filter-mapping>的顺序有关,先声明的先执行