【问题标题】:Getting domain variables on layout在布局上获取域变量
【发布时间】:2012-01-21 23:19:11
【问题描述】:

在 Grails 中将模型变量传递给布局的最佳方式是什么?具体来说,我正在使用具有 User 类的 Spring 安全插件。我也有看起来像这样的联系人类:

class Contact {

    String realname
    String company
    String mobile
    String fix
    String email
    User user
        ...

有哪些选项可以在我的布局 (main.gsp) 中获取当前登录的人的公司?

【问题讨论】:

    标签: layout grails


    【解决方案1】:

    要添加到上述答案,您也可以在登录时为用户设置一个会话变量,调用任何控制器方法。

    您也可以在控制器方法中为公司设置一个会话变量:

    session.company = Contact.findByUser(session.user)?.company
    

    或者来自上面的例子

       session.company = Contact.findByUser(SecurityContextHolder.context.authentication?.principal)?.company
    

    在你的 main.gsp 中,类似:

    <span id="companyName">${session.company}</span>
    

    【讨论】:

    • 在这种情况下,您应该实现自己的 authSuccesshandler 和 logoutHandler,并将(并在注销时删除)该变量放入会话中,而不是控制器
    【解决方案2】:

    你的意思是你需要为每个页面自动传递这个模型,而不是在每个控制器的渲染时手动传递它?你可以在那里使用filters

    def filters = {
        all(controller: '*', action: '*') {
            before = {
                request.setAttribute('loggedInPerson', SecurityContextHolder.context.authentication?.principal)
                //Notice, that there is used original Authentication, from Spring Security
                //If you need you can load your Contact object there, or something
            }
            after = {
    
            }
            afterView = {
    
            }
        }
    }
    

    并在您的 gsp 中使用 loggedInPerson

    Hello ${loggedInPerson.username}!
    

    顺便说一句,还有Spring Security tags,可以在不使用您自己的过滤器的情况下为您提供帮助,例如:

    Hello <sec:loggedInUserInfo field="username"/>!
    

    【讨论】:

      【解决方案3】:

      如果要在模型中添加某个对象,也可以使用grails提供的“拦截器”。要将某个变量添加到特定控制器,您可以使用类似这样的方法。

      def afterInterceptor = {model, modelAndView->
      
          model.loggedInUser = getLoggedInUser()  // retrieve your user details here
      
      }
      

      您可以在 main.gsp 布局中检索 loggedInUser${loggedInUser}

      如果您需要在多个控制器中获取这些详细信息,您可以创建一个BaseController 并将afterInterceptor 保留在此BaseController 中。所有需要在其相应视图中引用登录用户的控制器都应扩展BaseController

      【讨论】:

        猜你喜欢
        • 2011-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-18
        • 2015-12-09
        • 1970-01-01
        相关资源
        最近更新 更多