D17 Sping Boot 入门 Sping框架--Java Web之Filter过滤器

一、什么是过滤器

  ①、Filter过滤器是JavaWeb的三大组件之一。三大组件分别是Servlet程序、Listener监听器、Filter过滤器

  ②、Filter过滤器是JavaEE的规范,即接口。

  ③、Filter过滤器的作用是:拦截请求(主要)、过滤响应。

  拦截请求常见的应用场景:

    1、权限检查

    2、日记操作

    3、事务管理

    4、……等等

二、Filter的初体验

  要求:在你的web工程下有一个admin目录。admin目录下的所有资源(HTML页面,图片文件、jsp等等)必须是用户登录后才能允许访问

    思考:用户登录后把用户信息保存到Session域中,所以检查用户是否登录,可以判断Session域中是否包含用户登录信息即可。

 

在src中新建com.gychen.filter

在filter里新建AdminFilter.java类

在web.xml里配置路径

 1 package com.gychen.filter;
 2 
 3 import javax.servlet.*;
 4 import javax.servlet.http.HttpServletRequest;
 5 import javax.servlet.http.HttpSession;
 6 import java.io.IOException;
 7 
 8 public class AdminFilter implements Filter {
 9     @Override
10     public void init(FilterConfig filterConfig) throws ServletException {
11 
12     }
13 
14     /**
15      * doFilter方法,专门用于拦截请求(可以做权限检查)、过滤响应。
16      * @param servletRequest
17      * @param servletResponse
18      * @param filterChain
19      * @throws IOException
20      * @throws ServletException
21      */
22     @Override
23     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
24         HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
25         HttpSession session = httpServletRequest.getSession();
26         Object user = session.getAttribute("user");
27         // 如果等于null,说明还没有登录
28         if (user == null){
29             servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
30             return;
31         }else {
32             // 让程序继续往下访问用户的目标资源
33             filterChain.doFilter(servletRequest,servletResponse);
34         }
35     }
36 
37     @Override
38     public void destroy() {
39 
40     }
41 }
AdminFilter.java
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
 5          version="4.0">
 6     
 7     
 8     
 9     <!--filter标签用于配置一个filter过滤器-->
10     <filter>
11         <!--给filter起一个别名-->
12         <filter-name>AdminFilter</filter-name>
13         <!--配置filter全类名-->
14         <filter-class>com.gychen.filter.AdminFilter</filter-class>
15     </filter>
16 
17     <!--filter-mapping配置Filter过滤器的拦截路径-->
18     <filter-mapping>
19         <!--filter-name表示当前的拦截路径给那个filter使用-->
20         <filter-name>AdminFilter</filter-name>
21         <!--url-pattern配置拦截路径
22             / 表示请求地址为:http://ip:port/工程路径/   映射到web目录
23         -->
24         <!-- /admin/* 表示请求地址为:http://ip:port/工程路径/admin/* -->
25         <url-pattern>/admin/*</url-pattern>
26     </filter-mapping>
27 </web-app>
web.xml

 Filter过滤器使用步骤:

  1、编写一个类去实现Filter接口。

  2、实现过滤方法doFilter()。

  3、在web.xml中配置Filter的拦截路径。

 三、Filter的生命周期

   Filter的生命周期包含几个方法:

    ①、构造器方法

    ②、init初始化方法

      ①和②在web工程启动时执行(Filter已经创建)

    ③、doFilter过滤方法

      ③,每次拦截到请求就会执行

    ④、destroy方法

      ④,停止web工程时执行(停止web工程也会销毁Filter过滤器)

四、FilterConfig类

 

 

 五、FilterChain 过滤器链

 

 

 在com.gychen.filter中新建两个filter来验证上述原理

在web.xml中配置filter过滤配置路径

 1 package com.gychen.filter;
 2 
 3 import javax.servlet.*;
 4 import java.io.IOException;
 5 
 6 public class Filter1 implements Filter {
 7 
 8     @Override
 9     public void init(FilterConfig filterConfig) throws ServletException {
10 
11     }
12 
13     @Override
14     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
15 
16         System.out.println("Filter1 前置代码");
17         filterChain.doFilter(servletRequest,servletResponse);
18         System.out.println("Filter1 后置代码");
19     }
20 
21     @Override
22     public void destroy() {
23 
24     }
25 }
Filter1
 1 package com.gychen.filter;
 2 
 3 import javax.servlet.*;
 4 import java.io.IOException;
 5 
 6 public class Filter2 implements Filter {
 7 
 8     @Override
 9     public void init(FilterConfig filterConfig) throws ServletException {
10 
11     }
12 
13     @Override
14     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
15 
16         System.out.println("Filter2 前置代码");
17         filterChain.doFilter(servletRequest,servletResponse);
18         System.out.println("Filter2 后置代码");
19     }
20 
21     @Override
22     public void destroy() {
23 
24     }
25 }
Filter2
 1  <filter>
 2         <filter-name>Filter1</filter-name>
 3         <filter-class>com.gychen.filter.Filter1</filter-class>
 4     </filter>
 5     <filter-mapping>
 6         <filter-name>Filter1</filter-name>
 7         <url-pattern>/target.jsp</url-pattern>
 8     </filter-mapping>
 9 
10     <filter>
11         <filter-name>Filter2</filter-name>
12         <filter-class>com.gychen.filter.Filter2</filter-class>
13     </filter>
14     <filter-mapping>
15         <filter-name>Filter2</filter-name>
16         <url-pattern>/target.jsp</url-pattern>
17     </filter-mapping>

六、Filter的拦截路径

--精确匹配

<url-pattern>/target.jsp</url-pattern>
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

--目录匹配

<url-pattern>/admin/*</url-pattern>
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

--后缀名匹配

<url-pattern>*.html</url-pattern>
以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
<url-pattern>*.do</url-pattern>
以上配置的路径,表示请求地址必须以.do 结尾才会拦截到
<url-pattern>*.action</url-pattern>
 
以上配置的路径,表示请求地址必须以.action 结尾才会拦截到
Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!

posted @ 2020-06-07 13:51  nuister  阅读(220)  评论(0编辑  收藏  举报