77人参与 • 2024-07-03 • Tomcat
在 tomcat 中,filter 是一种用于拦截请求和过滤响应的组件,可以在请求到达 servlet 之前或响应离开 servlet 之后对其进行处理。
filter 的主要应用场景包括:
filter 的生命周期由 tomcat 容器管理,包含以下几个方法:
filter 接口
public interface filter { // 容器创建的时候调用, 即启动 tomcat 的时候调用 public void init(filterconfig filterconfig) throws servletexception; // 由 filterchain 调用, 并且传入 filterchain 本身, 最后回调 filterchain 的 dofilter() 方法 public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception; // 容器销毁的时候调用, 即关闭 tomcat 的时候调用 public void destroy(); }
filterchain 接口
public interface filterchain { // 由 filter.dofilter() 中的 chain.dofilter 调用 public void dofilter(servletrequest request, servletresponse response) throws ioexception, servletexception; }
当 tomcat 接收到 url 请求时,它会根据在 web.xml 文件中配置的过滤器和映射路径来创建 filterchain。如果某个请求匹配了一些过滤器的映射路径,那么这些过滤器将被添加到 filterchain。创建了 filterchain 之后,就开始执行 dofilter,进行请求的链式处理。
过滤器执行顺序:
如图是 filter 拦截过程示意图。所有 filter 和 web 资源都默认执行在同一个线程中(因为filter 和 web 资源通常是在 httpservlet 容器中运行的,而 httpservlet 容器是基于单线程模型的)。对于 filterchain 中的 filter,它们都使用同一 request 对象。
以下是 filter 拦截过程的一般步骤:
filterconfig 是 filter 过滤器的配置文件类。tomcat 每次创建 filter 的时候,也会同时创建一个 filterconfig 类,它包含了 filter 配置文件的配置信息。
filterconfig 类的作用是获取 filter 过滤器的配置内容
@override public void init(filterconfig filterconfig) throws servletexception { // 1、获取 filter 的名称 filter-name 的内容 system.out.println("filter-name 的值是:" + filterconfig.getfiltername()); // 2、获取在 web.xml 中配置的 init-param 初始化参数 system.out.println("初始化参数 username 的值是:" + filterconfig.getinitparameter("username")); system.out.println("初始化参数 url 的值是:" + filterconfig.getinitparameter("url")); // 3、获取 servletcontext 对象 system.out.println(filterconfig.getservletcontext()); }
工程目录
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"> <!-- <display-name> 元素常用于配置 servlet、过滤器或其他 web 组件的显示名称。 这个显示名称主要用于在管理界面或日志中标识该组件,以方便识别和管理。 --> <!-- 标识项目名 --> <display-name>servlettest</display-name> <!-- 定义首页文件,也就是用户直接输入域名时跳转的页面(如http://localhost:8080/)--> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <!--filter 标签用于配置一个 filter 过滤器--> <filter> <!--给 filter 起一个别名--> <filter-name>adminfilter1</filter-name> <!--配置 filter 的全类名--> <filter-class>com.test.adminfilter1</filter-class> <!-- 设置 servlet 初始化参数 可以通过 filterconfig.getinitparamenter(string name) 方法访问初始化参数 --> <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> <!-- 设置 filter 映射 --> <filter-mapping> <!-- 和 filter 标签中的 filter-name 对应 --> <filter-name>adminfilter1</filter-name> <!-- 设置匹配的路径,这里设置为 /img/* 表示访问 img 目录下的图片都会调用该 filter(adminfilter) --> <url-pattern>/img/*</url-pattern> </filter-mapping> <filter> <filter-name>adminfilter2</filter-name> <filter-class>com.test.adminfilter2</filter-class> </filter> <filter-mapping> <filter-name>adminfilter2</filter-name> <url-pattern>/img/*</url-pattern> </filter-mapping> </web-app>
login.jsp
<%@ page contenttype="text/html;charset=utf-8" language="java" %> <html> <head> <title>登录</title> </head> <body> <form action="http://localhost:8080/servlettest/loginservlet" method="get"> 用户名: <input type="text" name="username"/> <br> 密 码: <input type="password" name="password"/> <br> <input type="submit" /> </form> </body> </html>
loginservlet 类
package com.test; import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import java.io.ioexception; @webservlet("/loginservlet") public class loginservlet extends httpservlet { @override protected void doget(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception { resp.setcontenttype("text/html; charset=utf-8"); string username = req.getparameter("username"); string password = req.getparameter("password"); if ("root".equals(username) && "123456".equals(password)) { system.out.println("设置 seesion: {user : " + username + " }"); req.getsession().setattribute("user",username); system.out.println("登录成功!"); resp.getwriter().write("登录 成功!!!"); } else { system.out.println("登录失败!"); req.getrequestdispatcher("/login.jsp").forward(req,resp); } } }
adminfilter1 类
package com.test; import javax.servlet.*; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpsession; import java.io.ioexception; public class adminfilter1 implements filter { // dofilter 方法,专门用于拦截请求。可以做权限检查 @override public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception { system.out.println("过滤器 adminfilter1"); httpservletrequest httpservletrequest = (httpservletrequest) servletrequest; httpsession session = httpservletrequest.getsession(); object user = session.getattribute("user"); // system.out.println("登录用户: " + user); // 如果等于 null,说明还没有登录 if (user == null) { system.out.println("未登录,跳转到登录页面"); servletrequest.getrequestdispatcher("/login.jsp").forward(servletrequest,servletresponse); return; } else { // 让程序继续往下访问用户的目标资源 system.out.println("adminfilter1 调用 dofilter 方法"); filterchain.dofilter(servletrequest,servletresponse); system.out.println("adminfilter1 结束了 dofilter 方法的调用"); } } @override public void init(filterconfig filterconfig) throws servletexception { // 1、获取 filter 的名称 filter-name 的内容 system.out.println("filter-name 的值是:" + filterconfig.getfiltername()); // 2、获取在 web.xml 中配置的 init-param 初始化参数 system.out.println("初始化参数 username 的值是:" + filterconfig.getinitparameter("username")); system.out.println("初始化参数 url 的值是:" + filterconfig.getinitparameter("url")); // 3、获取 servletcontext 对象 system.out.println(filterconfig.getservletcontext()); } }
adminfilter2 类
package com.test; import javax.servlet.*; import java.io.ioexception; public class adminfilter2 implements filter { // dofilter 方法,专门用于拦截请求。可以做权限检查 @override public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception { system.out.println("过滤器 adminfilter2"); system.out.println("adminfilter2 调用 dofilter 方法"); filterchain.dofilter(servletrequest,servletresponse); system.out.println("adminfilter2 结束了 dofilter 方法的调用"); } }
运行演示图
运行流程:
到此这篇关于tomcat中filter过滤器的具体使用的文章就介绍到这了,更多相关tomcat filter过滤器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论