Filter
-
过滤器。Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器(Filter)。通过Filter,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截.
比如:在用户张三登录后,会跳转到张三的个人主页,正常来说,当张三注销登录时,想要再次直接使用这个页面的URL直接请求张三的个人主页是不被允许的。Filter就可以起到拦截此时的URL。
即在调用目标资源之前先运行Filter做判断。
-
Filter接口的三个方法
-
public void init(FilterConfig filterConfig);//初始化Filter。服务器一运行就执行 //参数的方法 public interface FilterConfig { String getFilterName(); ServletContext getServletContext(); String getInitParameter(String var1); Enumeration getInitParameterNames(); }
-
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) //ServletRequest,ServletResponse就是ServletResponse请求与响应。注意不是HttpServletRequest,HttpServletResponse。 public interface HttpServletRequest extends ServletRequest {} //使用强转 HttpServletRequest req=(HttpServletRequest)servletRequest; HttpServletResponse resp=(HttpServletResponse) servletResponse; /*FilterChain可以进行doFilter的循环调用。这可以保证每次资源调用之前doFilter的运行。web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问否则web资源不会被访问。*/ public interface FilterChain { void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException; }
-
//服务器关闭,Filter销毁。可以释放过滤器使用的资源。 public void destroy() { }
-
-
Filter 的使用
-
创建 Filter实现类,重写上面三个方法。
public class SysFilter implements Filter { //服务器建立,Filter就建立 @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)servletRequest; HttpServletResponse resp=(HttpServletResponse) servletResponse; if(req.getSession().getAttribute("USER_SESSION")==null){ resp.sendRedirect("/error/404.jsp"); }else{ } filterChain.doFilter(servletRequest, servletResponse); } //服务器关闭,Filter销毁 @Override public void destroy() { } }
-
在web.xml文件中配置注册与映射。
<filter> <!--自定义Filter实现类name--> <filter-name>SysFilter</filter-name> <!--Filter实现类的路径--> <filter-class>com.mcwen.filter.SysFilter</filter-class> </filter> <!--Filter路径映射--> <filter-mapping> <filter-name>SysFilter</filter-name> <url-pattern>/sys/*</url-pattern> </filter-mapping>
-