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
文件添加到解决方案中。
我构建了一个简单的 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
文件添加到解决方案中。