过滤器
web项目三大组件之一,工作在servlet之前。
应用场景:统一设置字符编码集、敏感词汇的过滤、登录校验、权限验证等。
生命周期:web服务器启动时,过滤器完成初始化工作,web服务器关闭时,过滤器销毁。
过滤器的创建:实现Filter接口
注解配置过滤器
package com.woniuxy.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* 过滤器实现
* 实现javax.servlet.Filter接口
* 具体的过滤逻辑在doFilter方法内部执行
*/
@WebFilter({
"/*"})//注解配置过滤器,{"/*"}配置的是url-pattern,也可以在web.xml中配置
public class MyFilter implements Filter {
/**
* 过滤器完成初始化时调用的方法
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter过滤器完成初始化");
}
/**
* 用于处理具体的过滤业务,执行放行操作。
* @param servletRequest :请求对象
* @param servletResponse :响应对象
* @param filterChain :过滤器链 如果要放行,使用该对象调用doFilter(请求对象,响应对象)
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter过滤器开始执行过滤的逻辑");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
/**
* 过滤器销毁时调用的方法
*/
@Override
public void destroy() {
System.out.println("MyFilter过滤器销毁了");
}
}
web.xml中配置过滤器
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.woniuxy.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:不要同时使用注解和xml配置,任选其中一种即可。
过滤器链的执行顺序
1、使用web.xml配置
则过滤器链的执行顺序由<filter-mapping>的配置顺序来决定。
2、使用注解配置
过滤器链的执行顺序由filter名称的字母顺序来决定。
建议:在编程时,尽量不要让某个过滤器依赖于其他过滤器产生的数据。只要规避了这个问题,则无需考虑过滤器链的执行顺序。
统一设置字符编码
web.xml
<filter>
<filter-name>charset</filter-name>
<filter-class>com.woniuxy.filter.CharsetFilter</filter-class>
<!--设置过滤器初始化参数,指定过滤器要使用的字符编码-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charset</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
CharsetFilter
package com.woniuxy.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* 统一设置字符编码集
*/
public class CharsetFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String value = filterConfig.getInitParameter("encoding");
if (null==value) {
encoding="UTF-8";
}else{
encoding=value;
}
}
/**
* 在过滤器的doFilter方法内部统一设置字符编码集
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throw