10.Filter
Filter
笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)
-
概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
-
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
-
过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等...
Filter快速入门
-
定义类,实现Filter接口,并重写其所有方法
import javax.servlet.*;//注意pom.xml要导入javax.servlet依赖 import java.io.IOException; public class FilterDemo implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {} @Override public void destroy() {} }
-
配置Filter拦截资源的路径:在类上定义@WebFilter注解
@WebFilter("/*") public class FilterDemo implements Filter { ...
-
在doFilter方法中输出一句话,并放行
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("Filter被执行了..."); //放行 filterChain.doFilter(servletRequest,servletResponse); }
Filter执行流程
-
放行后访问对应资源,资源访问完成后,还会回到Filter中吗?会
-
如果回到Filter中,是重头执行还是执行放行后的逻辑呢?放行后逻辑
Filter使用细节
Filter拦截路径配置
-
Filter可以根据需求,配置不同的拦截资源路径
拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截。
目录拦截:/user/*:访问/user下的所有资源,都会被拦截
后缀名拦截: *.jsp:访问后缀名为jsp的资源,都会被拦截
拦截所有:/*:访问所有资源,都会被拦截
过滤器链
-
一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链
-
注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序(类似手机中联系人按照ABCD排序)
案例
登录验证
-
需求:访问服务器资源时,需要先进行登录验证,如果没有登录,则自动跳转到登录页面
package com.itwen.web.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; @WebFilter("/*") public class FilterDemo implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req= (HttpServletRequest) servletRequest; //判断访问资源是否和登录注册相关 //如果不进行判断,那么获取页面中的图片、css文件等资源等数据资源时,也会被该filter拦截,导致页面不能正常显示 String[] urls={"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"}; //获取当前资源路径 String url = req.getRequestURL().toString(); //循环判断 for (String u : urls) { if (url.contains(u)){ //找到了 //放行 filterChain.doFilter(servletRequest,servletResponse); return; } } //1.判断session中是否有user HttpSession session = req.getSession(); Object user = session.getAttribute("user"); //2.判断user是否为null if (user!=null){ //已登录 //放行 filterChain.doFilter(servletRequest,servletResponse); }else { //未登录 //存储提示信息,跳转到登录页 req.setAttribute("login_msg","尚未登录!"); req.getRequestDispatcher("/login.jsp").forward(req,servletResponse); } System.out.println("Filter被执行了..."); } @Override public void destroy() {} }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧