如何防止直接访问Grails中的* .gsp页面

时间:2011-03-06 23:28:02

标签: grails gsp url-mapping

有人可以建议一个可行的解决方案来阻止直接访问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过滤器部分。

有什么想法?

非常感谢! 汤姆

4 个答案:

答案 0 :(得分:1)

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

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

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

可能不是最好的解决方案,但到目前为止对我有用。

欢呼狡猾

答案 1 :(得分:1)

将这些添加到UrlMappings:

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

创建一个ForbiddenController和一个index.gsp,“永远不要想到直接访问GSP。”作为其内容。

干杯。

答案 2 :(得分:0)

根据grails FAQ,UrlMapping.groovy中的“/** .gsp”配置应该有效。

还没试过。

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

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

答案 3 :(得分:0)

如何编写将在每个请求上执行的过滤器?