【JavaWeb】过滤器Filter

mac2024-10-29  53

文章目录

概念生命周期处理过程实现步骤实例--验证登录过期问题

概念

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() { } }
最新回复(0)