Servlet的三大组件之一。如果配置过滤器,那么当请求某一个Servlet的时候,先会进入到过滤器中。只有过滤器执行了放行操作的时候,才会继续请求目标的Servlet。
配置Filter
定义一个类,继承Filter,重写doFilter方法。
package com.chinasofti.day11.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/*
过滤器
*/
public class MyFilter implements Filter {
// 创建过滤器时候自动调用。容器启动的时候创建过滤器。
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("执行MyFilter的init方法..");
}
// 每次请求Servlet时候,如果配置了过滤器,每次请求都会执行该方法
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("执行MyFilter的doFilter方法...");
}
// 过滤器被销毁时候自动执行
@Override
public void destroy() {
System.out.println("执行MyFilter的destroy方法...");
}
}
第二步:在web.xml中配置过滤器。
<!-- 配置过滤器 -->
<filter>
<!-- 过滤器的名字 -->
<filter-name>MyFilter</filter-name>
<!-- 过滤器的完整类名 -->
<filter-class>com.chinasofti.day11.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/hello</url-pattern>
</filter-mapping>
上面url-pattern配置过滤器的路径。当用户请求/hello的时候,首先会进入到MyFilter过滤器中。只有当过滤器执行了放行操作的时候,才会执行目标Servlet。
过滤路径的写法与Servlet相同。
FilterConfig
该对象用于获取Filter的配置参数。例如:
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("执行MyFilter的init方法..");
// 获取过滤器的配置参数
name = filterConfig.getInitParameter("name");
}
我们可以在filter节点中指定配置参数:
<!-- 配置参数 -->
<init-param>
<param-name>name</param-name>
<param-value>jacky</param-value>
</init-param>
过滤器链
如果在同一个资源上配置了多个过滤器,那么访问资源的时候,就会按照下面顺序执行过滤器中的代码:
先配置的过滤器就会先启动,然后再执行放行,最后按照配置顺序的相反方向执行放行后的代码。比如有两个Filter,一个FilterA,另外一个FilterB。FilterA先配置,所以执行顺序是:
- 执行FilterA放行前代码;
- 执行FilterA放行代码;
- 执行FilterB放行前代码;
- 执行FilterB放行代码;
- 执行目标Servlet;
- 执行FilterB放行后代码;
- 执行FilterA放行后代码;
零配置(注解)
作用:@WebFilter配置过滤器。
@WebFilter注解的属性:
- value:配置url-pattern。如果只有一个value属性,可以不写value属性名。
- urlPatterns:同上,不能够与value共存。
- servletNames:指定要拦截的Servlet的name属性。
- initParams: 指定servlet配置参数。它是一个数组,数组元素是@WebInitParam类型。
@WebInitParam: 指定一个配置参数,它有两个属性:
- name:参数名
- value:参数值
@WebFilter(filterName = "HelloFilter",urlPatterns = "/*")
public class HelloFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
//获取session
HttpSession session = ((HttpServletRequest)servletRequest).getSession();
//获取Session的name属性
String name = (String)session.getAttribute("name");
//获取请求路径
String url = request.getRequestURL().toString();
int index = url.lastIndexOf("/");
url = url.substring(index);
//判断条件,满足则跳转页面
if(session.getAttribute("name")!=null||url.equals("/Hello")||url.equals("/")){
System.out.println("不进行拦截");
filterChain.doFilter(servletRequest,servletResponse);
}else{
System.out.println("满足拦截条件,进行拦截!");
}
}
@Override
public void destroy() {
}
}
应用场景
1)登录认证
2)项目全局中文乱码处理
3)七天免登陆