Discuss / Java / 一点点小总结

一点点小总结

Topic source

Filter是在servlet层面的,Interceptor是在Controller层面的。效果都是在自己写的代码上面Weaving一些其他的东西进去。

由于SpringBoot就一个servlet,所以Filter适合于做全局的,比如代码改为UTF-8,判断IP来源比对黑名单等等。Fiter主要是要实现doFilter这个方法,传入的参数有request、response、chain。务必记得最后要chain.doFilter(request,response),否则就是把request卡断在doFilter这里了。

Interceptor则适合更加精细粒度的。因为Spring MVC、Spring Boot是一个Servlet多个controller。URL mapping一般在Controller层面上实现。所以Interceptor实现了在URL上面进行拦截。

Interceptor可以选择实现preHandle()、postHandle()和afterCompletion()这几个方法。这些是在request被拦截之后不同阶段、条件执行的。pre这个能读到request、response和handler。其中handler就是被拦截的Controller里面的方法。Post这个方法多了一个controller读到的modelandview参数,如果不是空的话可以在上面做点工作,比如加一个footer之类。Interceptor往往只用request和response两个参数,而不管handler那个参数。

所以Filter是:做完了自己想做的事情,还要记得把控制权pass给servlet来doFilter。Interceptor则是:在指定的阶段做完了自己想做的,不操心后面的了。

Filter可以在Spring MVC里面的xml里面配置,Interceptor则是在MVC里面register上去。

但是到了Springboot里面,配置Filter会利用预装的FilterRegistrationBean。同时也可以设定URL的粒度。(猜想是还是在整个servlet级别取到然后再进一步判断是不是match URL pattern)同时还可以指定order

hmm但是看到人家还有HttpRequestInterceptor以及MethodInterceptor 有点懵逼。

MethodInterceptor我觉得跟廖老师前面提到的:AsepectJ的Annotation是一个概念:

 @Before("execution(public * com.itranswarp.learnjava.service.*.*(..))")

    public void check() {

HttpRequestInterceptor则有点不知道在什么情景下应用


  • 1

Reply