什么是过滤器
简介Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
功能在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
实现 Filter 接口
Java Servlet 提供了过滤器接口:javax.servlet.Filter,过滤器需要实现 Filter,并重写三个抽象方法。1
2
3void (FilterConfig var1);
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3); // 具体业务逻辑
void destroy(); // 销毁(初始化的内容)
init() 及 destroy() 仅执行一次,init() 在容器(web 容器)启动时执行,容器按照 web.xml 中 Filter(所有的) 注册的顺序执行 init(),destory() 在容器停止时执行。
创建过滤器
使用过滤器实现一个页面重定向功能。原本应该访问的页面由于已经销毁或者其他原因,导致不能访问,现在需要让该页面重定向至其他页面,我们约定原来的页面为 target,而重定向的页面为 replacement。
创建页面
两个页面,/pages/first.jsp 为target,/pages/second.jsp 为 replacement。first.jsp1
2
3
4
5
6
7
8
9
FirstThis is the first page.
second.jsp1
2
3
4
5
6
7
8
9
SecondThis is the second page.
配置 web.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
rendirectFilter
com.zhoupq.springmvcpro.filter.RedirectFilter
target
/pages/first.jsp
replacement
/pages/second.jsp
rendirectFilter
/*
创建 filter-class1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56package com.zhoupq.springmvcpro.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Author zhoupq
* Date 2017/10/12.
*/
public class RedirectFilter implements Filter
{
private String target = "";
private String replacement = "";
public void (FilterConfig filterConfig)
throws ServletException
{
this.target = filterConfig.getInitParameter("target");
this.replacement = filterConfig.getInitParameter("replacement");
}
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException
{
//转换
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
/*
省略登录、权限判断
*/
// 当前访问的URL符合条件
if (this.target.equals(request.getRequestURI()))
{
// 重定向
response.sendRedirect(this.replacement);
}
// 进入 Filter 链(下一个Filter),最终web服务器就会调用web资源的service方法,即web资源就会被访问
filterChain.doFilter(request, response);
}
public void destroy()
{
this.target = null;
this.replacement = null;
}
}
启动Tomcat,浏览器访问 localhost:8080/first.jsp,浏览器重定向至 localhost:8080/second.jsp
感谢