Filter过滤器
1、Filter什么是过滤器
| 1、Filter过滤器它是JavaWeb的三大组件之一。三大组件分别是:Servlet程序、Listener监听器、Filter过滤器 |
| 2、Filter过滤器它是JavaEE的规范。也就是接口 |
| 3、Filter过滤器它的作用是:拦截请求,过滤响应。 |
| |
| 拦截请求常见的应用场景有: |
| 1、权限检查 |
| 2、日记操作 |
| 3、事务管理 |
| ……等等 |
2、Filter的初体验
| 要求:在你的web工程下,有一个admin目录。这个admin目录下的所有资源(html页面、jpg图片、jsp文件、等等)都必须是用户登录之后才允许访问。 |
| |
| 思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到Session域中。所以要检查用户是否登录,可以判断Session中否包含有用户登录的信息即可!!! |
| <% |
| Object user = session.getAttribute("user"); |
| |
| if(user == null){ |
| request.getRequestDispatcher("/login.jsp").forward(request,response); |
| return; |
| } |
| %> |
Filter的工作流程图:

Filter的代码:
自定义过滤器类实现Filter接口要将接口内的方法全部实现,否则服务器不能启动
| public class AdminFilter implements Filter{ |
| |
| |
| |
| @Override |
| public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain) throws IOException,ServletException{ |
| HttpServletRequest request = (HttpServletRequest) servletRequest; |
| |
| String contextPath = request.getContextPath(); |
| |
| HttpSession session = request.getSession(); |
| User user = (User) session.getAttribute("user"); |
| |
| if(user == null){ |
| HttpServletResponse response = (HttpServletResponse) servletResponse; |
| response.sendRedirect(contextPath + "/login.jsp"); |
| }else{ |
| |
| filterChain.doFilter(servletRequest,servletResponse); |
| } |
| } |
| |
| @Override |
| public void init(FilterConfig filterConfig) throws ServletException { |
| |
| } |
| |
| @Override |
| public void destroy() { |
| |
| } |
| } |
web.xml中的配置:
| |
| <filter> |
| |
| <filter-name>AdminFilter</filter-name> |
| |
| <filter-class>com.atguigu.filter.AdminFilter</filter-class> |
| </filter> |
| |
| <filter-mapping> |
| |
| <filter-name>AdminFilter</filter-name> |
| |
| |
| |
| |
| |
| <url-pattern>/admin/*</url-pattern> |
| </filter-mapping> |
Filter过滤器的使用步骤:
| 1、编写一个类去实现Filter接口 |
| 2、实现过滤方法doFilter() |
| 3、到web.xml中去配置Filter的拦截路径 |
完整的用户登录
login.jsp页面 ==> 登录表单
| 这是登录页面。login.jsp页面<br> |
| <form action="http://localhost:8080/15_filter/loginServlet" method="get"> |
| 用户名:<input type="text" name="username"/><br> |
| 密码:<input type="password" name="password"/><br> |
| <input type="submit"/> |
| </form> |
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("wzg168".equals(username) && "123456".equals(password)){ |
| req.getSession().setAttribute("user",username); |
| resp.getWriter().write("登录成功!!!"); |
| }else{ |
| req.getRequestDispatcher("/login.jsp").forward(req,resp); |
| } |
| } |
| } |
3、Filter的生命周期
| Filter的生命周期包含几个方法 |
| 1、构造器方法 |
| 2、init初始化方法 |
| 第1,2步,在web工程启动的时候执行(Filter已经创建) |
| |
| 3、doFilter过滤方法 |
| 第3步,每次拦截到请求,就会执行 |
| |
| 4、destroy销毁 |
| 第4步,停止web工程的时候,就会执行(停止web工程,也会销毁Filter过滤器) |
4、FilterConfig类
| FilterConfig类见名知义,它是Filter过滤器的配置文件类。 |
| Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig类,这里包含了Filter配置文件的配置信息。 |
| |
| FilterConfig类的作用是获取filter过滤器的配置内容 |
| 1、获取Filter的名称filter-name的内容 |
| 2、获取在Filter中配置的init-param初始化参数 |
| 3、获取ServletContext对象 |
java代码:
| @Override |
| public void init(FilterConfig filterConfig)throws ServletException{ |
| System.out.println("2.Filter的init(FilterConfigfilterConfig)初始化"); |
| |
| System.out.println("filter-name的值是:" + filterConfig.getFilterName()); |
| |
| System.out.println("初始化参数username的值是:" + filterConfig.getInitParameter("username")); |
| System.out.println("初始化参数url的值是:" + filterConfig.getInitParameter("url")); |
| |
| System.out.println(filterConfig.getServletContext()); |
| } |
web.xml配置:
| |
| <filter> |
| |
| <filter-name>AdminFilter</filter-name> |
| |
| <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> |
5、FilterChain过滤器链
| Filter 过滤器 |
| Chain 链,链条 /tʃeɪ n/ |
| FilterChain 就是过滤器链(多个过滤器如何一起工作) |

多个Filter过滤器执行顺序:
| 在多个Filter过滤器执行的时候,它们执行的优先顺序是由它们在web.xml中从上到下配置的顺序决定。和类名没有关系。 |
多个Filter过滤器执行的特点:
| 1.所有Filter和目标资源默认都执行在同一个线程中 |
| 2.多个Filter共同执行的时候,它们都使用同一个Request对象 |
6、Filter的拦截路径
精确匹配
| <url-pattern>/target.jsp</url-pattern> |
| 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp |
目录匹配
| <url-pattern>/admin/*</url-pattern> |
| 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/* |
后缀名匹配
后缀名匹配不能以 / 开头
错误:/*.action
| <url-pattern>*.html</url-pattern> |
| 以上配置的路径,表示请求地址必须以.html结尾才会拦截到 |
| |
| <url-pattern>*.do</url-pattern> |
| 以上配置的路径,表示请求地址必须以.do结尾才会拦截到 |
| |
| <url-pattern>*.action</url-pattern> |
| 以上配置的路径,表示请求地址必须以.action结尾才会拦截到 |
| |
| Filter过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!! |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步