zoukankan      html  css  js  c++  java
  • java-过滤器(Filter)

    博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

    javaweb开发中,项目中都会包含一些过滤器(Filter),主要用于web服务器对资源的管理控制,如静态资源文件、jsp页面访问等。我们可以使用过滤器实现一些特殊的功能,如常见的过滤敏感词汇(替换为**)url访问权限、登录验证,本文以登录验证为例,后面会为小伙伴们贴上代码。

    开发Filter主要分为两个步骤

    1. web.xml中配置过滤器。
       <!-- 登录验证过滤器 -->
          <filter>
              <filter-name>loginFilter</filter-name><!--定义过滤器名称-->
              <filter-class>com.lzq.myproject.filter.LoginFilter</filter-class><!--指定过滤器:web可通过反射进行创建并初始化-->
              <init-param><!--指定初始化参数:可以存在多个-->
                  <param-name>param1</param-name><!--定义初始化参数名称-->
                  <param-value>我是初始化参数</param-value><!--定义初始化参数值-->
              </init-param>
          </filter>
          <filter-mapping>
              <filter-name>loginFilter</filter-name>
              <url-pattern>/*</url-pattern><!--过滤所有url-->
          </filter-mapping>
    2. 通过实现Filter接口创建过滤器。
      import javax.servlet.*;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      import java.io.IOException;
      
      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 request = (HttpServletRequest) servletRequest;
              HttpServletResponse response = (HttpServletResponse) servletResponse;
              HttpSession session = request.getSession();
              // 获取初始化参数 param1 的值
              String param1 = this.filterConfig.getInitParameter("param1");
              // 打印初始化参数值
              System.out.println(param1);
      
              String path = request.getRequestURI();
              if(path.indexOf("/index/indexAction.do") > -1){// 登录页面不过滤
                  filterChain.doFilter(request, response);// 递交给下一个过滤器
              }
              if(path.indexOf("/index/indexAction!login.do") > -1){// 登录页面登录请求不过滤
                  filterChain.doFilter(request, response);// 递交给下一个过滤器
              }
              if(path.indexOf("/register.jsp")>-1){// 注册页面不过滤
                  filterChain.doFilter(request, response);// 递交给下一个过滤器
              }
              Integer uid = (Integer)session.getAttribute("userid");
              if(uid != null){//已经登录
                  filterChain.doFilter(request, response);//放行,递交给下一个过滤器
              }else if(path.indexOf("myproject") > -1){
                  // 未登录,进入登录页面
                  response.sendRedirect("index/login.jsp");
              }
          }
      
          @Override
          public void destroy() {
               // web服务器停止时,自动调用该方法进行销毁
          }
      }

      过滤器(Filter)会在请求到达Servlet之前,拦截用户的请求,当用户请求资源满足我们自定义条件后,进行放行。

     

      过滤器生命周期:

     

      1、Filter的创建和销毁由WEB服务器负责。在WEB服务器启动时,通过web.xml读取,创建Filter实例对象,并调用其实现Filter接口方法init(FilterConfig filterConfig)进行初始化,如果在web.xml中的<filter></filter>下存在

     

          <filter-param>

     

            <param-name>参数名</param-name>

     

            <param-value>参数值</param-value>

     

          </filter-param>

     

      标签,将把过滤器指定的初始化参数传入init方法的FilterConfig对象中。Filter对象只会创建一次,从而init方法也只会执行一次

     

      FilterConfig接口:

    String getFilterName();//得到filter的名称。 
    String getInitParameter(String name);//返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.     
    Enumeration getInitParameterNames();
    //返回过滤器的所有初始化参数的名字的枚举集合。 ServletContext getServletContext();//返回Servlet上下文对象的引用。

     

      2、当用户请求访问与过滤器关联的url时,将执行doFilter(ServletRequest request,ServletResponse response, FilterChain chain)方法。该方法的形参FilterChain将请求交给下一个过滤器。

      3、WEB服务器停止时,过滤器将自动被销毁,调用过滤器对应的destroy方法。方法destroy也只会执行一次

     

    Filter链:web项目中,我们将web.xml中配置的多个过滤器组合称为一个Filter链,过滤器的调用顺序为web.xml中配置注册的顺序,通过doFilter方法的FilterChain对象可移交到下一个过滤器。

     

     

  • 相关阅读:
    微信扫码跳转到H5页面输入时,如何去掉提示:防盗号或诈骗,请不要输入QQ密码?
    org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608
    centos7 中查看log_bin是否开启以及开启log_bin
    从支付宝SDK的支付流程理解什么是公钥和私钥,什么是加密和数字签名
    Centos7中rc.local设置springboot项目开机自启动
    IIS配置实现反向代理(图文)
    【经验分享】卡方检验实战--检验次日留存率与用户分类的独立性
    R绘制3D散点图
    kmeans聚类理论篇
    PCA主成份分析学习记要
  • 原文地址:https://www.cnblogs.com/www-123456/p/10902540.html
Copyright © 2011-2022 走看看