Servlet过滤器的使用

Servlet过滤器的使用

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

举个简单的例子,比如我们有个网站是需要登录的,所以在用户进入每个页面我们都需要去检测用户是否有登录,这时候我们就需要用到过滤器了。用户进入需要验证的页面都拦截下来,先进入过滤器做判断,如果有这个用户的登录信息,那么就放行,如果没有查询到此用户的登录信息,那么就跳转到登录页面或者其他你想设定的页面。

(程序的运行需要大量的配置及严苛的语法,如果你是第一次学习此内容,按照教程的指导,完全模仿操作。切勿一来就擅自改动,给自己的学习制造障碍!)

下面通过实例理解过滤器的原理和使用。

一、创建项目

IDEA创建web项目,可以参考我另一篇博文:手摸手教你在IDEA创建Web项目及配置Tomcat

二、编写程序

1. 目录结构如下

在这里插入图片描述

2. 编写过滤器程序

过滤器必须实现javax.servlet.Filter接口,该接口包含3个方法:init、doFilter、destroy。

  1. init(FilterConfig filterConfig):Java EE容器创建过滤器实例后调用该方法,用于为过滤器做准备工作,可以从filterConfig对象读取配置文件web.xml中为该过滤器设置的初始化参数。
  2. doFilter(ServletRequest request, ServletResponse response, FilterChain chain):过滤操作在该方法里实现,包括检查、修改请求对象,检查修改应答对象。参数request是请求对象,response是应答对象,chain用于访问后续过滤器。
  3. destroy():Java EE容器在销毁过滤器实例前调用该方法,用于释放资源。
    实现一个禁止某个地址访问hello.jsp的例子,首先编写过滤器程序,然后再配置文件web.xml中进行配置,最后运行。

该程序实现了Filter接口,再init()方法中读取配置文件的过滤器的参数(禁止访问的IP地址)。在doFilter()方法中检查客户端的IP地址,如果与禁止的地址相同就返回禁止访问的提示,不调用要访问的Web资源,在destroy()方法中释放资源。

AddressFilter.java
package filter;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;

public class AddressFilter implements Filter {
    private FilterConfig filterConfig = null;
    private String addressProhibited = null;
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        addressProhibited = filterConfig.getInitParameter("addressProhibited");
        //读取配置文件中的参数
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException,ServletException{
        String ip = request.getRemoteAddr();
        // 判断如果是本地localhost的话,就改成127.0.0.1
        String address = ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
        // 获取客户端IP地址
        if(address.equals(addressProhibited)) {
        // if(true) {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            out.print("<html>");
            out.print("<head>");
            out.print("<title>这个地址禁止访问</title>");
            out.print("</head>");
            out.print("<body>");
            out.print("<h1 align='center'>这个地址禁止访问</h1>");
            out.print("</body>");
            out.print("</html>");
            out.flush();
            return ;
        }
        chain.doFilter(request, response);
    }
    public void destroy() {
        this.filterConfig = null;
    }
}

2. 编写web.xml文件

在Tomcat应用服务器的web.xml文件中配置过滤器AddressFilter。
过滤器要在配置文件web.xml中进行配置才会起作用。配置分为两部分,一部分是对过滤器的定义,一部分是过滤器的映射。
先看定义过滤器的部分:
在这里插入图片描述其中<filter-name>定义过滤器的名字,<filter-class>指定过滤器的类,<init-param>和</init-param>之间是该过滤器的参数(就是前面过滤器程序中读的),其中<param-name>是参数名,<param-value>是参数值。
再看过滤器的映射:
在这里插入图片描述
其中是过滤器的名字,< url-pattern>是要经过该过滤器的Web资源,这里指定的是/hello.jsp,如果是要指定项目都经过该过滤器,可以写/*。

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>AddressFilter</filter-name>
        <filter-class>filter.AddressFilter</filter-class>
        <init-param>
            <param-name>addressProhibited</param-name>
            <param-value>127.0.0.1</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>AddressFilter</filter-name>
        <url-pattern>/hello.jsp</url-pattern>
    </filter-mapping>
</web-app>

3. 创建hello.jsp文件

新建一个hello.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>hello</title>
  </head>
  <body>
  正常访问到hello.jsp
  </body>
</html>

4. 测试程序

运行服务器,从calhost:8080/或者127.0.0.1:8080/访问hello.jsp时,就会出现禁止访问的提示;而从其他机器访问时,就能正常访问。
本机测试:
在这里插入图片描述
其他设备测试:
在这里插入图片描述

三、问题及解决

import javax.servlet.*;   //爆红

IDEA报错:java: 程序包javax.servlet不存在。这个问题是由于没有导入Tomcat依赖造成的,详细可以看我另一篇博文:IDEA添加Tomcat依赖

猜你喜欢

转载自blog.csdn.net/qq_41799219/article/details/102241410