java - Spring中如何判断请求是否是静态资源?

标签 java spring httprequest

我正在编写一个记录器来记录 Spring 中的每个请求,但我不想记录任何静态资源,例如 CSS、JS、图像或任何类似的资源。

我想过只检查扩展名,但在某些情况下静态内容文件没有扩展名,我不想记录它们。我还可以检查 header ,但我希望记录器尽可能快,并且我必须进行某种字符串比较或解析,我希望尽可能避免这种情况,因为此(以及 future )应用程序将处理大量请求。

我基本上希望记录任何非静态资源请求的内容,因为我可能希望在 Web 服务和前端应用程序中使用相同的记录器。

那么有没有办法判断请求是否是针对静态资源的?我知道 Spring 特别需要映射到资源处理程序。有什么方法可以知道资源处理程序是否已以某种方式处理请求?

最佳答案

所以我能够使用 Spring 的 MediaType.parseMediaTypes(String)

以相当干净的方式解决这个问题

我能够通过检查请求 header 中的“accept”字段来假定请求类型。我确定了哪些 MediaType 是可接受的,然后将它们放入 HashSet 中,例如

mediaTypeSet.add(MediaType.TEXT_HTML)

然后我只是迭代了 parseMediaType 的结果来确定它是否是我想要记录的请求。

boolean shouldLog(HttpServletRequest request){
  String acceptHeader = request.getHeader("accept");
  if(acceptHeader != null){
     List<MediaType> mediaTypes = MediaType.parseMediaTypes(acceptHeader);
     for(MediaType mediaType : mediaTypes){
        if(mediaTypeSet.contains(mediaType)) return true;
     }
  }
  return false;
}

有时,接受 header 会读取 */*,因此它会期待任何内容,但就我而言,我感兴趣的请求都已定义 MIME 类型。

关于java - Spring中如何判断请求是否是静态资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49661730/

相关文章:

Java Swing GridBagLayout

java - 设计模式 : Factory that creates one object

java - Android Volley 忽略参数无法连接

java - spring 3.0 包含哪些 maven 依赖项?

spring - 如何在 Spring Boot Activity 中设置 Business Key

ios - 在 Swift 中创建一个发出 HTTPRequest 的类

php - http post请求帮助

java - 如何在没有 Gradle 的情况下将 Gradle 项目转换为离线编译

java - 为什么我的添加方法会覆盖 Vector?

java - Spring WebSocket 从服务器发送多个对值消息