Filter入门知识
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
一、Filter拦截的基本注解用法
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//拦截全部页面
@WebFilter("/*")
//拦截单独页面
//@WebFilter("/index.jsp")
//拦截某个目录下的全部页面 如user
//@WebFilter("/user/*")
//拦截此后缀名的所有页面 如 .jsp
//@WebFilter("*.jsp")
public class filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter被执行");
// 放行
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("放行");
}
@Override
public void destroy() {
System.out.println("filter被销毁");
}
}
拦截所有界面 /*实例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>index02.jsp执行中</h1>
</body>
</html>
执行控制台及网页输出:
这里dofilter被执行三次的原因是在doFilter()执行流程中:
1.请求被拦截器拦截 拦截器进行数据验证
2.拦截器根据数据验证的返回值进行判断
3. 判断成功后进入请求的方法或者类中。 判断失败返回给拦截器该抛出异常出异常。
二、filter拦截方式的注解配置:
注:两次拦截最好不要同时运行,否则控制台的输出会乱,可将其中的一个filter注释掉
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//拦截转发
//默认值 直接访问 REQUEST 可省略
//@WebFilter(value= "/*",dispatcherTypes =DispatcherType.FORWARD)
//拦截包含访问资源 INCLUDE 拦截错误跳转资源 ERROR 拦截异步访问资源 ASYNC
public class filter02 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter拦截转发被执行");
// 放行
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("放行");
}
@Override
public void destroy() {
System.out.println("filter被销毁");
}
}
设置一个跳转页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>index.jsp页面执行中。。。</h1>
<%
request.getRequestDispatcher("/index02.jsp").forward(request,response);
%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>index02.jsp执行中</h1>
</body>
</html>
控制台及网页输出结果: