Filter

Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。
主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
Filter 有如下几个用处。
·在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
·根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
·在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
·根据需要检查HttpServletResponse ,也可以修改HttpServletResponse 头和数据。
Filter 有如下几个种类。
·用户授权的Filter: Filter 负责检查用户请求,根据请求过滤用户非法请求。
.日志Filter: 详细记录某些特殊的用户请求。
·负责解码的Filter: 包括对非标准编码的请求解码。
.能改变XML 内容的XSLTFilter 等。
一个Filter 可负责拦截多个请求或响应:一个请求或响应也可被多个请求拦截。
创建一个Filter 只需两个步骤:
(1)创建Filter 处理类:
(2)在web.xml 文件中配置Filter 。
一、创建Filter类
创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。
• void init(FilterConfig config): 用于完成Filter 的初始化。
• void destroy(): 用于Filter 销毁前,完成某些资源的回收。
• void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
public class LogFilter implements 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) {
// 获取ServletContext 对象,用于记录日志
ServletContext context = this.config.getServletContext();
long before = System.currentTimeMillis();
System.out.println("开始过滤... ");
// 将请求转换成HttpServletRequest 请求
HttpServletRequest hrequest = (HttpServletRequest) request;
// 记录日志
context.log("Filter已经截获到用户的请求的地址: " + hrequest.getServletPath());
try {
// Filter 只是链式处理,请求依然转发到目的地址。
chain.doFilter(request, response);
} catch (Exception e) {
e.printStackTrace();
}
long after = System.currentTimeMillis();
// 记录日志
context.log("过滤结束");
// 再次记录日志
context.log(" 请求被定位到" + ((HttpServletRequest) request).getRequestURI()
+ "所花的时间为: " + (after - before));
}
}

在上面的请求Fil阳中,仅在日志中记录请求的URL,对所有的请求都执行chain.doFilter(request,reponse)方法,当Filter 对请求过滤后,依然将请求发送到目的地址。如果检查权限,可以在Filter 中根据用户请求的HttpSession,判断用户权限是否足够。如果权限不够,则调用重定向即可,无须调用chain.doFilter(request,reponse)方法。
二、配置Filter
Filter 的配置和Servlet 的配置非常相似,都需要配置两个部分:
·配置Filter 名。
·配置Filter 拦截URL 模式。
区别在于, Servlet 通常只配置一个URL ,而Filter 可以同时拦截多个请求的URL。因此,可以配置多个Filter 拦截模式。
<!-- 定义Filter -->
<filter>
<!-- Filter 的名字 -->
<filter-name>log</filter-name>
<!-- Filter 的实现类 -->
<filter-class>lee.LogFilter</filter-class>
</filter>
<!-- 定义Filter 拦截地址 -->
<filter-mapping>
<!-- Filter 的名字 -->
<filter-name>log</filter-name>
<!-- Filter 负责拦截的URL -->
<servlet-name>*</servlet-name>
</filter-mapping>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值