过滤器浅谈

来源:互联网 发布:深圳策略一二三网络 编辑:程序博客网 时间:2024/06/15 20:55
过滤器的生命周期: 
1、实例化 
通过web.xml配置,web容器启动时就会加载过滤器,实例化只会实例化一次。Servlet3.0规范中新增了@WebFilter的方式,这种方式用于讲一个类声明为过滤器,该注解将会在部署时被web容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。 
2、初始化 
调用过滤器的init(),这是过滤器的初始化方法,web容器创建过滤器实例后将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数。 
3、过滤方法 
每次请求都会调用过滤器的doFilter(),这个方法完成实际的过滤操作。这个是过滤器的核心方法,当用户请求访问与过滤器关联的URL时,web容器将先调用过滤器的doFilter()。FilterChain参数可以调用chain.doFilter(),将请求传递给下一个过滤器(或目标资源),或利用转发,重定向将请求转发到其他资源。 
4、销毁 
当web容器在销毁过滤器实例前调用destroy(),在这个方法中可以释放过滤器占用的资源。 

过滤器的分类: 
指定过滤器的转发模式,对应filter中的dispatchTypes属性,具体属性值包括以下5个,其中Servlet2.5支持REQUEST、FORWARD、INCLUDE、ERROR,Servlet3.0新增ASYNC 
1、REQUEST 
用户直接访问页面时,web容器将会调用过滤器,过滤器的默认种类。 
2、FORWARD 
目标资源是通过RequestDispatch的forward访问时,该过滤器将被调用。 
3、INCLUDE 
目标资源是通过RequestDispatch的include访问时,该过滤器将被调用。 
4、ERROR 
目标资源是通过声明式异常处理机制调用时,过滤器将被调用。 
5、ASYNC 
支持异步处理 

过滤器示例: 
web.xml 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"  
  5.          version="3.1">  
  6.   
  7.     <filter>  
  8.         <filter-name>loginFilter</filter-name>  
  9.         <filter-class>com.pumpkin.filter.LoginFilter</filter-class>  
  10.         <init-param>  
  11.             <param-name>unfilteredPaths</param-name>  
  12.             <param-value>login.jsp;failure.jsp;login</param-value>  
  13.         </init-param>  
  14.     </filter>  
  15.     <filter>  
  16.         <filter-name>EncodingFilter</filter-name>  
  17.         <filter-class>com.pumpkin.filter.EncodingFilter</filter-class>  
  18.         <init-param>  
  19.             <param-name>charset</param-name>  
  20.             <param-value>UTF-8</param-value>  
  21.         </init-param>  
  22.     </filter>  
  23.   
  24.     <filter-mapping>  
  25.         <filter-name>loginFilter</filter-name>  
  26.         <url-pattern>/*</url-pattern>  
  27.     </filter-mapping>  
  28.     <filter-mapping>  
  29.         <filter-name>EncodingFilter</filter-name>  
  30.         <url-pattern>/*</url-pattern>  
  31.     </filter-mapping>  
  32.   
  33.     <servlet>  
  34.         <servlet-name>LoginServlet</servlet-name>  
  35.         <servlet-class>com.pumpkin.servlet.LoginServlet</servlet-class>  
  36.     </servlet>  
  37.     <servlet-mapping>  
  38.         <servlet-name>LoginServlet</servlet-name>  
  39.         <url-pattern>/login</url-pattern>  
  40.     </servlet-mapping>  
  41.   
  42.     <welcome-file-list>  
  43.         <welcome-file>login.jsp</welcome-file>  
  44.     </welcome-file-list>  
  45.   
  46. </web-app>  


login.jsp 
Jsp代码  收藏代码
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  2. <html>  
  3. <head>  
  4.     <title>Filter实例</title>  
  5. </head>  
  6. <body>  
  7. <%  
  8.     System.out.println("===login.jsp===");  
  9. %>  
  10. <form action="login" method="post">  
  11.     用户名:<input type="text" name="username"/>  
  12.     <br/>  
  13.     密码:<input type="password" name="password"/>  
  14.     <br/>  
  15.     <input type="submit" value="提交"/>  
  16. </form>  
  17. </body>  
  18. </html>  


success.jsp 
Jsp代码  收藏代码
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  2. <html>  
  3. <head>  
  4.     <title>成功页面</title>  
  5. </head>  
  6. <body>  
  7. <%  
  8.     System.out.println("===success.jsp===");  
  9. %>  
  10. ${username},登陆成功!  
  11. </body>  
  12. </html>  


failure.jsp 
Jsp代码  收藏代码
  1. <%--  
  2.   Created by IntelliJ IDEA.  
  3.   User: Administrator  
  4.   Date: 2017/6/17  
  5.   Time: 22:47  
  6.   To change this template use File | Settings | File Templates.  
  7. --%>  
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  9. <html>  
  10. <head>  
  11.     <title>失败页面</title>  
  12. </head>  
  13. <body>  
  14. <%  
  15.     System.out.println("===failure.jsp===");  
  16. %>  
  17. 登录失败!  
  18. </body>  
  19. </html>  


LoginServlet.java 
Java代码  收藏代码
  1. package com.pumpkin.servlet;  
  2.   
  3. import javax.servlet.*;  
  4. import javax.servlet.annotation.WebServlet;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import javax.servlet.http.HttpSession;  
  9. import java.io.IOException;  
  10.   
  11.   
  12. public class LoginServlet extends HttpServlet {  
  13.     public LoginServlet() {  
  14.         super();  
  15.     }  
  16.   
  17.     @Override  
  18.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  19.         System.out.println("===LoginServlet===doGet===");  
  20.         doPost(req, resp);  
  21.     }  
  22.   
  23.     @Override  
  24.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  25.         System.out.println("===LoginServlet===doPost===start===");  
  26.         String username =  req.getParameter("username");  
  27.         String password =  req.getParameter("password");  
  28.         System.out.println("===username===" + username + "===");  
  29.   
  30.         if ("admin".equals(username) && "admin".equals(password)) {  
  31.             HttpSession session = req.getSession();  
  32.             session.setAttribute("username",username);  
  33.             resp.sendRedirect(req.getContextPath() + "/success.jsp");  
  34.         }else {  
  35.             resp.sendRedirect(req.getContextPath() + "/failure.jsp");  
  36.         }  
  37.         System.out.println("===LoginServlet===doPost===end===");  
  38.     }  
  39. }  


LoginFilter.java 
Java代码  收藏代码
  1. package com.pumpkin.filter;  
  2.   
  3. import javax.servlet.*;  
  4. import javax.servlet.annotation.WebFilter;  
  5. import javax.servlet.annotation.WebInitParam;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9. import javax.servlet.http.HttpSession;  
  10. import java.io.IOException;  
  11. import java.util.logging.Filter;  
  12.   
  13.   
  14. public class LoginFilter implements javax.servlet.Filter {  
  15.     private FilterConfig config;  
  16.   
  17.     @Override  
  18.     public void init(FilterConfig filterConfig) throws ServletException {  
  19.         System.out.println("===LoginFilter===init===");  
  20.         config = filterConfig;  
  21.     }  
  22.   
  23.     @Override  
  24.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  25.         System.out.println("===LoginFilter===doFilter===start===");  
  26.         HttpServletRequest request = (HttpServletRequest) servletRequest;  
  27.         HttpServletResponse response = (HttpServletResponse) servletResponse;  
  28.   
  29.         HttpSession session = request.getSession();  
  30.   
  31.         String unfilteredPaths = config.getInitParameter("unfilteredPaths");  
  32.         if (unfilteredPaths != null) {  
  33.             String[] strArray = unfilteredPaths.split(";");  
  34.             for (int i = 0; i < strArray.length; i++) {  
  35.                 if (strArray[i] == null || "".equals(strArray[i])) {  
  36.                     continue;  
  37.                 }  
  38.                 if (request.getRequestURI().indexOf(strArray[i]) != -1) {  
  39.                     filterChain.doFilter(request, response);  
  40.                     return;  
  41.                 }  
  42.             }  
  43.         }  
  44.   
  45.         if (session.getAttribute("username") != null) {  
  46.             filterChain.doFilter(request, response);  
  47.         } else {  
  48.             response.sendRedirect("login.jsp");  
  49.         }  
  50.         System.out.println("===LoginFilter===doFilter===end===");  
  51.     }  
  52.   
  53.     @Override  
  54.     public void destroy() {  
  55.         System.out.println("===LoginFilter===destroy===");  
  56.     }  
  57. }  


EncodingFilter.java 
Java代码  收藏代码
  1. package com.pumpkin.filter;  
  2.   
  3. import com.sun.net.httpserver.Filter;  
  4. import com.sun.net.httpserver.HttpExchange;  
  5.   
  6. import javax.servlet.*;  
  7. import javax.servlet.annotation.WebFilter;  
  8. import javax.servlet.annotation.WebInitParam;  
  9. import java.io.IOException;  
  10.   
  11.   
  12. public class EncodingFilter implements javax.servlet.Filter{  
  13.     private FilterConfig config;  
  14.   
  15.     @Override  
  16.     public void init(FilterConfig filterConfig) throws ServletException {  
  17.         System.out.println("===EncodingFilter===init===");  
  18.         config = filterConfig;  
  19.     }  
  20.   
  21.     @Override  
  22.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  23.         System.out.println("===EncodingFilter===doFilter===start===");  
  24.   
  25.         String charset = config.getInitParameter("charset");  
  26.         if (charset == null) {  
  27.             charset = "UTF-8";  
  28.         }  
  29.         servletRequest.setCharacterEncoding(charset);  
  30.         filterChain.doFilter(servletRequest,servletResponse);  
  31.   
  32.         System.out.println("===EncodingFilter===doFilter===end===");  
  33.     }  
  34.   
  35.     @Override  
  36.     public void destroy() {  
  37.         System.out.println("===EncodingFilter===destroy===");  
  38.     }  
  39. }  


Servlet3.0特性: 
Servlet3.0支持注解的方式注册servlet和filter,我们不需要在web.xml中配置servlet和filter,只需要在servlet和filter类中用@方式注入即可,代码如下: 

LoginServlet.java 
Java代码  收藏代码
  1. package com.pumpkin.servlet;  
  2.   
  3. import javax.servlet.*;  
  4. import javax.servlet.annotation.WebServlet;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import javax.servlet.http.HttpSession;  
  9. import java.io.IOException;  
  10.   
  11.   
  12. @WebServlet(name = "LoginServlet",urlPatterns = "/login")  
  13. public class LoginServlet extends HttpServlet {  
  14.     public LoginServlet() {  
  15.         super();  
  16.     }  
  17.   
  18.     @Override  
  19.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  20.         System.out.println("===LoginServlet===doGet===");  
  21.         doPost(req, resp);  
  22.     }  
  23.   
  24.     @Override  
  25.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  26.         System.out.println("===LoginServlet===doPost===start===");  
  27.         String username =  req.getParameter("username");  
  28.         String password =  req.getParameter("password");  
  29.         System.out.println("===username===" + username + "===");  
  30.   
  31.         if ("admin".equals(username) && "admin".equals(password)) {  
  32.             HttpSession session = req.getSession();  
  33.             session.setAttribute("username",username);  
  34.             resp.sendRedirect(req.getContextPath() + "/success.jsp");  
  35.         }else {  
  36.             resp.sendRedirect(req.getContextPath() + "/failure.jsp");  
  37.         }  
  38.         System.out.println("===LoginServlet===doPost===end===");  
  39.     }  
  40. }  


LoginFilter.java 
Java代码  收藏代码
  1. package com.pumpkin.filter;  
  2.   
  3. import javax.servlet.*;  
  4. import javax.servlet.annotation.WebFilter;  
  5. import javax.servlet.annotation.WebInitParam;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9. import javax.servlet.http.HttpSession;  
  10. import java.io.IOException;  
  11. import java.util.logging.Filter;  
  12.   
  13.   
  14. @WebFilter(filterName = "Filter1_LoginFilter", value = {"/*"}, initParams = {@WebInitParam(name = "unfilteredPaths", value = "login.jsp;failure.jsp;login")})  
  15. public class LoginFilter implements javax.servlet.Filter {  
  16.     private FilterConfig config;  
  17.   
  18.     @Override  
  19.     public void init(FilterConfig filterConfig) throws ServletException {  
  20.         System.out.println("===LoginFilter===init===");  
  21.         config = filterConfig;  
  22.     }  
  23.   
  24.     @Override  
  25.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  26.         System.out.println("===LoginFilter===doFilter===start===");  
  27.         HttpServletRequest request = (HttpServletRequest) servletRequest;  
  28.         HttpServletResponse response = (HttpServletResponse) servletResponse;  
  29.   
  30.         HttpSession session = request.getSession();  
  31.   
  32.         String unfilteredPaths = config.getInitParameter("unfilteredPaths");  
  33.         if (unfilteredPaths != null) {  
  34.             String[] strArray = unfilteredPaths.split(";");  
  35.             for (int i = 0; i < strArray.length; i++) {  
  36.                 if (strArray[i] == null || "".equals(strArray[i])) {  
  37.                     continue;  
  38.                 }  
  39.                 if (request.getRequestURI().indexOf(strArray[i]) != -1) {  
  40.                     filterChain.doFilter(request, response);  
  41.                     return;  
  42.                 }  
  43.             }  
  44.         }  
  45.   
  46.         if (session.getAttribute("username") != null) {  
  47.             filterChain.doFilter(request, response);  
  48.         } else {  
  49.             response.sendRedirect("login.jsp");  
  50.         }  
  51.         System.out.println("===LoginFilter===doFilter===end===");  
  52.     }  
  53.   
  54.     @Override  
  55.     public void destroy() {  
  56.         System.out.println("===LoginFilter===destroy===");  
  57.     }  
  58. }  


EncodingFilter.java 
Java代码  收藏代码
  1. package com.pumpkin.filter;  
  2.   
  3. import com.sun.net.httpserver.Filter;  
  4. import com.sun.net.httpserver.HttpExchange;  
  5.   
  6. import javax.servlet.*;  
  7. import javax.servlet.annotation.WebFilter;  
  8. import javax.servlet.annotation.WebInitParam;  
  9. import java.io.IOException;  
  10.   
  11.   
  12. @WebFilter(filterName = "Filter0_EncodingFilter", value = {"/*"}, initParams = {@WebInitParam(name = "charset", value = "UTF-8")})  
  13. public class EncodingFilter implements javax.servlet.Filter{  
  14.     private FilterConfig config;  
  15.   
  16.     @Override  
  17.     public void init(FilterConfig filterConfig) throws ServletException {  
  18.         System.out.println("===EncodingFilter===init===");  
  19.         config = filterConfig;  
  20.     }  
  21.   
  22.     @Override  
  23.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  24.         System.out.println("===EncodingFilter===doFilter===start===");  
  25.   
  26.         String charset = config.getInitParameter("charset");  
  27.         if (charset == null) {  
  28.             charset = "UTF-8";  
  29.         }  
  30.         servletRequest.setCharacterEncoding(charset);  
  31.         filterChain.doFilter(servletRequest,servletResponse);  
  32.   
  33.         System.out.println("===EncodingFilter===doFilter===end===");  
  34.     }  
  35.   
  36.     @Override  
  37.     public void destroy() {  
  38.         System.out.println("===EncodingFilter===destroy===");  
  39.     }  
  40. }  


LoginServlet.java 
Java代码  收藏代码
  1. @WebServlet(name = "LoginServlet",urlPatterns = "/login")  

这样的配置等同web.xml中的配置 
Xml代码  收藏代码
  1. <servlet>  
  2.     <servlet-name>LoginServlet</servlet-name>  
  3.     <servlet-class>com.pumpkin.servlet.LoginServlet</servlet-class>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.     <servlet-name>LoginServlet</servlet-name>  
  7.     <url-pattern>/login</url-pattern>  
  8. </servlet-mapping>  


LoginFilter.java 
Java代码  收藏代码
  1. @WebFilter(filterName = "Filter1_LoginFilter", value = {"/*"}, initParams = {@WebInitParam(name = "unfilteredPaths", value = "login.jsp;failure.jsp;login")})  

这样的配置等同web.xml中的配置 
Xml代码  收藏代码
  1. <filter>  
  2.     <filter-name>loginFilter</filter-name>  
  3.     <filter-class>com.pumpkin.filter.LoginFilter</filter-class>  
  4.     <init-param>  
  5.         <param-name>unfilteredPaths</param-name>  
  6.         <param-value>login.jsp;failure.jsp;login</param-value>  
  7.     </init-param>  
  8. </filter>  
  9.   
  10. <filter-mapping>  
  11.     <filter-name>loginFilter</filter-name>  
  12.     <url-pattern>/*</url-pattern>  
  13. </filter-mapping>  


EncodingFilter.java 
Java代码  收藏代码
  1. @WebFilter(filterName = "Filter0_EncodingFilter", value = {"/*"}, initParams = {@WebInitParam(name = "charset", value = "UTF-8")})  

这样的配置等同web.xml中的配置 
Xml代码  收藏代码
  1. <filter>  
  2.     <filter-name>EncodingFilter</filter-name>  
  3.     <filter-class>com.pumpkin.filter.EncodingFilter</filter-class>  
  4.     <init-param>  
  5.         <param-name>charset</param-name>  
  6.         <param-value>UTF-8</param-value>  
  7.     </init-param>  
  8. </filter>  
  9.   
  10. <filter-mapping>  
  11.     <filter-name>EncodingFilter</filter-name>  
  12.     <url-pattern>/*</url-pattern>  
  13. </filter-mapping>  


Servlet3.0过滤器执行顺序: 
Servlet3.0之前Filter过滤的顺序是由用户在web.xml中配置的顺序决定的,如我们的程序会先执行LoginFilter,再执行encodingFilter。 
在3.0之后新增@WebFilter注解,当使用注解配置多个Filter时,用户无法控制其执行顺序,此时Filter过滤的顺序是按照Filter的类名来控制的,按自然排序的规则。LoginFilter.java 和 EncodingFilter.java 这两个文件里面分别是“用户登录过滤器”和“字符集过滤器”,因为这两个文件的首字母E排L之前,导致每次执行的时候都是先执行“字符集过滤器”再执行“用户登录过滤器”,所以我们现在修改两个文件的名称分别为 
Filter0_EncodingFilter.java 
Filter1_LoginFilter.java 
这样就能先执行“用户登录过滤器”再执行“字符集过滤器”。
原创粉丝点击