【学习笔记】过滤器Filter的使用
程序员文章站
2022-05-23 08:37:52
...
Filter概述
Filter可以用来拦截request进行处理的,也可以对返回的response进行拦截处理
过滤器的拦截逻辑:来回都会经过过滤器
filter-过滤器的创建
@WebFilter("/s2")
public class AFilter implements Filter {
public void destroy() {
}
//过滤逻辑
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//拦截执行
System.out.println("第1个过滤器收到请求");
//放行
chain.doFilter(req, resp);
//response回来后执行
System.out.println("第1个过滤器收到响应");
}
public void init(FilterConfig config) throws ServletException {
}
}
filter-过滤器的配置
1:注解配置@WebFilter("/拦截的Servlet或资源")
注解配置时,多个过滤器执行顺序以类名字符串比较规则来,如AFilter
比BFilter
先执行
1:完全路径匹配
@WebFilter("/s1") 拦截s1
@WebFilter("/abc/s1") 拦截abc下的s1
2:目录匹配
@WebFilter("/*") 拦截全部
@WebFilter("/abc/*") 拦截abc目录下的全部
3:扩展名匹配
@WebFilter("*.do") 拦截后缀名为.do的资源
@WebFilter("*.jsp") 拦截后缀名为.jsp的资源
2:web.xml配置
跟配置Servlet类似
<filter>
<filter-name>Filter</filter-name>
<filter-class>Filter类路径</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/拦截的Servlet或资源</url-pattern>
</filter-mapping>
web.xml配置多个过滤器,以配置文件中越上方的过滤器先执行。
注意:多个拦截器只要一个拦截了就访问不到资源
filter-过滤器的生命周期
(1)过滤器有3个方法
init 方法:服务器启动时就创建该filter对象
doFilter 方法:每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter方法
destory 方法:服务器关闭时filter销毁
filter-过滤器的拦截方式设置
默认情况下,过滤器只能拦截直接访问的资源,不能拦截转发访问的资源
如果想让过滤器不管是直接访问,还是转发访问,都能拦截,则需要设置 @WebFilter属性
@WebFilter(value = "/index.jsp",dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD})
案例:用拦截器实现对所有的Servlet编码
@WebFilter(urlPatterns = "/*",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
public class Filter implements javax.servlet.Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}