簡體   English   中英

審核/記錄所有傳入的Web請求到@RequestMapping注釋方法

[英]Audit/Log all incoming web requests to @RequestMapping annotated methods

資源

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping

我有@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;
 }
}

我在想像這樣的事情會起作用。

關於此的任何建議,如果使用“偵聽器”或其他一些攔截器更容易,則將很有幫助

使用攔截器,您可以完全訪問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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM