1.过滤器的简介
Filter过滤器是javaWeb的三大组件之一,是javaEE中的一套接口,用来拦截servlet请求以及过滤响应,通常在事务管理,权限检查等操作中会用到它
2.过滤器的生命周期
Filter过滤器共包含四个生命周期
1.构造方法
2.init 初始化方法
在 web 工程启动时即Filter创建时执行,可以对构造器进行相应的初始化操作
3.doFilter方法
每次拦截到请求时执行
4.destroy方法
停止 web 工程的时候就会执行这个方法,也就是销毁过滤器
3.过滤器链
在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。
它的拦截过程如图所示:
在浏览器对服务器发送请求时,会进入Filter1过滤器,并在Filter1中对请求进行拦截,经过Filter1处理请求之后,调用chain.doFilter()方法放行,并传递请求给Filter2过滤器,它以同样的方式调用doFilter()方法处理请求并最后发送请求给服务器,服务器做出响应后,过滤器也会以相反的顺序发生作用,将响应结果发送给客户端
4.案例代码演示
用户登录代码案例:
过滤器代码:
public class AdminFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if(user==null){
// 如果等于 null,说明还没有登录
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}else{
// 让程序继续往下访问用户的目标资源
chain.doFilter(req,resp);
}
}
public void destroy() {
}
public void init(FilterConfig config) throws ServletException {
}
}
servlet代码:
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 ("111111".equals(username) && "123456".equals(password)) {
req.getSession().setAttribute("user",username);
resp.getWriter().write("登录成功");
} else {
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
}