17.1、什么是过滤器
1、Filter过滤器是JavaWeb的三大组件之一,Servlet程序、Listener监听器、Filter过滤器
2、Filter过滤器是JavaEE的规范,也是接口
3、Filter过滤器它的作用是 : 拦截请求、过滤响应
拦截请求常见的应用场景有:
1、权限检查
2、日志操作
3、事务管理
等
17.2、Filter的初体验
Filter过滤器的使用步骤
1、编写一个类去实现Filter接口
2、实现过滤方法的doFilter()
public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object session = session.getAttribute("session");
if (session == "bigbey"){
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest , servletResponse);
} else {
filterChain.doFilter(servletRequest , servletResponse);
}
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
3、到web.xml中去配置Filter的拦截路径
<listener>
<listener-class>com.bigbey.HelloServlet</listener-class>
</listener>
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>com.bigbey.AdminFilter</filter-class>
</filter>
17.3、Filter的登录之后的权限检查
1、点击登录后判断用户名与密码是否正确,正确则生成一个标识(cookie、session都行)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="http://localhost:8080/login" method="get">
用户名:<input type="text" name="username"/><br>
密码:<input type="password" name="password"/><br>
<input type="submit">
</form>
</body>
</html>
2、访问资源时判断是否有标识,如果有则放行
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("flaming".equals(username) && "123456".equals(password)) {
req.getSession().setAttribute("user", "bigbey");
resp.getWriter().write("登录成功!!!");
} else {
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
}
17.4、Filter的生命周期
Filter的生命周期包含几个方法
1、构造器方法
2、init初始化方法
第1、2步,在web工程启动的时候执行(Filter已经创建)
3、doFilter过滤方法
第3步,每次拦截到请求,就会执行
4、destoy销毁
第4步,停止web工程的时候,就会执行(停止web工程,也会销毁Filter过滤器)
17.5、FilterConfig类
FilterConfig类见名知义,它是Filter过滤器的配置文件
Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig类,这个包含了Filter配置文件的配置信息
FilterConfig类的作用是获取Filter过滤器的配置文件
1、获取Filter的名称,filter-name的内容
2、获取在Filter中配置的init-param初始化参数
3、获取ServletContext对象
17.6、FilterChain 过滤器链
FilterChain.doFilter() 方法的作用
1、执行下一个Filter过滤器(如果有Filter)
2、执行目标资源(没有Filter)
在多个Filter过滤器执行的时候,它们执行的优先顺序是由它们在web.xml中从上到下配置的顺序决定的
多个Filter过滤器执行的特点 :
1、所有filter和目标资源默认都执行在同一个线程中
2、多个filter共同执行的时候,它们都使用同一个Request对象
17.7、Filter的拦截路径
<!-- 精确匹配 -->
<url-pattern>/target.jsp</url-pattern>
<!--以上配置的路径,表示请求地址必须为 : http://ip:port/工程路径/target.jsp-->
<!-- 目标匹配 -->
<url-pattern>/admin/*</url-pattern>
<!--以上配置的路径,表示请求地址必须为 : http://ip:port/工程路径/admin/*-->
<!-- 后缀名匹配 -->
<url-pattern>*.html</url-pattern>
<!--以上配置的路径,表示请求地址必须以.html结尾才会拦截到-->
评论区