favicon.ico 在 Firefox 上获取 JSON 时被 CSP 阻止

favicon.ico blocked by CSP when fetching JSON on Firefox

我构建了一个简单的 Spring Boot Rest 控制器,它除了 return 自定义 Java Object - 数据外什么都不做。一切正常编译和运行。当我从端点获取数据时,我得到了预期的数据。

然而,当在 Firefox 上使用“Inspect Element”查看引擎盖时,我看到了由于 Content Security Policy (CSP) 导致的错误。 Content-Security-Policy 错误说明如下:

“内容安全策略:该页面的设置阻止了在 http://localhost:8081/favicon.ico(“default-src”)加载资源。”。 =54=]

我尝试了一些解决方案,但都无济于事。

  • 我尝试通过application.properties禁用图标,但似乎没有任何效果。
  • 我创建了一个名为“favicon.ico”的图标并将其放置在适当的目录中。令人恼火的是,这个页面仍然报错,同时我的所有其他页面都开始出现图标。
  • 我尝试了 许多 header 的排列,包括将 Content-Security-Policy header 设置为是默认的 src 自我。 None 有效,尽管这可能是问题的根源,因为似乎有很多我没有完全掌握的活动部分。
  • 我试图为“/favicon.ico”创建一个 GET 端点,但这似乎根本没有完成任何事情。
    • 此时我已将图标添加到我的目录中,所以当我尝试访问端点时,它只是向我发送了我的图标图像,该图标也显示在我的顶部的选项卡中浏览器,日志中没有错误。
  • 我试图弄乱 WebSecurityConfigurerAdapter,但很快就失控了,坦率地说,其中很多都没有意义。

这是我的文件。

应用程序属性 = application.properties

spring.mvc.favicon.enabled=false

主文件 - DemoApplication

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

   public static void main(String[] args) {
      System.getProperties().put( "server.port", 8081);
      SpringApplication.run(DemoApplication.class, args);
   }

}

休息控制器=数据控制器

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DataController
{

   @GetMapping("/data")
   public Data data()
   {
   
      return new Data(123, "abc");
   
   }
  
}

返回类型 = 数据

public class Data
{

    private final long id;
    private final String data;

    public Data(long id, String data) { this.data = data; }

    public long getId() { return this.id; }
    public String getData() { return this.data; }

}

经过一些调试,我发现问题似乎是 Firefox 特定的,并且 仅适用于 return 的端点一个 JSON 对象.

例如,如果我构建了一个仅 returned 字符串的端点,Firefox 将 return 该字符串并且图标将位于顶部的选项卡中。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DataController
{

   @GetMapping("/data")
   public Data data()
   {
   
      return new Data(123, "abc");
   
   }
  
   @GetMapping("/abc123")
   public String abc123()
   {
   
      return "abc123";
   
   }
   
}

我 运行 的示例比这更多,但这演示了 String 作为响应类型如何在 Firefox 上不抛出错误,但 JSON 作为响应类型抛出错误。

在其他浏览器上尝试这两个端点时,JSON 或字符串似乎都没有错误。

然后我意识到 - 与其他浏览器不同,Firefox 有一个内置的 JSON Viewer。也就是说,如果整个页面 接收的数据纯粹是 JSON,那么 Firefox 将以完全不同的方式呈现页面。 Firefox 不会只是将普通的 JSON 字符串输出到页面上,而是会使用一些花哨的 UI 来组织 JSON 以便于 reading/parsing.

所以,作为最终测试,我 ,然后重新加载页面——一切都按预期进行。

我还要补充 - 我真的不认为这是 Firefox 的错误 -- @g运行ty 指出 Mozilla themselves are looking into this.这仅发生在 整个响应为 JSON.

的端点

如果从大局来看,return 纯粹 JSON 的端点实际上只是数据流,普通用户不会使用。那么你真的需要包含一个图标吗?大声笑,可能不是。

您可以将 jquery.unobtrusive-ajax.js 文件添加到解决方案中。