spring中如何解析http接受标头?

ams*_*ams 2 java spring spring-mvc

我想在 Spring 中解析 HTTP 接受标头以确定是否可以发回 JSON。我正在尝试使用以下代码。

class MediaTypeUtil {
  private final static Logger logger = LoggerFactory.getLogger(MediaTypeUtil.class);
  static boolean acceptsJson(HttpServletRequest request) {
    try {
      String accept = request.getHeader("Accept");
      MediaType requestType = MediaType.valueOf(accept);
      return MediaType.APPLICATION_JSON.isCompatibleWith(requestType);
    } catch (InvalidMediaTypeException e) {
      logger.debug("MediaType parsing error",e);
      return false;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当请求到达时接受标头值为application/json, application/javascript, text/javascript, text/json我最终会出现异常

Caused by: org.springframework.util.InvalidMimeTypeException: Invalid mime type "application/json, application/javascript, text/javascript, text/json": Invalid token character ',' in token "json, application/javascript, text/javascript, text/json"
    at org.springframework.util.MimeTypeUtils.parseMimeTypeInternal(MimeTypeUtils.java:262)
Run Code Online (Sandbox Code Playgroud)

这段代码是从 Servlet 过滤器中使用的,所以我不能依赖 SpringMVC 注释。

Spring是否有解析接受标头并确定它是否与特定媒体类型兼容的方法?

mar*_*rco 6

Spring 本身在内部的做法与您完全一样(即从请求中获取 ACCEPT 标头),但它们将其提供给此调用:

MediaType.parseMediaTypes(get(ACCEPT));
Run Code Online (Sandbox Code Playgroud)

这将返回您List<MediaType>需要使用的一个。