来源
我有使用@Controller注释的Controller类,它们有使用@RequestMapping注释的方法。 我的任务是审核Controller类收到的所有Web请求到@RequestMapping方法,我在UI上使用数据表来发送和接收来自控制器的响应。审计框架已经到位。
项目在Java Config中配置。
我不知道如何继续完成这项工作。
// Configure Interceptor
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
public @Bean
RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
handlerMapping.setAlwaysUseFullPath(true);
handlerMapping.setUseSuffixPatternMatch(false);
return handlerMapping;
}
}
//Add Handler
@Component
public class MyInterceptor extends HandlerInterceptorAdapter {
@Inject RequestMappingHandlerMapping requestMappingHandlerMapping;
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// do stuff - ( Does my Audit Code go here? eg: Logger.info("xyz request"))
return true;
}
}
我在想这样的事情会起作用。
对此有任何建议,以及 如果它更容易使用Listener或其他一些Interceptor,那将会很有帮助
答案 0 :(得分:2)
使用拦截器,您可以完全访问HandlerMethod,从而可以方便地访问方法参数,方法返回值,方法注释等。
以下示例拦截并记录映射的请求。
class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptorAdapter() {
Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
logger.info("{} - {} - method '{}' on controller '{}'",
request.getMethod(), request.getRequestURI(), method.getName(),
handlerMethod.getBean().getClass()
);
}
return true;
}
});
}
}
它返回true以继续执行链(并将请求转发给其他拦截器或控制器方法本身)。
示例日志输出如下所示:
GET - /greeting - method 'greeting' on controller 'class hello.GreetingController'