1. 配置Filter与配置servlet非常相似,需要配置如下两个部分:
(1)配置Filter名
(2)配置Filter拦截的URL模式
区别在于:servlet通常只配置一个URL,而Filter可以同时拦截多个请求的URL。因此在配置FilterURL的模式时通常会使用模式字符串,使得Filter可以拦截多个请求。
2.配置Filter同样有两种方式:
(1)在Filter类中通过@WebFilter注解进行配置
(2)在web.xml文件中进行配置。
3.使用web.xml 文件进行配置,代码如下:
<!-- 定义Filter -->
<filter>
<!-- Filter的名字,相当于指定@WebFilter
的filterName属性 -->
<filter-name>log</filter-name>
<!-- Filter的实现类 -->
<filter-class>lee.LogFilter</filter-class>
</filter>
<!-- 定义Filter拦截的URL地址 -->
<filter-mapping>
<!-- Filter的名字 -->
<filter-name>log</filter-name>
<!-- Filter负责拦截的URL,相当于指定@WebFilter
的urlPatterns属性 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
4.使用@WebFilter注解进行配置
(1)@WebFilter支持的常用属性如下:
配置代码如下:
@WebFilter(filterName="log"
,urlPatterns={"/*"})
public class LogFilter implements Filter
{
5.Filter常用的作用是:对用户请求进行过滤,判断用户是否登录。
下面代码是验证是否登录的一个简单例子:
@WebFilter(filterName="authority"
, urlPatterns={"/*"}
, initParams={
@WebInitParam(name="encoding", value="GBK"),
@WebInitParam(name="loginPage", value="/login.jsp"),
@WebInitParam(name="proLogin", value="/proLogin.jsp")})
public class AuthorityFilter implements Filter
{
// FilterConfig可用于访问Filter的配置信息
private FilterConfig config;
// 实现初始化方法
public void init(FilterConfig config)
{
this.config = config;
}
// 实现销毁方法
public void destroy()
{
this.config = null;
}
// 执行过滤的核心方法
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException,ServletException
{
// 获取该Filter的配置参数
String encoding = config.getInitParameter("encoding");
String loginPage = config.getInitParameter("loginPage");
String proLogin = config.getInitParameter("proLogin");
// 设置request编码用的字符集
request.setCharacterEncoding(encoding); // ①
HttpServletRequest requ = (HttpServletRequest)request;
HttpSession session = requ.getSession(true);
// 获取客户请求的页面
String requestPath = requ.getServletPath();
// 如果session范围的user为null,即表明没有登录
// 且用户请求的既不是登录页面,也不是处理登录的页面
if( session.getAttribute("user") == null
&& !requestPath.endsWith(loginPage)
&& !requestPath.endsWith(proLogin))
{
// forward到登录页面
request.setAttribute("tip" , "您还没有登录");
request.getRequestDispatcher(loginPage)
.forward(request, response);
}
// "放行"请求
else
{
chain.doFilter(request, response);
}
}
}