【问题标题】:How to prevent direct access to *.gsp pages in Grails如何防止直接访问 Grails 中的 *.gsp 页面
【发布时间】:2023-03-09 00:26:01
【问题描述】:

谁能建议一个可行的解决方案来防止直接访问 Grails 上的 *.gsp 页面?

查看拦截'/**.gsp'后,我发现无法使用它,因为它不仅会过滤掉直接访问,还会过滤掉来自控制器的页面渲染等。

我尝试在 UrlMapping.groovy 中设置以下内容,即使我可以阻止 *.gsp 直接访问,但我也弄乱了页面的导航;然后所有链接似乎都转到主页。

    "/**.gsp" {
isEligible = {
    System.err.println("ALL PARAMS: " + params)
   request.requestURL.toString().endsWith(".gsp")
}
controller = {
    if (request.requestURL.toString().endsWith(".gsp")) {
        "public"
    } else {
        "*"
    }
}
action = {
    if (request.requestURL.toString().endsWith(".gsp")) {
        "home"
    } else {
        "*"
    }
}
}

曾经我想过像 org.springframework.web.filter.OncePerRequestFilter 这样的设置过滤器,但不太确定如何定义它,可能因为 Grails 倾向于自行生成 web.xml 过滤器部分。

有什么想法吗?

非常感谢! 汤姆

【问题讨论】:

  • 只是想一想,您是否进行了测试以确认您可以在测试和生产环境中直接访问它?我感觉 Grails 可能仅在您的环境设置为开发时才允许直接访问。
  • 非常有趣的问题。我从来没有注意到它,但即使在生产中也会发生在我身上。虽然页面会非常喜欢返回错误,因为它没有来自控制器的信息。
  • 我刚刚在生产模式下运行完,同样的问题;无论如何,谢谢你的提示!我只是想知道如何在我的示例代码中设置某些代理项以防止匹配那些非直接访问;你看,我试过'isEligible',但它不起作用。

标签: grails gsp url-mapping


【解决方案1】:

很遗憾,我没有找到使用 UrlMappings 的解决方案。 这是一个有点难看的解决方案,但如果您在所有页面上使用相同的布局(例如 main.gsp),您可以将此行添加到布局(main.gsp)中。

    <%  if (request.requestURL.toString().endsWith(".gsp")) {
       response.sendRedirect("${request.contextPath}/")
    } %>

这样,如果用户尝试直接访问 gsp 页面,他会被重定向到主页。

也许不是最好的解决方案,但到目前为止确实对我有用。

干杯,狡猾

【讨论】:

  • 行得通!感谢您的帮助 :) 但是,如果对于不引用模板 main.gsp 的页面,他们仍然有同样的问题。也许我应该花点时间阅读 Grails 中的 url 映射机制。还是谢谢!
  • 我刚刚用 app-engine 插件测试了这个,它给了我一个重定向循环异常。 :(
【解决方案2】:

将这些添加到 UrlMappings:

"/**.gsp" {
    controller = {
        if(request.requestURL.toString().endsWith(".gsp")) {
            "forbidden"
        } else params.controller
    }
}

并创建一个 ForbiddenController 和一个 index.gsp 并带有“永远不要考虑直接访问 GSP,老兄”。作为它的内容。

干杯。

【讨论】:

    【解决方案3】:

    根据 grails FAQ,UrlMapping.groovy 中的“/**.gsp”配置应该可以工作。

    还不能试一下。

    您是如何将链接添加到页面的? 使用链接标签时链接是否也会断开?

    <g:link controller="book" action="list">Book List</g:link>
    

    【讨论】:

    • 对不起,我不确定我是否理解你的问题...如果直接设置'/**.gsp'过滤并路由到'index'视图,页面甚至无法打开作为指导“索引”视图的死循环。
    • 实际上,我认为问题在于我们如何停止通过链接直接访问,例如http://MyApp/book/list.gsp
    • 也许我的问题不够清楚:P 但我现在尝试了 UrlMapping.groovy 中的“/**.gsp”,但它不能正常工作。仍在寻找解决方案....
    【解决方案4】:

    编写一个将在每个请求上执行的过滤器怎么样?

    【讨论】:

    • 我也会试试这个,因为在模板上使用技巧不能完全解决问题;
    • 我找不到使用过滤器的解决方案:while definte filter as excludeDirectAccess(uri: '/**') { ... request.requestURL.toString().endsWith(".gsp ")...} 我发现表达式不可能是真的; request.requestURL 只是一个奇怪的 url,它不是地址栏上的输入。这太烦人了... :(
    • 我稍后会尝试,我会告诉你结果。
    • 谢谢!我发现 request.forwardURI 也不起作用。它只是返回类似'.../xxx.js'的东西,表明浏览器正在尝试请求javascript资源;但是,我没有看到与原始直接访问 URL 等相关的任何内容。然后,我还打印出了所有 request.attributes 内容,也没有直接访问 URL。 :(
    猜你喜欢
    • 2010-11-05
    • 2010-09-16
    • 1970-01-01
    • 2012-05-22
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    相关资源
    最近更新 更多