Servlet过滤器的使用
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
举个简单的例子,比如我们有个网站是需要登录的,所以在用户进入每个页面我们都需要去检测用户是否有登录,这时候我们就需要用到过滤器了。用户进入需要验证的页面都拦截下来,先进入过滤器做判断,如果有这个用户的登录信息,那么就放行,如果没有查询到此用户的登录信息,那么就跳转到登录页面或者其他你想设定的页面。
(程序的运行需要大量的配置及严苛的语法,如果你是第一次学习此内容,按照教程的指导,完全模仿操作。切勿一来就擅自改动,给自己的学习制造障碍!)
下面通过实例理解过滤器的原理和使用。
一、创建项目
IDEA创建web项目,可以参考我另一篇博文:手摸手教你在IDEA创建Web项目及配置Tomcat
二、编写程序
1. 目录结构如下
2. 编写过滤器程序
过滤器必须实现javax.servlet.Filter接口,该接口包含3个方法:init、doFilter、destroy。
- init(FilterConfig filterConfig):Java EE容器创建过滤器实例后调用该方法,用于为过滤器做准备工作,可以从filterConfig对象读取配置文件web.xml中为该过滤器设置的初始化参数。
- doFilter(ServletRequest request, ServletResponse response, FilterChain chain):过滤操作在该方法里实现,包括检查、修改请求对象,检查修改应答对象。参数request是请求对象,response是应答对象,chain用于访问后续过滤器。
- 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依赖