我如何为特定请求使用多个拦截器,例如 POST、Get 和 PUT?
How can i use multiple interceptors for specific request such as POST, Get and PUT?
我在项目中使用 spring 引导和云。对于日志记录,我使用拦截器。由于我是拦截器的新手,所以我很难使用多个拦截器。比如我可以为特定任务使用特定的拦截器吗?例如,当我请求 post 时,会调用 POST 拦截器,当我使用 GET 时,会调用 get 拦截器。以及如何为多个拦截器编写代码?
我还没有尝试过任何东西,因为我不明白逻辑
你可以定义所有你想要的HTTP拦截器,每个拦截器都应该实现拦截HTTP请求的逻辑。
@Slf4j
@Component
public class GetRequestInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getMethod().equals(HttpMethod.GET.name())) {
log.info("intercepting GET request {}", request.getRequestURI());
}
return true;
}
}
@Slf4j
@Component
public class PostRequestInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getMethod().equals(HttpMethod.POST.name())) {
log.info("intercepting POST request {}", request.getRequestURI());
}
return true;
}
}
然后你必须在 spring 中注册它们。
@RequiredArgsConstructor
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
private final GetRequestInterceptor getInterceptor;
private final PostRequestInterceptor postRequestInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getInterceptor);
registry.addInterceptor(postRequestInterceptor);
}
}
@earandap
您的评论有效非常感谢。
这是我的代码:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
log.info("[START] [" + request.getMethod() + "] [ URL is: " + request.getRequestURL().toString()
+ " Body is: {}]");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
long startTime = (long) request.getAttribute("startTime");
request.removeAttribute("startTime");
long endTime = System.currentTimeMillis();
log.info("[END] [" + request.getMethod() + "] [ URL is:" + request.getRequestURL().toString()
+ "] [Execution Time: {} miliseconds]", (endTime - startTime));
}
我在项目中使用 spring 引导和云。对于日志记录,我使用拦截器。由于我是拦截器的新手,所以我很难使用多个拦截器。比如我可以为特定任务使用特定的拦截器吗?例如,当我请求 post 时,会调用 POST 拦截器,当我使用 GET 时,会调用 get 拦截器。以及如何为多个拦截器编写代码?
我还没有尝试过任何东西,因为我不明白逻辑
你可以定义所有你想要的HTTP拦截器,每个拦截器都应该实现拦截HTTP请求的逻辑。
@Slf4j
@Component
public class GetRequestInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getMethod().equals(HttpMethod.GET.name())) {
log.info("intercepting GET request {}", request.getRequestURI());
}
return true;
}
}
@Slf4j
@Component
public class PostRequestInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getMethod().equals(HttpMethod.POST.name())) {
log.info("intercepting POST request {}", request.getRequestURI());
}
return true;
}
}
然后你必须在 spring 中注册它们。
@RequiredArgsConstructor
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
private final GetRequestInterceptor getInterceptor;
private final PostRequestInterceptor postRequestInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getInterceptor);
registry.addInterceptor(postRequestInterceptor);
}
}
@earandap
您的评论有效非常感谢。 这是我的代码:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
log.info("[START] [" + request.getMethod() + "] [ URL is: " + request.getRequestURL().toString()
+ " Body is: {}]");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
long startTime = (long) request.getAttribute("startTime");
request.removeAttribute("startTime");
long endTime = System.currentTimeMillis();
log.info("[END] [" + request.getMethod() + "] [ URL is:" + request.getRequestURL().toString()
+ "] [Execution Time: {} miliseconds]", (endTime - startTime));
}