发表于: 2017-11-03 22:41:52

1 871


一.今日完成

今天梳理了Spring Interceptor 和Servlet Filter区别相关知识

1.interceptor 使用

  • interceptor 的执行顺序大致为:

  • i.请求到达 DispatcherServlet
  1. ii.DispatcherServlet 发送至 Interceptor ,执行 preHandle
  2. iii.请求达到 Controller
  3. iv.请求结束后,postHandle 执行

Spring 中主要通过 HandlerInterceptor 接口来实现请求的拦截,实现 HandlerInterceptor 接口需要实现下面三个方法:

preHandle() – 在handler执行之前,返回 boolean 值,true 表示继续执行,false 为停止执行并返回。

postHandle() – 在handler执行之后, 可以在返回之前对返回的结果进行修改

afterCompletion() – 在请求完全结束后调用,可以用来统计请求耗时等等

统计请求耗时

public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter {

private static final Logger logger = LoggerFactory.getLogger(ExecuteTimeInterceptor.class);

//before the actual handler will be executed
   public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {

long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);

return true;
}

//after the handler is executed
   public void postHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView)
throws Exception {

long startTime = (Long)request.getAttribute("startTime");

long endTime = System.currentTimeMillis();

long executeTime = endTime - startTime;

//modified the exisitng modelAndView
       modelAndView.addObject("executeTime",executeTime);

//log it
       if(logger.isDebugEnabled()){
logger.debug("[" + handler + "] executeTime : " + executeTime + "ms");
}
}
}

使用mvc:interceptors标签来声明需要加入到SpringMVC拦截器链中的拦截器

<mvc:interceptors>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
   <bean class="com.company.app.web.interceptor.AllInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/parent/**"/>
<bean class="com.company.authorization.interceptor.SecurityInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/parent/**"/>
<bean class="com.company.authorization.interceptor.SecuritySystemInterceptor" />
</mvc:interceptor>
</mvc:interceptors>

可以利用mvc:interceptors标签声明一系列的拦截器,然后它们就可以形成一个拦截器链,拦截器的执行顺序是按声明的先后顺序执行的,先声明的拦截器中的preHandle方法会先执行,然而它的postHandle方法和afterCompletion方法却会后执行。

在mvc:interceptors标签下声明interceptor主要有两种方式:

a.直接定义一个Interceptor实现类的bean对象。使用这种方式声明的Interceptor拦截器将会对所有的请求进行拦截。

b.使用mvc:interceptor标签进行声明。使用这种方式进行声明的Interceptor可以通过mvc:mapping子标签来定义需要进行拦截的请求路径。

经过上述两步之后,定义的拦截器就会发生作用对特定的请求进行拦截了。

2.Filter 使用

  • Servlet 的 Filter 接口需要实现如下方法:

    i.void init(FilterConfig paramFilterConfig) – 当容器初始化 Filter 时调用,该方法在 Filter 的生命周期只会被调用一次,一般在该方法中初始化一些资源,FilterConfig 是容器提供给 Filter 的初始化参数,在该方法中可以抛出 ServletException 。init 方法必须执行成功,否则 Filter 可能不起作用,出现以下两种情况时,web 容器中 Filter 可能无效: 1)抛出 ServletException 2)超过 web 容器定义的执行时间。

    ii.doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain paramFilterChain) – Web 容器每一次请求都会调用该方法。该方法将容器的请求和响应作为参数传递进来, FilterChain 用来调用下一个 Filter。

    iii.void destroy() – 当容器销毁 Filter 实例时调用该方法,可以在方法中销毁资源,该方法在 Filter 的生命周期只会被调用一次。


  • 3.Filter 和 Interceptor 的用途

    • 1)Authentication Filters

      2)Logging and Auditing Filters

      3)Image conversion Filters

      4)Data compression Filters

      5)Encryption Filters

      6)Tokenizing Filters

      7)Filters that trigger resource access events

      8)XSL/T filters

      9)Mime-type chain Filter

      Request Filters:

      执行安全检查 perform security checks

      格式化请求头和主体 reformat request headers or bodies

      审查或者记录日志 audit or log requests

      根据请求内容授权或者限制用户访问 Authentication-Blocking requests based on user identity.

      根据请求频率限制用户访问

      Response Filters :

      压缩响应内容,比如让下载的内容更小 Compress the response stream

      追加或者修改响应 append or alter the response stream

      创建或者整体修改响应 create a different response altogether

      根据地方不同修改响应内容 Localization-Targeting the request and response to a particular locale.


    二.明日计划

    整理任务7代码,提交任务.


三.遇到问题

暂无.


四.收获

以上.




返回列表 返回列表
评论

    分享到