编写Filter的时候,我们需要实现Filter接口,需要去实现init(FilterConfig arg0),doFilter(ServletRequest request, ServletResponse response, FilterChain chain),destroy()等方法,有时候我们并不需要去实现init与destory方法,但又必须在代码里面写上这两个方法.如果我们不想多写这个两个方法,我们可以用一个类去实现Filter接口,在我们开发的时候直接继承这个类,实现doFilter方法即可.
代码如下:
1 package com.zhx.http.filter; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 /** 15 * 16 * @author zhaoxin 17 * 自定义的HttpFilter,实现Filter接口,参考自GenericServlet的实现方式 18 */ 19 public abstract class HttpFilter implements Filter,java.io.Serializable { 20 21 private static final long serialVersionUID = 1L; 22 23 private FilterConfig filterConfig; 24 25 /** 26 * 该方法由servlet容器进行调用,有且只调用一次 27 * 不建议子类直接重写该方法 28 */ 29 @Override 30 public void init(FilterConfig arg0) throws ServletException { 31 this.filterConfig = arg0; 32 this.init(); 33 } 34 35 /** 36 * 供子类重写的初始化方法,在子类中可以在init()方法中调用getFilterConfig()方法来获取FilterConfig对象,来获取初始化参数 37 * @throws ServletException 38 */ 39 protected void init() throws ServletException { 40 //TODO Auto-generated method stub 41 } 42 43 /** 44 * 供子类调用,来获取FilterConfig对象 45 * @return 46 */ 47 public FilterConfig getFilterConfig() { 48 return filterConfig; 49 } 50 51 /** 52 * 该方法由servlet容器调用,不建议之类直接进行重写 53 */ 54 @Override 55 public void doFilter(ServletRequest req, ServletResponse res, 56 FilterChain fc) throws IOException, ServletException { 57 58 HttpServletRequest request; 59 HttpServletResponse response; 60 61 try { 62 request = (HttpServletRequest)req; 63 response = (HttpServletResponse)res; 64 } catch (Exception e) { 65 throw new ServletException("non-HTTP request or response"); 66 } 67 doFilter(request, response, fc); 68 } 69 70 /** 71 * 该方法由子类必须重写的过滤方法 72 * @param request 73 * @param response 74 * @param filterChain 75 * @throws IOException 76 * @throws ServletException 77 */ 78 public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, 79 FilterChain filterChain) throws IOException, ServletException; 80 81 /** 82 * 由servlet容器进行调用 83 */ 84 @Override 85 public void destroy() { 86 // TODO Auto-generated method stub 87 88 } 89 90 }
开发的时候我们只需新建一个类,然后去继承HttpFilter即可.如果有初始化的需要,建议重写无参的init()方法,如果想在该方法内使用FilterConfig对象,通过调用this.getFilterConfig()方法即可获得.编写过滤方法时建议重写doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain).该方法的好处是可以直接使用HttpServletRequest,HttpServletResponse,不用自己再去将ServletRequest,ServletResponse对象强制转换为HttpServletRequest,HttpServletResponse对象.如果有释放资源等操作的时候,直接重写destory()方法即可,没有的话就不用重写.可以让代码看上去更美观.
时间: 2024-10-08 15:55:11