这种情况是,我有一个布局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/