[Servlet&JSP] 过滤器的使用
2015-12-14 21:12
459 查看
过滤器介于Servlet之前,可拦截过滤浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应。
如果调用了FilterChain的
以下实现一个简单的 性能测量过滤器,以记录请求与响应间的时间差,并了解Servlet处理请求到响应所需花费的时间。
PerformanceFilter.java:
web.xml中的设置:
在web.xml中 ,
如果在过滤器初始化时想要读取一些参数,则可以在
接着在init()方法中可以使用如下语句获得初始参数值:
触发过滤器的时机,默认是浏览器直接发出请求。如果是那些通过
如果有某个URL或者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中出现的先后顺序,来决定触发器的执行顺序。
相关文章推荐
- 【我的JS第三本】JavaScript_DOM编程艺术第二版读书笔记
- 【JavaScript】(7)——JavaScript与Ajax交互
- PhantomJS 和Selenium模拟页面js点击
- 【Javascript】二维数组
- 依赖注入的javascript实现
- 用 JavaScript 编写第一个 UWP 应用 - 手机归属地查询
- jSON Call can throw but it is not marked with try
- json处理复杂对象jsonConfig
- javascript发送验证码
- express package.json解析
- 关于js的一些小tip
- XML解析、Json解析
- 使用js Math.random()函数生成n到m间的随机数字
- 如何处理JS与smarty标签的冲突
- 原生态ajax和 ajax的两个框架的 JS实现
- jsp中显示本地图片
- 基于JavaScript 声明全局变量的三种方式详解
- JavaScript计时事件
- js 中{},[]中括号,大括号使用详解
- JS 第二记