【问题标题】:Grails gsp: Is there a way to abort once your render a gsp page?Grails gsp:有没有办法在你渲染一个 gsp 页面后中止?
【发布时间】:2018-04-18 21:20:24
【问题描述】:

有没有办法从 gsp 页面(或类型库)中止 html 页面生成并回调控制器方法以输出 403 标头?

我们有一组用于管理页面的脚手架页面,并对其进行了修改以测试访问该页面的用户是否具有管理员权限。如果不是,我们会生成一个指示“不是管理员消息”的 html 页面(而不是页面的正常脚手架代码,即 edit.gsp)。这里的问题是http响应是200,我真的希望响应状态码是403。

与域对象关联的控制器是空的,除了启用脚手架,我们已经生成了脚手架页面(通过 grails generate-view cmd),我们还修改了这些页面以测试用户是否是管理员。

所以我的问题归结为 gsp 页面中的一次,我们如何中止并调用另一个控制器来生成 403 错误标头?有没有办法我们可以从 gsp 页面执行此操作,或者我们是否必须定义与视图页面名称匹配的控制器方法,并在控制器方法中测试用户是否是管理员,然后发出 403 错误?

希望有一种方法可以中止当前 gsp 页面的生成,并能够调用不同的控制器来生成 403 标头。

【问题讨论】:

  • 为什么不在控制器操作中测试而不是在渲染 gsp 时进行测试?这样你就可以更好地处理这种情况了。
  • 我同意,我继承的代码有一个域对象的控制器,但没有方法。控制器只是将脚手架设置为域类的名称和一组生成的 CRUD 视图。我不知道是否可以在控制器中添加和更新方法(例如)并让它呈现更新视图。这对我们来说将是很多工作(我们有超过 100 个域对象)。希望 gsp 指令或一种可以通过类型库调用实现的方式。
  • 根据您的 grails 版本,您可以创建一个 beforeInterceptor 闭包或类(我认为是 3.0.9 和更早版本的闭包?以后的类),它将在它匹配的每个操作之前运行。如果您让我们知道您使用的是哪个版本的 Grails,我相信我或其他人可以帮助向您展示如何做到这一点。
  • 谢谢。我们正在使用 grails 2.4.0(我知道希望我们可以更新)。

标签: grails error-handling http-status-code-403 gsp


【解决方案1】:

我相信您最好的方法是使用拦截器或过滤器。我打算提供一个例子,但这里已经有很好的例子了:https://grails.github.io/grails2-doc/2.4.4/guide/theWebLayer.html#interceptors 和 https://grails.github.io/grails2-doc/2.4.4/guide/single.html#filters

基本上,任何一个都是将在控制器操作执行之前(或之后,但在您的情况下:之前)执行的代码。您可以访问参数、会话等,因此您可以执行诸如“此人是否是管理员”之类的逻辑。您还可以修改响应,因此您可以重定向到“权限被拒绝”页面或将状态设置为 403 或您需要执行的任何操作。

【讨论】:

  • 谢谢...我认为我们将拥有不止一个控制器,因此,过滤器将是一种更好的方法。我们还必须编写一些“后”过滤器来生成一些额外的响应头内容。所以我相信这将是正确的方法。
  • 仅供参考,当您升级时,或在这种情况下的其他任何人:在 Grails 3 中,同样的事情可以通过拦截器完成:docs.grails.org/3.3.4/guide/theWebLayer.html#interceptors
  • 丹尼尔,只是一个后续问题。我能够轻松地创建过滤器并能够添加额外的标题(我们遇到的另一个问题)。我从过滤器对象中看到,我可以访问请求、响应、参数、flash 和其他一些对象。我担心的是,当 GSP 页面确定对页面的未经授权访问时,GSP 如何标记该页面,以便过滤器可以快速检测到该页面并将状态代码更改为 403。GSP 页面已使用状态码为 200,我们正在使用过滤器(之后)将状态码更改为“403”。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2019-07-06
相关资源
最近更新 更多