1. 什么是Filter
- Filter过滤器是JavaWeb三大组件(Servlet程序,Listener监听器,Filter过滤器)之一
- Filter过滤器是JavaEE的规范,也就是接口
- 作用是:拦截请求,过滤响应
拦截请求常见的应用场景有:
权限检查
日记操作
事务管理…
2. Filter简单使用
- 在web工程下,有一个admin目录,这个admin目录下所有资源都必须用户登录后才能访问
public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) 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");
if (user == null) {
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
return;
} else {
//放行继续访问目标资源
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
Filter过滤器的使用步骤
编写一个类去实现Filter接口
实现过滤方法doFilter()
web.xml配置Filter路径
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="http://localhost:8080/15_filter/"/>
</head>
<form action="loginServlet" method="get">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit">
</form>
</body>
</html>
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 ("root".equals(username) && "1234".equals(password)) {
System.out.println(username);
req.getSession().setAttribute("user", username);
resp.getWriter().write("登陆成功");
} else {
System.out.println("跳转");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}
}
}
3. Filter的生命周期
Filter的生命周期包含几个方法
- 构造器方法
- init初始化方法,web工程启动时执行
- doFilter过滤方法,每次拦截到请求时执行
- destroy销毁,停止web工程时执行
4. FilterContig类
- 是Filter过滤器的配置文件类
- Tomcat每次创建Filter时,也会同时创建一个FilterContig类,包含了Filter配置文件的配置信息
- FilterConfig类的作用是获取filter过滤器的配置内容
- 获取Filter的名称filter-name的内容
- 获取在Filter中配置的init-param初始化参数
- 获取ServletContext对象
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init方法");
System.out.println(filterConfig.getFilterName());
System.out.println("username:" + filterConfig.getInitParameter("username"));
System.out.println(filterConfig.getServletContext());
}
5. FilterChain过滤器链
- Filter 过滤器
- Chain 链,链条
- FilterChain 过滤器链(多个过滤器如何一起工作)
6. 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结尾才会拦截到
<url-pattern>*.do</url-pattern>
表示请求地址必须以.do结尾才会拦截到
<url-pattern>*.action</url-pattern>
表示请求地址必须以.action结尾才会拦截到