grails - Grails在运行时更新/渲染布局

标签 grails layout spring-security

这种情况是,我有一个布局application.gsp,它定义了除登录页面以外的所有页面的布局。在布局内是一个标题,应显示当前登录用户的名称(Spring Security插件)。问题是,如果用户是首次注册或使用oAuth(与注册相同),则在他登录时将看到空位而不是用​​户名,因为布局是在之前呈现为的,因此用户名可用。如果他注销/再次登录,他当然会看到他的用户名。

附言不能将标题移到布局之外,因为它将导致大量的代码重复。

有没有解决的办法?

最佳答案

对于尝试解决相同问题的后代,我将回答我自己的问题。
诀窍是使用装饰器设计模式和记录不良的 g:pageProperty gsp标签。

View /布局/application.gsp:

....
<li class="dropdown menu">
                        <a href="#" class="dropdown-toggle"
                           data-toggle="dropdown"><g:pageProperty name="page.username"/></a>
                        <ul class="dropdown-menu">
                            <li>Preferences</li>
                            <li>
                                <a href="${resource(file: 'j_spring_security_logout')}"
                                   class="navbar-btn btn-danger btn">Logout</a></li>
                        </ul>
                    </li>
....

views / index.gsp:
....
<body>
    <content tag="username">
        <g:username username="${username}"/>
    </content>
....

taglib / UsernameTagLib.groovy:
class UsernameTagLib {
def springSecurityService

/**
 * Check if the username is already available, else inject newly created username into the layout
 *
 * @attr username REQUIRED that was received from the newly registered user
 */
def username = { attrs ->
    String currentUsername = springSecurityService.getCurrentUser()?.username
    if (currentUsername) {
        out << currentUsername
    } else {
        out << attrs.username
    }
  }
}

当用户完成整个oAuth流程后,新创建的用户名将传递给views / index.gsp。

Controller /OauthCallBackController.groovy
....
    def facebook() {
        Token facebookAccessToken = (Token) session[oauthService.findSessionKeyForAccessToken('facebook')]
        if (facebookAccessToken) {
            String username = oauthCallBackService.facebook(facebookAccessToken)
            render view: '/index', model: [username: username]
        } else failure()
    }
....

基本上,用户名会向上移动,直到到达布局为止,这使我可以在布局标题中使用该用户名,并在需要布局的所有页面上推广该用户名。

关于grails - Grails在运行时更新/渲染布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20622805/

相关文章:

grails - 如何在Grails gsp列表中显示结果

grails - 对Grails中的Elastic Search结果调用findBy…时发生TransientObjectException

tomcat - 如何将日志从 grails 应用程序发送到单独的文件

swift - Xcode 的布局问题

java - 使用用户 XML 配置的 Spring security 不起作用

Grails 错误 : No thread-bound request found: Are you referring to request attributes. .. 安装 Spring Security Core 后

grails - 在文本中,如果出现 "&"字,那么它不允许我在 grails 中下载

html - 在正确区域放置 div 的问题

android - 我怎样才能让 View 不扩展到它的兄弟 View

java - 如何保护 REST API 中的输入 JSON 对象?