【问题标题】:Spring MVC : X-Content-Type-Options problems, javascript not loadingSpring MVC:X-Content-Type-Options 问题,javascript 未加载
【发布时间】:2017-04-04 21:22:47
【问题描述】:

我在 2-3 天后遇到了问题。我的 javascript 文件不再加载,并且出现“X-Content-Type-Options=nosniff”错误。 (我什至没有尝试使用此标头,它可能会自动添加)

我没有特别编辑任何内容,所以我不明白为什么会突然出现。 我在网上搜索过,但没有找到有同样问题的人。

包含 javascript 文件的代码如下所示:

<script type="text/javascript" src="<c:url value="/lang/${js}_${pageContext.response.locale}.js"/>"></script>

如您所见,文件是动态加载的。 我真的不知道我应该给你什么细节,请随时询问。

我应该在春天做些什么来纠正这个问题?

提前致谢。 :)

编辑: 这是我从 app_fr.js 获得的响应标头:

HTTP/1.1 200 
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: text/html;charset=UTF-8
Content-Language: fr
Content-Length: 635
Date: Mon, 21 Nov 2016 18:13:07 GMT

还有请求头:

GET /lang/app_fr.js HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: */*
Accept-Language: fr,fr-FR;q=0.8,en;q=0.5,en-US;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://localhost:8080/
Cookie: Idea-afded334=6b807a5c-0afc-4400-a66c-2606b8247f4a; JSESSIONID=904C45361C1C62C6071576E49CAE8E8F
Connection: keep-alive

【问题讨论】:

  • 我认为 Julien G. 收到此错误是因为响应标头中有“X-Content-Type-Options=nosniff”,所以这无济于事
  • 是的,我有 X-Content-Type-Options=nosniff,但这不应该是新的,因为我从未在 tomcat 中编辑过 conf 文件。
  • 你改变了 c:url 的值吗?
  • 不,我没有,为什么? (${js}=app and ${pageContext.response.locale}=en(or other)) 所以 c:url 看起来像:

标签: java spring spring-mvc


【解决方案1】:

好吧!感谢 Vasilis Vasilatos,我找到了问题所在。

在我的主 jsp 文件(名为 app.jsp)中,我正在导入一个动态生成的 javascript 文件(动态名称类似于:[page]_[locale].js,动态名称用于缓存系统)像这样:

<script type="text/javascript" src="<c:url value="/lang/${js}_${pageContext.response.locale}.js"/>"></script>

在我的 java 代码中,当调用 /lang/...js 时,控制器正在生成本地化值:

@RequestMapping(value="/lang/{param}")
    public ModelAndView localization(@PathVariable String param) {
        //generate your list from param
        return new ModelAndView("localization", "keys", list);
    }

控制器最终调用了如下所示的本地化.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

var Locale = [];
<c:forEach var="key" items="${keys}">
Locale["<spring:message text='${key}' javaScriptEscape='true'/>"] = "<spring:message code='${key}' javaScriptEscape='true' />";
</c:forEach>

如您所见,第一行包含错误的内容:text/html 而不是 application/javascript。替换它,它会正常工作:)

PS:我仍然不知道为什么会突然发生这种情况。我的本地化系统已经运行了 3 个多月...

【讨论】:

    【解决方案2】:

    尝试删除 type="text/javascript" 或替换为 type="application/javascript"

    【讨论】:

    • 试图用应用程序/javascript 替换并删除,仍然无法正常工作:/ 我编辑了我的帖子以添加请求标头和响应标头
    • 正如我在响应标头中看到的,您会得到 Content-Type: text/html;charset=UTF-8。这应该是“应用程序/javascript”或“文本/javascript”
    • 尝试在你的 web.xml 中添加这个: jstext/javascript
    • 这可能确实是问题,因为其他js文件加载了Content-Type:application/javascript。但是当我在我的 tomcat conf web.xml 中添加 mime 映射时,它仍然是 text/html。
    • 谢谢Vasilis Vasilatos,问题现在已经解决了:)我发布了一个确切问题的答案:)
    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2016-02-26
    • 2018-05-21
    相关资源
    最近更新 更多