我想在用户点击退出按钮时将用户重定向到开始视图。注销正确完成,在请求开始视图后,将向用户显示登录页面。到目前为止这么好,它是我想要的,因为开始视图受到保护,我拦截了一个重定向到登录页面的阶段监听器。
退出操作:
public String logout() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
// invalidate session
Object session = externalContext.getSession(false);
HttpSession httpSession = (HttpSession) session;
httpSession.invalidate();
// let the navigation rule decide where to go...
return null;
}
面对导航规则:
<navigation-rule>
<navigation-case>
<from-action>#{loginBean.logout}</from-action>
<to-view-id>/faces/index.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
ForceLoginListener:
@Override
public void beforePhase(PhaseEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
// extract view id from original request
String viewId = context.getViewRoot().getViewId();
if (// viewId is an 'protected' view AND not logged in //) {
Application app = context.getApplication();
// redirect to the login view
ViewHandler viewHandler = app.getViewHandler();
UIViewRoot viewRoot = viewHandler.createView(context, Constants.LOGIN_VIEW);
context.setViewRoot(viewRoot);
}
}
@Override
public void afterPhase(PhaseEvent event) {
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
我现在遇到的问题是,用户可见的URL不是开始视图,也不是登录视图,它是在用户按下注销按钮之前激活的视图。
我认为导航规则中的重定向应该像我所有其他导航案例一样,但在这种情况下它不起作用。有人知道为什么吗?
提前致谢。
答案 0 :(得分:1)
您的奇怪ForceLoginListener
方法需要替换为普通servlet filter。
答案 1 :(得分:0)
我真的不明白你的情况究竟发生了什么,但你可以使用externalContext
改变你的退出行动以重定向,并用导航规则消除所有的烦恼:
public void logout() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
// invalidate session
Object session = externalContext.getSession(false);
HttpSession httpSession = (HttpSession) session;
httpSession.invalidate();
// redirect to your login view:
externalContext.redirect(Constants.LOGIN_VIEW);
}