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

回车之后。。。

原文地址:https://www.cnblogs.com/zhaotiancheng/p/6397958.html