【尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版-哔哩哔哩】
本文仅供学习交流
1、Filter什么是过滤器
1、 Filter过滤器它是JavaWeb的三大组件之一。三大组件分别是,Servlet程序、Listener监听器、Fiter过滤器 2、Filter过滤器它是JavaEE的规范。也就是接口
3、Filter过滤器它的作用是↵ 拦截请求,过滤响应。
拦截请求常见的应用场景有
1、权限检查
2、日记操作
3、事务管理
等等
2、Filter的初体验
要求:在你的web工程下,有一个admin目录。这个admin目录下的所有资源(html页面、jpg图片、jsp文件、等等)都必 须是用户登录之后才允许访问。
思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到Session域中。所以要检查用户是否 登录,可以判断Session中否包含有用户登录的信息即可!!!
简单演示:
新建web/admin下新建a.jsp
<%-- Created by IntelliJ IDEA. User: lenovo Date: 2021/9/5 Time: 下午 06:29 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% Object user=session.getAttribute("user"); //如果等于null,说明还没有登录 if (user==null){ request.getRequestDispatcher("/login.jsp").forward(request,response); return; } %> 我是a.jsp文件 </body> </html>
新建web/login.jsp
<%-- Created by IntelliJ IDEA. User: lenovo Date: 2021/9/5 Time: 下午 06:38 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 这是登录页面。login.jsp页面 </body> </html>
原理
新建src/com.filter/AdminFilter
package com.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; public class AdminFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } /** * doFilter方法,专门用于拦截请求。可以做权限检查 * @param servletRequest * @param servletResponse * @param filterChain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest= (HttpServletRequest) servletRequest; HttpSession session=httpServletRequest.getSession(); Object user=session.getAttribute("user");//导入service包 //如果等于null,说明还没有登录 if (user==null){ servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); return; }else { //让程序继续往下访问用户的目标资源 filterChain.doFilter(servletRequest,servletResponse); } } @Override public void destroy() { } }
配置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过滤器 --> <filter> <!-- 给filter起一个别名 --> <filter-name>AdminFilter</filter-name> <!-- 配置filter的全类名 --> <filter-class>com.filter.AdminFilter</filter-class> </filter> <!-- filter-mapping 配置Filter过滤器的拦截路径 --> <filter-mapping> <!-- filter-name 表示当前拦截路径给哪个filter使用 --> <filter-name>AdminFilter</filter-name> <!-- url-pattern配置拦截路径 / 表示请求地址为:http//ip:port/工程路径/ 映射到IDEA的web目录 /admin/* 表示请求地址为:http//ip:port/工程路径/admin/* --> <url-pattern>/admin/*</url-pattern> </filter-mapping> </web-app>
结果
Filter 过滤器的使用步骤
1、编写一个类去实现Filter接口
2、实现过滤方法doFilter()
3、到web.xm1中去配置Filter的拦截路径
补充
新建com/servlet/LoginServlet
package com.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; 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); } } }
配置web.xml
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping>
修改 login.jsp
<%-- Created by IntelliJ IDEA. User: lenovo Date: 2021/9/5 Time: 下午 06:38 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 这是登录页面。login.jsp页面 <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"><br> </form> </body> </html>
3.Filter的生命周期
Filter的生命周期包含几个方法
1、构造器方法
2、 init初始化方法
第1,2步,在web工程启动的时候执行(Filter已经创建)
3、doFilter过滤方法
第3步,每次拦截到请求,就会执行
4、destroy销毁
第4步,停止web工程的时候,就会执行(停止web工程,也会销毁Filter过滤器)
修改 AdminFilter
package com.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; public class AdminFilter implements Filter { public AdminFilter(){ System.out.println("1.Filter构造器方法AdminFilter()"); } @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("2.Filter的init(FilterConfig filterConfig) 初始化"); } /** * doFilter方法,专门用于拦截请求。可以做权限检查 * @param servletRequest * @param servletResponse * @param filterChain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("3.Filter的doFilter() 过滤"); HttpServletRequest httpServletRequest= (HttpServletRequest) servletRequest; HttpSession session=httpServletRequest.getSession(); Object user=session.getAttribute("user");//导入service包 //如果等于null,说明还没有登录 if (user==null){ servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); return; }else { //让程序继续往下访问用户的目标资源 filterChain.doFilter(servletRequest,servletResponse); } } @Override public void destroy() { System.out.println("4.Filter的destroy() 销毁方法"); } }