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

    Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。

    过滤器的作用:

      1、身份验证过滤器

      2、日志记录和审核过滤器

      3、触发资源访问事件过滤器。

      等等等。。。

    Servlet 过滤器方法

    过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法

    序号方法 & 描述
    1 public void doFilter (ServletRequest, ServletResponse, FilterChain)
    该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。
    2 public void init(FilterConfig filterConfig)
    web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
    3 public void destroy()
    Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

    使用实例:

    建一个类,实现 javax.servlet.Filter 接口,重写里面的方法

    package com.maya.filter;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Arrays;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class Testfilter implements Filter {
    
        ArrayList<String> list=new ArrayList<String>();
        @Override
        public void destroy() {
            //
        }
        
        @Override
        //每次请求执行的代码
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
            
    
            HttpServletRequest request=(HttpServletRequest)arg0;    //HttpServletRequest 是 ServletRequest的子类,  我们常用的request 是 httpservletRequest
            HttpServletResponse response=(HttpServletResponse)arg1;    //同上
            
            response.setCharacterEncoding("utf-8");                    //请求和响应的编码格式
            request.setCharacterEncoding("utf-8");
    
            String s1=request.getRequestURI();                //获取页面地址:     /GuoLvQi/denglu.jsp
            String s2=request.getContextPath();                //             /GuoLvQi
            String s3=s1.substring(s2.length());            //截取,最后剩下    /denglu.jsp
    
            if(list.contains(s3)){                //返回的结果为true  则进入下一个过滤器
                
                arg2.doFilter(request, response);            //进入下一个过滤器
            
            }
            else{
                HttpSession session=request.getSession();        //获取session
                
                if(session.getAttribute("user")==null){
                    
                    response.sendRedirect("denglu.jsp");        //如果获取不到,就转回登陆页面
                }
                else{
                    arg2.doFilter(request, response);            //获取到了  进入下一个过滤器
                }    
            }
        }
    
        
        
        @Override
        //第一遍要执行的代码
        public void init(FilterConfig arg0) throws ServletException {
            
            String values=arg0.getInitParameter("kefangwen");    //读配置文件
            String[] str=values.split(",");  //将字符串变成一个数组来接收
            list.addAll(Arrays.asList(str));  //将数组变成集合,也可以用for循环来添加
        }
    
    }

    web.xml中的配置(复制粘贴)

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
     
      <filter>
        <filter-name>testfilter</filter-name>        <!-- 过滤器的名字 -->
        <filter-class>com.maya.filter.Testfilter</filter-class>         <!-- 引用的类的路径  com.maya.filter 是包名  Testfilter是类名 -->
      
        <init-param>
          <param-name>kefangwen</param-name>                        <!--属性名称   过滤器可调用的属性  -->
          <param-value>/index.jsp,/index,main./jsp,main,/denglu.jsp</param-value>         <!-- value值 -->
        </init-param>    
      </filter>
      
      <filter-mapping>                <!-- 映射 -->
        <filter-name>testfilter</filter-name>        <!--同一个过滤器的映射名要跟过滤器的名字相对应  -->
        <url-pattern>/*</url-pattern>                <!-- /*表示该文件夹下所有web程序执行的时候都需要经过该过滤器 -->
      </filter-mapping>
      <welcome-file-list>
      
      
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

     当我在地址栏输入其他页面时  若session没有值时,就会自动跳至denglu.jsp

    回车之后。。。

  • 相关阅读:
    mysql中表名是order的CRUD的错误
    BAT-增加JAVA环境变量(WIN764位)
    D7 D2007 XE10.1 都支持的字符分隔函数
    问题-百度云同步盘登陆时提示155010错误
    BAT-批量改文件后缀名
    delphi判断线程是否正在运行
    JAVA-JSP动作元素之param
    JAVA-JSP动作元素之forward
    JAVA-JSP动作元素之include
    JAVA-JSP之taglib指令
  • 原文地址:https://www.cnblogs.com/zhaotiancheng/p/6397958.html
Copyright © 2011-2022 走看看