详解JavaWeb中的过滤器Filter
一、什么是过滤器
1.Filter过滤器的作用:拦截请求
2.拦截请求常见场景:
(1)权限检查
(2)日记操作
(3)事务管理
1.1 使用步骤
Filter 过滤器的使用步骤:
1、编写一个类去实现Filter 接口
2、实现过滤方法doFilter()
3、到web.xml 中去配置Filter 的拦截路径
二、初体验
web工程下新建一个admin目录,作为需要权限才能访问的目录,其中有两个文件
2.1 mynav.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>导航</title> </head> <body> <table> <tr> <td> 百度<input type="text"> </td> </tr> <tr> <td> Google<input type="text"> </td> </tr> <tr> <td> 必应<input type="text"> </td> </tr> </table> </body> </html>
2.2 FilterServlet程序
package com.filter.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; /** * @author ningqian * @create -05-16 20:17 */ //注意导包是javax public class FilterServlet implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("来到Filter过滤器"); HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest; HttpSession session = httpServletRequest.getSession(); //如果session的属性user为空,转发到首页 if(session.getAttribute("user")==null){ servletRequest.getRequestDispatcher("/index.jsp").forward(servletRequest,servletResponse); } else{//如果session的属性user不为空,则放行 filterChain.doFilter(servletRequest,servletResponse); } } @Override public void destroy() { } }
2.3 HelloServlet程序
package com.filter.filter; import java.io.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(name = "helloServlet", value = "/hello-servlet") public class HelloServlet extends HttpServlet { private String message; public void init() { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("</body></html>"); HttpSession session = request.getSession(); session.setAttribute("user","ningqian"); } public void destroy() { } }
2.4 web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <filter> <filter-name>FilterServlet</filter-name> <filter-class>com.filter.filter.FilterServlet</filter-class> </filter> <filter-mapping> <filter-name>FilterServlet</filter-name> <!--表示受限的文件--> <url-pattern>/admin/*</url-pattern> </filter-mapping> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.filter.filter.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
2.5 index.jsp
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <filter> <filter-name>FilterServlet</filter-name> <filter-class>com.filter.filter.FilterServlet</filter-class> </filter> <filter-mapping> <filter-name>FilterServlet</filter-name> <!--表示受限的文件--> <url-pattern>/admin/*</url-pattern> </filter-mapping> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.filter.filter.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
三、测试
1.启动服务器
2.在浏览器地址栏输入:http:localhost:8080/filter/admin/1.jpg
表示直接访问admin目录下的图片
由于此目录下的文件在web.xml中配置为受限,所以此时请求被FilterServlet收到,使用doFilter方法进行请求过滤检查,发现会话session中没有user属性,所以将该请求转发到index.jsp
3.在浏览器地址栏输入:http:localhost:8080/filter/
首页不在受限的目录下,所以可以直接访问,点击页面上的链接Hello Servlet,此时,将请求发到服务器,HelloServlet程序接收,通过doGet()方法,给会话session的user赋值
4.再次在浏览器输入:http:localhost:8080/filter/admin/1.jpg,此时就可以正常访问。
四、Filter的生命周期
Filter 的生命周期包含几个方法
1、构造器方法
2、init 初始化方法
第1,2 步,在web 工程启动的时候执行(Filter 已经创建)
3、doFilter 过滤方法
第3 步,每次拦截到请求,就会执行
4、destroy 销毁
第4 步,停止web 工程的时候,就会执行(停止web 工程,也会销毁Filter 过滤器)
五、FilterConfig类
FilterConfig 类见名知义,它是Filter 过滤器的配置文件类。
Tomcat 每次创建Filter 的时候,也会同时创建一个FilterConfig 类,这里包含了Filter 配置文件的配置信息。
FilterConfig 类的作用是获取filter 过滤器的配置内容
1、获取Filter 的名称filter-name 的内容:filterConfig.getFilterName()
2、获取在Filter 中配置的init-param 初始化参数(在web.xml中配置):filterConfig.getInitParameter(“username”)
3、获取ServletContext 对象:filterConfig.getServletContext()
<!--filter 标签用于配置一个Filter 过滤器--> <filter> <!--给filter 起一个别名--> <filter-name>AdminFilter</filter-name> <!--配置filter 的全类名--> <filter-class>com.atguigu.filter.AdminFilter</filter-class> <init-param> <param-name>username</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost3306/test</param-value> </init-param> </filter>
六、FilterChain过滤器链
多个过滤器
七、Filter 的拦截路径
Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!
八、精确匹配
8.1 目录匹配
<url-pattern>/admin/*</url-pattern>
8.2 后缀名匹配
<url-pattern>*.html</url-pattern>
到此这篇关于详解JavaWeb中的过滤器Filter的文章就介绍到这了,更多相关JavaWeb Filter内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!