【问题标题】:Grails 2.5.6 createLink does not take into account whether the application is on HTTPS server or not?Grails 2.5.6 createLink 不考虑应用程序是否在 HTTPS 服务器上?
【发布时间】:2018-06-24 09:56:57
【问题描述】:

我有以 3 种不同方式访问的应用程序 1.客户的内部IP,只能从他的机器访问, 2.客户端的外部IP,只能在我们的VPN服务器上使用。 3. 客户的安全域名,也只能访问他的内网。

问题是从 HTTPS URL 访问的网站没有生成从 https 开始的正确链接,而是生成从 http 开始的链接。

因此,AJAX 调用失败,因为 Web 安全限制阻止了来自 https 服务器的 http 调用。

IP 地址现在可以正常工作。 我尝试使用 grails.severURL 明确提及它适用于 https url 的 https url,但这会破坏 IP 地址上的网站功能。

【问题讨论】:

    标签: grails


    【解决方案1】:

    createLink 的绝对 URL 基于您在应用程序的 Config.groovy 文件中指定的设置 grails.serverURL。

    https://grails.github.io/grails2-doc/2.5.6/ref/Tags/createLink.html

    上面写着:

    absolute(可选)- 如果为 true,则链接目标地址的前缀为 来自 Config.groovy 的 grails.serverURL 属性的值,或者 http://localhost: 如果 Config.groovy 中没有设置和 未在生产中运行。

    然后,如果您不想使用 grails.serverURL,则必须更改 gsp 中的代码。 您应该使用 createLink 生成相对路径,例如:

    // generates "/shop/book/list"
    <g:createLink controller="book" action="list" />
    

    如果继续生成绝对url,则添加参数absolue='false'

    然后您可以将这种 url 传递给您的 ajax 调用,如果您使用 jquery 进行调用,它应该可以工作。

    但是,如果您想在代码中使用绝对 url,那么您应该将 createLink 中的相对路径与另一个技巧结合起来:

    <g:set var="url" value="${request.requestURL}" />
    <g:set var="uri" value="${request.requestURI}" />
    <g:set var="yourUrlForAjaxCall">${url.substring(0, url.length() - uri.length())}${request.contextPath}${createLink(action: 'list', controller: 'book')}</g:set>
    

    然后变量 yourUrlForAjaxCall 给出了你所需要的。

    我的回答基于 BalusC 的回答 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      相关资源
      最近更新 更多