一.Servlet Filter概述
Servlet Filter,也就是filter过滤器,可以对一些数据过滤和预处理。当我们访问某些网站或页面时,有一些敏感词汇无法被显示,而是被 * 代替,这就是用过滤器对信息进行了处理。而这只是filter的功能之一。
过滤器可以做很多事情,常见的包括:
- 过滤脏敏感字符(绿一些敏感的字符串);
- 避免中文乱码(统一设置请求和响应的编码);
- 权限验证(规定只有带指定Session或Cookie的请求,才能访问资源);
- 用于实现自动登录;
二.过滤器如何实现拦截
- 当客户端发生请求后,在HttpServletRequest 到达Servlet 之前,过滤器拦截客户的HttpServletRequest 。
- 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
- 在过滤器中调用doFilter方法,对请求放行。请求到达Servlet后,对请求进行处理并产生HttpServletResponse发送给客户端。
- 在HttpServletResponse 到达客户端之前,过滤器拦截HttpServletResponse 。
- 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
- 最后,HttpServletResponse到达客户端。
代码示例
// filter过滤器的使用步骤
/*
* 1.编写一个类实现filter窗口
* 2.实现过滤方法dofilter()
* 3.到web.xml中去配置filter()的拦截路径
* 4.多个filter过滤器执行的特点
* 5.所有filter和目标资源默认都执行在同一个线程中
* 6.多个filter共同执行时,使用的是同一个request对象*/
//filter过滤器只关心请求的地址是否存在,不关心请求的资源是否存在
public class adminfilter implements Filter {
public adminfilter() {
System.out.println("1.filter构造器方法AdminFilter()");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 专门用来拦截请求
HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
// 如果等于nul,说明还没有登录
if (user == null) {
servletRequest.getRequestDispatcher("/logun.jsp").forward(servletRequest,servletResponse);
return;
}else {
// 让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
// 主要目的:获取初始化参数
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
三.Filter的生命周期**
1.Filter接口中有三个重要的方法。
- init()方法:初始化参数,在创建Filter时自动调用。当我们需要设置初始化参数的时候,可以写到该方法中。
- doFilter()方法:拦截到要执行的请求时,doFilter就会执行。这里面写我们对请求和响应的预处理。
- destroy()方法:在销毁Filter时自动调用
- public interface Filter {
default public void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain)
throws IOException, ServletException;
default public void destroy() {}
}
2.Filter的生命周期
-
Filter的创建和销毁由web服务器控制。
-
服务器启动的时候,web服务器创建Filter的实例对象,并调用其init方法,完成对象的初始化功能。filter对象只会创建一次,init方法也只会执行一次。
-
拦截到请求时,执行doFilter方法。可以执行多次。
-
服务器关闭时,web服务器销毁Filter的实例对象。
四.注册与映射 Filter
通过 web.xml 配置注册与映射 Filter
1. 通过web.xml配置
在 web.xml 中,通过 及其子元素注册 Filter,代码如下。
<filter>
<filter-name>myFilter</filter-name>
<filter-class>net.biancheng.www.MyFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>yy</param-value>
</init-param>
<init-param>
<param-name>URL</param-name>
<param-value>www.yy.net</param-value>
</init-param>
</filter>
在 web.xml 中,通过使用 及其子元素映射 Filter,代码如下。
<filter-name>myFilter</filter-name>
<url-pattern>/login</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>.
<filter-name>myFilter</filter-name>
<servlet-name>ServletDemo</servlet-name>
</filter-mapping>