过滤器就是对web资源进行拦截,进行一些处理后再交给下一个过滤器或servlet,甚至直接交给客户端或服务器;可以拦截request进行处理的,也可以对返回的response进行拦截后处理。并且一个请求或一个响应都可以经过多层过滤器,如下图所示:
用途
-
自动登录
-
设置统一的编码格式,避免乱码
-
访问权限的控制
-
进行敏感字符过滤(如经常遇到的不文明发言被过滤或者以“*”的形式显示出来)
......
示例
这里以一个servlet和一个filter作为示例。
servlet作为请求,向浏览器写入一串中文字符,发生乱码是意料之中的事情:
package servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class show extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* resp.setContentType("text/html;charset=utf-8"); resp.setCharacterEncoding("UTF-8");*/ resp.getWriter().write("好久不见,你还好吗?"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
servlet的注册:
<servlet> <servlet-name>show</servlet-name> <servlet-class>servlet.show</servlet-class> </servlet> <servlet-mapping> <servlet-name>show</servlet-name> <url-pattern>/servlet/show</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>show</servlet-name> <url-pattern>/show</url-pattern> </servlet-mapping>
这里设置两个路径是为了方便测试过滤器是否起作用。下面的过滤器注册的路径是/servlet/*,意味着/servlet路径下面的页面才能实现过滤器。
当然,上述的servlet可以使用代码中被注释掉的部分进行编码的设置,防止乱码的发生。但此种方法需要无意义地重复,不推荐使用。而过滤器就可以完成这项工作。
使用步骤
-
新建一个类,实现Filter接口
-
重写三个方法
-
在web.xml中注册(或使用注解)
需要重写的三个方法的作用:
void init(FilterConfig var1) throws ServletException; //过滤器初始化,在服务器启动时就自动执行了。
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; //过滤器的主体部分,过滤的代码在这里编写。
void destroy(); //过滤器的销毁,在服务器关闭时实现。
package filter; import javax.servlet.*; import java.io.IOException; public class Encode implements Filter { public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter 初始化"); } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=utf-8"); System.out.println("过滤器执行前"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("过滤器执行后"); } public void destroy() { System.out.println("Filter 已被销毁"); } }
最后是注册,完成后即可使用:
<filter> <filter-name>Encode</filter-name> <filter-class>filter.Encode</filter-class> </filter> <filter-mapping> <filter-name>Encode</filter-name> <url-pattern>/servlet/*</url-pattern> </filter-mapping>