过滤器
过滤器:依赖于servlet容器。它具有拦截客户端请求的功能,Servlet过滤器可以改变请求中的内容,来满足实际开发中的需要。一般用于完成通用的操作,如:登陆验证、统一编码处理、敏感字符过滤…
快速入门
1.步骤
- 定义一个类,实现接口Filter
- 复写方法
- 配置拦截路径
3.1 web.xml
3.2 注解 :@WebFilter - 根据需要修改request头和request数据;
- 在servlet被调用之后截获.
最简单的例子(使用注解):
@WebFilter("/*") //访问所有资源之前都会执行该过滤器
public class FilterDemo1 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() {
}
}
2.使用web.xml进行配置
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.lwl.filter.FilterDomo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
3. 执行流程
- 在服务器启动后创建Filter对象,然后调用init方法,一般用于加载资源
- 执行doFilter方法,进行拦截
- 在服务器关闭后,Filter被销毁。一般用于释放资源
4.过滤器配置
拦截路径配置:
- 拦截具体资源路径: /index.jsp 代表只有访问index.jsp资源的时候,过滤器才会被执行
- 拦截目录:/user/* 代表访问/user下的所有资源时,过滤器都会被执行
- 后缀名拦截: *.jsp 所有后缀名为jsp的资源被访问时,都会执行过滤器
- 拦截所有资源: /*
拦截方式配置:资源被访问的方式
-
注解配置 , 对dispatcherTypes的只值进行配置
1. REQUEST:默认值。浏览器直接请求资源
2. FORWARD:转发访问资源
3. INCLUDE:包含访问资源
4. ERROR:错误跳转资源
5. ASYNC:异步访问资源 -
web.xml配置
设置 < dispatcher > < /dispatcher >标签即可
5.过滤器链
执行顺序:如果有两个过滤器:过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
过滤器先后顺序问题:
6. 注解配置:按照类名的字符串比较规则比较,值小的先执行
如: AFilter 和 BFilter,AFilter就先执行了。
7. web.xml配置: 谁定义在上边,谁先执行
案例1:登陆验证
需求
- 访问day17_case案例的资源。验证其是否登录
- 如果登录了,则直接放行。
- 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
分析:
- 判断用户要访问的资源是否是登录相关的资源,如果是的话直接放行,否则进入第二步
- 判断用户是否已经登录,也就是Session中是否已经有User,如果有的话说明已经登录,直接放行。否则就是没有登录,跳转到登录页面。
源码:
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//0.强制转换
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response