文章目录
概念生命周期处理过程实现步骤实例--验证登录过期问题
概念
Filter是拦截Request请求的对象:在用户的请求访问资源处理之前处理ServletRequest以及ServletResponse,它可用于日志记录,加解密,Session检查,图像文件保护等。 Filter的配置可以通过Annotation或者部署描述来完成。当一个资源或者某些资源需要被多个Filter所使用到,且它的出发顺序很重要时,只能通过部署描述来配置。
生命周期
Filter的实现必须继承javax.servlet.Filter接口。 这个接口包含了Filter的三个生命周期:init,doFilter,destory。 1.void init(FilterConfig):过滤器的初始化方法,Servlet容器在创建过滤器实例时调用这个方法,在这个方法中可以读出在web.xml文件中为该过滤器配置的初始化参数。 2.void doFilter(ServletRequest,ServletResponse,FilterChain):用于完成实际的过滤操作,当客户请求访问与过滤器相关联的URL时,Servlet容器将先调用过滤器的这个方法,FilterChain参数用于访问后续过滤器。 3.void destroy():过滤器在被取消前执行这个方法,释放过滤器申请的资源。
注意 在Filter的doFilter的实现中,最后一行需要调用FilterChain中的doFilter方法。注意Filter的doFilter方法里的第三个参数,就是filterChain的实例:
filterChain.doFilter(request,response);
如果在Filter.doFilter()的实现中,没有在结尾处调用filterChain.doFilter(request,response);的方法,那么该request请求中止,后面的处理就会中断。
处理过程
1.Servlet容器创建一个Servlet过滤器实例。 2.Servlet过滤器实例调用init()方法得到初始化参数。 3.Servlet过滤器实例调用doFilter()方法,根据初始化参数的值判断该请求是否合法,如果该请求不合法,则阻塞该请求,如果是合法请求,则调用chain.doFilter(request,response)方法将该请求向后转发。
实现步骤
1.创建一个实现了javax.servlet.Filter接口的类。 2.重写init(FilterConfig)方法,读入为过滤器配置的初始化参数,申请过滤器需要的资源。 3.重写方法doFilter(ServletRequest,ServletResponse,FilterChain),完成过滤操作,可以 从ServletRequest参数中得到全部的请求信息,从ServletResponse参数中得到全部的响应信息。 4.在doFilter()方法的最后,使用FilterChain参数的doFilter()方法将请求和响应后传。 5.对响应的Servlet程序和JSP页面注册过滤器,在部署描述文件(web.xml)中使用和元素对过滤器进行配置。
实例–验证登录过期问题
package fliter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 验证登录验证过期问题
*/
@WebFilter(filterName = "loginFilter", urlPatterns = { "/*" })
public class LoginFilter implements Filter {
private FilterConfig filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
HttpSession session = req.getSession(true);
resp.setContentType("text/html;");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
String request_uri = req.getRequestURI();
String ctxPath = req.getContextPath();
String uri = request_uri.substring(ctxPath.length());
System.out.println(uri);
if (uri.contains("index.jsp") || uri.contains("login")||uri.equals("/")||uri.equals("/signup.jsp")|| uri.equals("/register")|| uri.equals("/upload")) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
if (session.getAttribute("user") != null) {
filterChain.doFilter(servletRequest,servletResponse);
} else {
out.println("您没有登录,请先登录!3秒后回到登录页面。");
resp.setHeader("refresh", "3;url=" + ctxPath + "/index.jsp");
return;
}
}
}
@Override
public void destroy() {
}
}