Spring boot
拦截器
HandlerInterceptor
上一章对过滤器的定义做了说明,也比较简单。过滤器属于 Servlet 范畴的 API,与 Spring 没什么关系。
Web 开发中,我们除了使用 Filter 来过滤请 web 求外,还可以使用 Spring 提供的 HandlerInterceptor(拦 截器)。
HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在 request 被响应之前、request 被响
应之后、视图渲染之前以及 request 全部结束之后。我们不能通过拦截器修改 request 内容,但是可以通过抛出
异常(或者返回 false)来暂停 request 的执行。
实现 UserRoleAuthorizationInterceptor 的拦截器有:
ConversionServiceExposingInterceptor
CorsInterceptor
LocaleChangeInterceptor
PathExposingHandlerInterceptor
ResourceUrlProviderExposingInterceptor
ThemeChangeInterceptor
UriTemplateVariablesHandlerInterceptor
UserRoleAuthorizationInterceptor
其中 LocaleChangeInterceptor 和 ThemeChangeInterceptor 比较常用。
配 置 拦 截 器 也很简单, Spring 为什么提供了 基 础 类 WebMvcConfigurerAdapter ,我们 只 需 要 重 写
addInterceptors 方法添加注册拦截器。
实现自定义拦截器只需要 3 步:
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
2、创建一个 Java 类继承 WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
2、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在 addInterceptors 方法中添加)。
PS:本文重点在如何在 Spring-Boot 中使用拦截器,关于拦截器的原理请大家查阅资料了解。
代码:
com.hpit.sb.interceptors. MyInterceptor1
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.apache.log4j.Logger;
import
org.springframework.web.servlet.HandlerInterceptor;
import
org.springframework.web.servlet.ModelAndView;
/**
*
TODO
使用常规的方式开发springmvc拦截器1
*
*
*/
public class
MyInterceptor1
implements
HandlerInterceptor {
private
Logger
logger
= Logger.
getLogger
(getClass());
@Override
public void
afterCompletion(HttpServletRequest
request
, HttpServletResponse
response
, Object
object
,
Exception
exception
)
throws
Exception {
logger
.info(
"afterCompletion..."
);
}
@Override
public void
postHandle(HttpServletRequest
request
, HttpServletResponse
response
, Object
object
,
ModelAndView
modelAndView
)
throws
Exception {
logger
.info(
"postHandle..."
);
}
@Override
public boolean
preHandle(HttpServletRequest
request
, HttpServletResponse
response
, Object
object
)
throws
Exception {
logger
.info(
"preHandle..."
);
return true
;
}
}
com.hpit.sb.interceptors. MyInterceptor2
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.apache.log4j.Logger;
import
org.springframework.web.servlet.HandlerInterceptor;
import
org.springframework.web.servlet.ModelAndView;
/**
*
TODO
使用常规的方式开发springmvc拦截器2
*
*/
public class
MyInterceptor2
implements
HandlerInterceptor {
private
Logger
logger
= Logger.
getLogger
(getClass());
@Override
public void
afterCompletion(HttpServletRequest
request
, HttpServletResponse
response
, Object
object
,
Exception
exception
)
throws
Exception {
logger
.info(
"afterCompletion..."
);
}
@Override
public void
postHandle(HttpServletRequest
request
, HttpServletResponse
response
, Object
object
,
ModelAndView
modelAndView
)
throws
Exception {
logger
.info(
"postHandle..."
);
}
@Override
public boolean
preHandle(HttpServletRequest
request
, HttpServletResponse
response
, Object
object
)
throws
Exception {
logger
.info(
"preHandle..."
);
return true
;
}
}
重写 web 配置 addInterceptors()方法,添加自定义拦截器:
com.hpit.sb.config. MyWebAppConfig
import
org.springframework.context.annotation.Configuration;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import
com.hpit.sb.interceptors.MyInterceptor1;
import
com.hpit.sb.interceptors.MyInterceptor2;
/**
*
TODO
重写webmvc配置
*
*/
@Configuration
public class
MyWebAppConfig
extends
WebMvcConfigurerAdapter {
@Override
public void
addInterceptors(InterceptorRegistry
registry
) {
// 重写addInterceptors方法并为拦截器配置拦截规则
registry
.addInterceptor(
new
MyInterceptor1()).addPathPatterns(
"/**"
);
registry
.addInterceptor(
new
MyInterceptor2()).addPathPatterns(
"/**"
);
//排除路径
//registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**").excludePathPatterns("/Hello");
super
.addInterceptors(
registry
);
}
}
启动日志,请求任意控制器:日志输出: