过滤器Filter
功能:1、用来拦截传入的请求和传出的相应。2、修改或以某种方式处理正在客户端和服务端之间交换的数据流。
使用:过滤器其实和Servlet一样,都是JavaWeb提供的一组接口,开发者只需要自定义一个实现类实现该接口即可。不过他和Servlet的实现却有一些区别:
- Java8新特性中,新增了对于接口中抽象方法的默认属性设定。也就是在其接口的抽象方法前加上了default关键字。加上了该关键字后的接口抽象方法可以在实现的时候不必重写。这点和我们以前所了解的接口特性是不同的。
- Servlet中,所有接口的抽象方法都需要被重写,所以衍生出了GenericServlet和HttpServlet,而Filter中的生命周期方法则在前加上了default关键字,因此不需要去进行重写。
Filter的一系列配置
在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">
<filter>
<filter-name>character</filter-name>
<filter-class>com.gyh.servlet.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>character</filter-name>
<url-pattern>/login</url-pattern>
<url-pattern>/user</url-pattern>
</filter-mapping>
</web-app>
过滤器的配置和Servlet的基本相同,不同点是Servlet属于单对单的映射关系,而过滤器属于一对多的映射关系。一个过滤器可以供给多个页面使用。
关于过滤器中的一些方法以及注意事项
- servletRequest:该对象是相当于往Servlet中的对象发送一系列的请求,比如:
- 调用其setCharacterEncoding(“UTF-8”); 可以对进入过滤器中的所有页面进行编码格式的转换。
- 在处理完所有的逻辑之后,必须调用filterChain.doFilter方法来放行。因为进入过滤器之后相当于逻辑停滞,如果不放行的话是无法进行过滤之后的操作的。
Filter的生命周期
当Tomcat启动的时候,通过反射机制调用Filter的无参构造函数来创建实例化对象,同时调用init方法实现初始化。
doFilter方法调用多次。
当Tomcat关闭的时候,销毁Filter。
- 无参构造函数:只调用一次,当Tomcat启动的时候调用(Filter一定要进行配置之后才可以调用)
- init方法:只调用一次,当Filter的实例化对象创建完成之后调用
- doFilter:调用多次,访问Filter的业务逻辑都写在Filter之中。
- destory:只调用一次,Tomcat关闭时调用。
当同时配置多个Filter的时候,执行的顺序是由web.xml的顺序决定的。
也可以通过注解的方式来简化Web.xml的配置 @WebFilter(),但是,如果需要指定多个过滤器的执行顺序的话,那么就不能使用注解的方式来进行配置,因为使用注解的方式进行配置是无法来指定执行的顺序的。
实际开发中的使用场景
- 统一处理中文乱码
- 屏蔽敏感词
- 控制资源的访问权限。
统一处理中文乱码
@WebFilter("/")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest,servletResponse);
}
}
屏蔽敏感词
@WebFilter("/")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 将敏感词替换成***
String name = servletRequest.getParameter("name");
System.out.println(name);
name = name.replaceAll("敏感词","***");
System.out.println(name);
}
}
控制资源的访问权限
@WebFilter("/")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 取出HttpRequest对象等,进行强转
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
// 取出用来验证登录的session
HttpSession session = httpServletRequest.getSession();
String name = (String)session.getAttribute("name");
if(name == null){
// 不是登陆状态
httpServletResponse.sendRedirect("/login.jsp");
} else {
// 是登陆状态 放行
filterChain.doFilter(servletRequest,servletResponse);
}
}
}