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中,是重头执行还是执行放行后的逻辑呢?放行后逻辑
graph LR A(执行放行前逻辑)-->B(放行)-->C(访问资源)-->D(执行放行后逻辑)
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() {} }