Filter过滤器
前言
Filter过滤器的作用及其使用。
一、Filter过滤器
1、Filter概念
1)是什么?
Filter 是Java Web三大组件Servlet、Listener、Filter之一;是一种JavaEE规范,即一个接口。
2)有什么用?
顾名思义,其作用为过滤响应,拦截请求。
3)为什么拦截请求?
权限检查、事务管理等等都需要对请求进行拦截,进一步做一些判断。
2、基本思想
3、未登录不能操作购物车
package com.xhu.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class AdminFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//添加商品到购物车时请登录
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
//未登录将其重定向到登录节面
if (user == null) {
resp.sendRedirect(req.getContextPath() + "/pages/user/login.jsp");
} else {
//放行
filterChain.doFilter(req, resp);
}
}
}
<!-- 为/cart配置监听器-->
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>com.xhu.filter.AdminFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<url-pattern>/cart</url-pattern>
</filter-mapping>
4、Filter生命周期
1)构造方法
2)init方法
注:第1、2步在web工程启动时就已经执行。
3)doFilter方法
注:每次拦截到相应请求才会执行
4)destroy方法
注:停止web工程时就会执行。
5、FilterConfig类
顾名思义,其为Filter的文件配置类,一旦Filter被创建,该配置类也会被创建,包含Filter的配置信息。
作用)
1)获取Filter的别名
2)获取在Filter中配置的init-param
3)获取ServletContext对象。
<!-- 为/cart配置监听器-->
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>com.xhu.filter.AdminFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<url-pattern>/cart</url-pattern>
</filter-mapping>
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//获取配置的FilterName
System.out.println(filterConfig.getFilterName());
//获取该Filter中配置的参数
System.out.println(filterConfig.getInitParameter("username"));
//获取该Filter中配置的所有参数名
Iterator<String> stringIterator = filterConfig.getInitParameterNames().asIterator();
while (stringIterator.hasNext()){
System.out.println(stringIterator.next());
}
//获取Context对象
System.out.println(filterConfig.getServletContext());
}
5、FilterChain过滤器链
多个Filter中的doFilter()执行顺序。
注:拦截相同请求的Filter执行的优先顺序是由web.xml中从上到下的配置顺序。
6、Filter的拦截路径
A.精确匹配
<url-pattern>/cart</url-pattern>
'/'在服务端被解析为:http://ip:port/工程路径/,所以/cart被解析为http://ip:port/工程路径/cart。
请求的的资源路径必须和上面的地址完全一致才能够被Filter拦截。
B.目录匹配
<url-pattern>/cart/*</url-pattern>
除了服务端对’/‘的解析为上面的结果之外,这里的’*'表示通配符,/cart则表示一个目录。所以只要请求cart目录下的所有资源都会被拦截。
C.后缀名匹配
<url-pattern>*.html</url-pattern>
综上的解释,这种匹配只拦截请求工程目录下的HTML文件时才进行拦截。
<url-pattern>*.do</url-pattern>
<url-pattern>*.action</url-pattern>
<url-pattern>*.self-definition</url-pattern>
注:该种匹配不能以’/'开头来写拦截路径。
总结
1)Filter的作用以及用法。
参考文献
[1] JavaWeb 尚硅谷