我正在编写一个记录器来记录 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/