概念:对访问的目标资源的请求和响应进行拦截, web中的过滤器:当服务访问资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
?过滤器的作用:一般用于完成通用的操作,如登录验证、统一编码处理、敏感字过滤等
1.创建拦截器流程 ? ? 1.实现 javax.servlet.Filter接口 ? ? 2.重写 init、doFilter、destroy方法 ? ? 3.配置拦截路径 ? ? ? ? 1使用web.xml配置 ? ? ? ? 2.使用注解配置
package com.xiaoqiang.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//@WebFilter("/*") // 注解配置 "/*"代表拦截所有请求
public class FiirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter被执行了。。。。。");
filterChain.doFilter(servletRequest,servletResponse);//放行,继续执行请求
}
@Override
public void destroy() {
}
}
web.xml添加过滤器
<filter>
<filter-name>demo</filter-name><!--filter 名称-->
<filter-class>com.xiaoqiang.filter.FiirstFilter</filter-class><!--filter 执行类地址-->
</filter>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/*</url-pattern><!--配置拦截地址,/*表示拦截所有请求-->
</filter-mapping>
2.过滤器执行流程 ? ? 1.拦截到servlet的请求 ? ? ? ?在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest,处理request消息 ? ? 2.处理请求 ? ? ? ? 判断是否允许通过请求 ? ? 3.拦截返回请求 ? ? ? ? 拦截servlet到请求端的响应,处理response
3.filter的生命周期 ? ? init:服务启动的时候调用init方法创建filter,只执行一次,用于加载资源 ? ? doFilter:服务被访问的时候执行,执行多次,每次被调用均会执行,用于执行拦截的逻辑 ? ? destroy:服务正常关闭的时候执行,只执行一次,用于释放资源
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("服务启动调用init方法创建filter。。。。。");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter被执行了。。。。。");
filterChain.doFilter(servletRequest,servletResponse);//放行,继续执行请求
System.out.println("请求返回了。。。。");
}
@Override
public void destroy() {
System.out.println("服务关闭调用destroy销毁filter。。。。。");
}
4.拦截器路径配置
? ? ? ? 1.具体资源路径:只拦截配置的具体地址
? ? ? ? ? ? ? ? 例如:/index.jsp,只有访问index.jsp资源时才会被拦截
? ? ? ? 2.拦截目录:拦截配置的该路径的所有请求
? ? ? ? ? ? ? ? 例如:/user/*,访问路径包含 user的都会被拦截
? ? ? ? ?3.后缀名拦截:拦截含有固定后缀的请求
? ? ? ? ? ? ? ? 例如:/*.do,所有以.do结尾的请求都会被拦截
? ? ? ? ?4.拦截所有请求:/* 所有的请求都会被该拦截器请求
注解配置
@WebFilter("/*") // 注解配置 "/*"代表拦截所有请求
@WebFilter("*.do")//拦截以.do结尾的请求
@WebFilter("/user/*")//拦截user路径下的所有请求
@WebFilter("/index.jsp")//只拦截index.jsp
web.xml配置
<filter>
<filter-name>demo</filter-name><!--filter 名称-->
<filter-class>com.xiaoqiang.filter.FiirstFilter</filter-class><!--filter 执行类地址-->
</filter>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/*</url-pattern><!--配置拦截地址,/*表示拦截所有请求-->
</filter-mapping>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>*.do</url-pattern><!--配置拦截地址,只拦截以.do结尾的请求-->
</filter-mapping>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/user/*</url-pattern><!--配置拦截地址,拦截user路径下所有请求-->
</filter-mapping>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/index.jsp</url-pattern><!--配置拦截地址,只拦截index.jsp-->
</filter-mapping>
5.拦截不同方式请求的配置 ? ? 1.默认 REQUEST:拦截直接请求资源的请求 ? ? 2.FORWARD:拦截转发请求 ? ? 3.INCLUDE:包含访问资源 ? ? 4.ERROR:错误的跳转资源 ? ? 6.ASYNC:异步访问资源
注解:
package com.xiaoqiang.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//当正常访问资源才会被拦截(默认的dispatchTypes)
//@WebFilter(value = "/index.jap",dispatcherTypes = DispatcherType.REQUEST)
//转发访问资源时才会被拦截
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//正常访问和转发到index.jsp都会被拦截的配置
//@WebFilter(value = "/*",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
//配置成 /* 正常请求会被拦截一次,转发时还会在被拦截一次
@WebFilter(value = "/*",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
public class TwoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("DispatcherType.FORWARD...........");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
? ? ? ?web.xml
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/index.jsp</url-pattern><!--配置拦截地址,只拦截index.jsp-->
<dispatcher>FORWARD</dispatcher><!--拦截访问类型-->
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
6.过滤器链(多个过滤器执行顺序)
? ? ? ? 服务配置有多个过滤器是,请求时先执行的过滤器在返回时最后执行。
7.多个过滤器的执行顺序
? ? ? ? 1.注解配置:按照类名的字符串比较规则比较,值小的先执行
? ? ? ? ? ? ? ? 如AFilter 和Bfilter,就会先执行AFilter
? ? ? ? 2.web.xml:? filter-mapping定义在上边谁就先执行
|