【发布时间】:2023-04-03 11:26:01
【问题描述】:
我的 facelets 有问题:
我限制了一个导航部分,该部分显示有关当前用户的登录信息和一个注销按钮。登录工作正常。但是在用户注销后,我的页面的导航部分会显示
Welcome, User (role) [Logout_Button]
然而,我想要的是与您第一次登录时发生的相同的事情:
Welcome, Guest
(感谢 Java 爱好者的这些简单的话 :-))
您可以在这里看到我的部分模板:
<div id="metaContainer">
<ui:include src="/metaMenu.xhtml" />
</div>
这是带有登录信息的导航部分(称为 metaMenu.xhtml):
<ui:composition xmlns="http://www.w3.org/1999/xhtml" lang="en"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<div id="login_info">
<h:outputLabel value="Willkommen, "/>
<h:outputLabel class="principal" value="#{metaNavData.principal}"/>
<h:outputLabel value="#{metaNavData.role}"/>
</div>
<div id="meta_nav">
<h:form name="loginform" rendered="#{authorisation.authenticated}">
<h:commandLink action="#{loginController.logout}" rendered="#{authorisation.authenticated}">
Logout</h:commandLink>
</h:form>
</div>
</ui:composition>
正如 BalusC 和 Java Drinker 认为的那样,这可能是一个 Java 逻辑问题。我首先要说的是,我使用 Apache Shiro 来解决安全问题。所以这里是相关的Java代码:
我的 loginController 包含注销方法:
@ManagedBean
@SessionScoped //Mistake!!! That should be RequestScoped, see below
public class LoginController {
private Subject currentUser; // import org.apache.shiro.subject.*;
public LoginController() {
currentUser = SecurityUtils.getSubject();
}
public String logout() {
if (currentUser.isAuthenticated()) {
currentUser.logout();
}
return "welcome.xhtml";
}
你可以看到我支持的 bean 'authorisation',它应该提供可用于隐藏登录按钮等组件的信息:
@ManagedBean
@RequestScoped
public class Authorisation {
private Subject currentUser;
public Authorisation(){
currentUser = SecurityUtils.getSubject();
}
public boolean getAuthenticated(){
return currentUser.isAuthenticated();
}
【问题讨论】:
-
我不确定我是否理解。您是说
... 部分在用户注销后不会呈现吗? -
对不起,我真的不明白这个问题。我认为您使用的“渲染”一词有歧义。您不是在代码示例的 login_info div 中的任何地方有条件地呈现,但您在问题描述中是这样说的。我认为您实际上是指您所说的“渲染”的“显示值”或“返回值”。这又不是渲染问题,而是模型/代码逻辑问题。
-
很抱歉造成混淆。我的技术术语有时不是正确的。但我会改进的!感谢阅读和您的帮助