我们是否在 Spring 中提供了拦截器链接?
Do we have provision for interceptor chaining in Spring?
假设我们有两个拦截器 "LogInterceptor" 和 "AuthInterceptor"。
第一个拦截器记录传入的请求,第二个拦截器对其进行身份验证。
目的:链接 LogIntercptor 和 AuthInterceptor。首先,我希望调用 logInterceptor,然后执行 AuthInterceptor。
注意:我知道 "redirect" 并返回 false(请不要建议那个)
---------------------Log Interceptor---------------------------------------
//First Inteceptor
@Component
public class LogInterceptor extends HandlerInterceptorAdapter
{
private final Logger Logger =
LoggerFactory.getLogger(this.getClass());
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//take action base on incoming IP
long startTime = System.currentTimeMillis();
request.setAttribute("startTime",startTime);
if(request.getRemoteAddr().startsWith("192"))
{
response.sendRedirect("/auth-failed"); //redirect to default
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, @Nullable ModelAndView
modelAndView) throws Exception
{
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, @Nullable Exception
ex) throws Exception
{
}
}
//第二个拦截器"Code is however not complete, I am just seeeking how this can be achieved."
class 授权拦截器
{
}
您只需要确保在配置 InterceptorRegistry
时将 Interceptor
添加到您想要的顺序即可:
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer{
@Autowired
private LogInterceptor logInterceptor;
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(logInterceptor);
registry.addInterceptor(authInterceptor);
}
}
如果你有多个 WebMvcConfigurer
,你可以简单地使用 @Order
来控制 WebMvcConfigurer
的执行顺序(较低的值具有较高的优先级):
@EnableWebMvc
@Configuration
@Order(1)
public class FooWebConfig implements WebMvcConfigurer{
}
@EnableWebMvc
@Configuration
@Order(2)
public class BarWebConfig implements WebMvcConfigurer{
}
假设我们有两个拦截器 "LogInterceptor" 和 "AuthInterceptor"。 第一个拦截器记录传入的请求,第二个拦截器对其进行身份验证。 目的:链接 LogIntercptor 和 AuthInterceptor。首先,我希望调用 logInterceptor,然后执行 AuthInterceptor。 注意:我知道 "redirect" 并返回 false(请不要建议那个)
---------------------Log Interceptor---------------------------------------
//First Inteceptor
@Component
public class LogInterceptor extends HandlerInterceptorAdapter
{
private final Logger Logger =
LoggerFactory.getLogger(this.getClass());
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//take action base on incoming IP
long startTime = System.currentTimeMillis();
request.setAttribute("startTime",startTime);
if(request.getRemoteAddr().startsWith("192"))
{
response.sendRedirect("/auth-failed"); //redirect to default
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, @Nullable ModelAndView
modelAndView) throws Exception
{
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, @Nullable Exception
ex) throws Exception
{
}
}
//第二个拦截器"Code is however not complete, I am just seeeking how this can be achieved." class 授权拦截器 {
}
您只需要确保在配置 InterceptorRegistry
时将 Interceptor
添加到您想要的顺序即可:
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer{
@Autowired
private LogInterceptor logInterceptor;
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(logInterceptor);
registry.addInterceptor(authInterceptor);
}
}
如果你有多个 WebMvcConfigurer
,你可以简单地使用 @Order
来控制 WebMvcConfigurer
的执行顺序(较低的值具有较高的优先级):
@EnableWebMvc
@Configuration
@Order(1)
public class FooWebConfig implements WebMvcConfigurer{
}
@EnableWebMvc
@Configuration
@Order(2)
public class BarWebConfig implements WebMvcConfigurer{
}