有没有办法从 gsp 页面(或类型库)中止 html 页面生成并回调控制器方法来输出 403 标头?
我们有一组用于管理页面的脚手架页面,并对其进行了修改以测试访问该页面的用户是否具有管理员权限。如果没有,我们会生成一个 html 页面,指示"不是管理员消息"(而不是页面的正常脚手架代码,即 edit.gsp)。 这里的问题是 http 响应是 200,我真的希望响应状态代码为 403。
与域对象关联的控制器是空的,除了启用脚手架,我们已经生成了脚手架页面(通过 grails 生成视图 cmd),我们还修改了这些页面以测试用户是否是管理员。
所以我的问题归结为一次在 gsp 页面中我们如何中止并调用另一个控制器来生成 403 错误标头?有没有办法我们可以从 gsp 页面执行此操作,或者我们必须定义与视图页面名称匹配的控制器方法,并在控制器方法中测试用户是否是管理员,然后发出 403 错误?
希望有一种方法来中止当前 gsp 页面的生成,并能够调用不同的控制器来生成 403 标头。
我相信你最好的方法是使用拦截器或过滤器。 我打算提供一个例子,但这里已经有非常好的例子: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 或您需要执行的任何操作。