您的位置:首页 > Web前端 > JavaScript

[Servlet&JSP] 过滤器的使用

2015-12-14 21:12 459 查看
过滤器介于Servlet之前,可拦截过滤浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应。

过滤器的概念

像性能测量、用户验证、字符替换、压缩等需求,应该设计为独立的组件,随时可以添加到应用程序之中,也可以随时移除,而不用修改原有的程序。Servlet/JSP提供了过滤器机制以实现这些组件服务,可视需求抽换过滤器或调整过滤器的顺序,也可以针对不同的URL应用不同的过滤器,甚至在不同的Servlet间请求转发或包括时应用过滤器。

过滤器的实现

在Servlet/JSP中要实现过滤器,必须实现Filter接口,并在web.xml中定义过滤器,让容器知道该加载哪些过滤器类。Filter接口有三个要实现的方法:

init()


doFilter()


destroy()


如果调用了FilterChain的
doFilter()
方法,就会执行下一个过滤器,如果没有过滤器,就调用请求目标Servlet的
service()
方法。如果因为某个情况(如用户没有通过验证)而没有调用FilterChain的
doFilter()
方法,则请求就不会继续交给接下来的过滤器或目标Servlet,这时就是所谓的拦截请求(从Servlet的观点来看,它根本不知道浏览器发出了请求)。

以下实现一个简单的 性能测量过滤器,以记录请求与响应间的时间差,并了解Servlet处理请求到响应所需花费的时间。

PerformanceFilter.java:

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class PerformanceFilter implements Filter{
private FilterConfig filterConfig;

@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
long begin = System.currentTimeMillis();
chain.doFilter(request, response);
filterConfig.getServletContext().log("Request process in " +
(System.currentTimeMillis() - begin) + " milliseconds");
}

@Override
public void destroy() {
// TODO Auto-generated method stub

}
}


web.xml中的设置:

<web-app ...>
<filter>
<filter-name>PerformanceFilter</filter-name>
<filter-class>club.chuxing.PerformanceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PerformanceFilter</filter-name>
<url-pattern>/prime.do</url-pattern>
<!-- <servlet-name>PrimeServlet</servlet-name> -->
</filter-mapping>

<servlet>
<servlet-name>PrimeServlet</servlet-name>
<servlet-class>club.chuxing.PrimeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrimeServlet</servlet-name>
<url-pattern>/prime.do</url-pattern>
</servlet-mapping>
</web-app>


在web.xml中 ,
</filter-mapping>
可以使用
<url-pattern>
或者
<servlet-name>
来表示哪些URL或Servlet将应用此过滤器。如果想一次符合所有的Servlet名称,则可以使用星号(
*
)。

如果在过滤器初始化时想要读取一些参数,则可以在
<filter>
标签中进行设置,如:

<filter>
<filter-name>PerformanceFilter</filter-name>
<filter-class>club.chuxing.PerformanceFilter</filter-class>
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
</filter>


接着在init()方法中可以使用如下语句获得初始参数值:

public void init(FilterConfig filterConfig) throws ServletException {
String param1 = filterConfig.getInitParameter("param1");
//other process
}


触发过滤器的时机,默认是浏览器直接发出请求。如果是那些通过
RequestDispatcher
forward()
include()
而来的请求,则可以在
web.xml
中设置
<dispatcher>
标签,指定那些请求转发类型可以通过过滤器。如果不设置
<dispatcher>
标签,则默认为
REQUEST
ERROR
是指由容器处理异常而转发过来的请求可以触发过滤器。

<filter-mapping>
<filter-name>PerformanceFilter</filter-name>
<servlet-name>*.do</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>


如果有某个URL或者Servlet会应用多个过滤器,则根据
<filter-mapping>
在web.xml中出现的先后顺序,来决定触发器的执行顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: