Filter
- 过滤器是服务端的代码
用于拦截客户端传入的请求和服务端作出的响应。
- 监视
修改或以某种方式处理正在客户端和服务端之间交换的数据流。
如何使用
与Servlet类似,Filter是一个接口,实现了该接口的类就具备了过滤的功能,实际开发中,只需要自定义一个类,让该类实现Filter即可。
使用:
- 创建一个自定义的Java类,实现javax.servlet.Filter接口。
- 在web.xml配置被过滤器捕获的请求/响应的映射。生命周期与Servlet类似,有 init,doFilter,destroy。
- doFilter方法中执行完过滤器的逻辑之后,需要进行filterChain.doFilter(request,response)方法调用,否则请求/响应无法向后传递。
Filter的生命周期:
-
tomcat服务启动之后,会创建Filter的实例化对象。
-
调用init方法完成初始化操作。
-
当服务器接收一个可以被Filter拦截的请求时,执行doFilter方法来完成具体的拦截处理逻辑。
-
关闭tomcat服务时,执行destroy方法释放当前Filter所占用的资源。
Filter生命周期方法:
- 无参构造
- 只执行一次,当tomcat启动时执行。
- init
- 只执行一次,Filter实例化对象创建完成时执行。
- doFilter
- 执行多次,每次拦截到请求或者响应都会执行。
- destroy
- 只执行一次,当tomcat关闭时执行。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Character...");
servletRequest.setCharacterEncoding("UTF-8");
//必须添加下面这行代码,否则请求或响应被过滤器拦截之后,不再向后传递,只有调用了filterChain的doFilter方法之后才能继续传递
filterChain.doFilter(servletRequest,servletResponse);
}
过滤器的应用
- 统一设置中文编码,解决乱码问题
- 屏蔽用户敏感词
- 限制用户对某些资源的访问权限
屏蔽用户敏感词
TestServlet
package com.chenny.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//此句话如果成功显示,则表明接收到了请求。
System.out.println("Servlet接收到了请求 ");
//取出传来的信息,进行显示查看。
String text = (String) req.getAttribute("text");
System.out.println(text);
}
}
TestFilter
package com.chenny.filter;
import javax.servlet.*;
import java.io.IOException;
public class TestFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//此句话如果成功显示,则表明拦截成功
System.out.println("拦截到了请求");
//过滤器设置中文编码
servletRequest.setCharacterEncoding("UTF-8");
//得到add.jsp中的内容,进行过滤。
String text = servletRequest.getParameter("text");
//显示过滤之前的文本信息
System.out.println("替换之前,: " + text);
//将“敏感词”三字以“***”来代替
text = text.replaceAll("敏感词","***");
servletRequest.setAttribute("text",text);
//显示替换之后的文本内容
System.out.println("替换之后,: " + text);
//调用filterChain,使之向后继续传递
filterChain.doFilter(servletRequest,servletResponse);
}
}
add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="test.do" method="post">
<input type="text" name="text"/><br/>
<input type="submit" value="发布"/>
</form>
</body>
</html>
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">
//TestServlet配置
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.chenny.controller.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test.do</url-pattern>
</servlet-mapping>
//过滤器配置
<filter>
<filter-name>testFilter</filter-name>
<filter-class>com.chenny.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>/test.do</url-pattern>
</filter-mapping>
</web-app>
返回过滤器应用
限制用户对某些资源的访问权限
思路: 过滤器拦截download.jsp,判断发出该请求的客户端对应的用户登录状态,如果是登录状态,放行,否则作出相应的处理:跳转到登录页面,让游客登录。