我的问题与here类似,但与PrimeFaces没有任何关系。另外,我也找不到一个真正的解决方案。
我基本上是在尝试让phaselistener重定向到登录页面,以防没有JSF会话(例如,当会话超时时)。
我正在尝试从JSF2 Phaselistener中进行重定向。总而言之,我正在做的是:
public void beforePhase(PhaseEvent event) {
PhaseId id = event.getPhaseId();
if(id.equals(PhaseId.RESTORE_VIEW)){
FacesContext context = event.getFacesContext();
Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
if(sessionMap==null || sessionMap.isEmpty()){
// No Session, Redirect to login
try {
context.getExternalContext().redirect("/login");
} catch (Exception e) {
...
}
}
}
}当重定向代码运行时,我得到了这个异常:
java.lang.NullPointerException
at org.apache.myfaces.context.servlet.PartialViewContextImpl.getPartialResponseWriter(PartialViewContextImpl.java:301)
at org.apache.myfaces.context.servlet.ServletExternalContextImpl.redirect(ServletExternalContextImpl.java:452)
at com.AuthenticationPhaseListener.userIsNotLogedIn这可能是什么原因造成的?我做错了吗?
谢谢!
发布于 2011-12-20 19:28:03
这似乎是在ajax请求期间发生的。我不确定确切的原因,堆栈跟踪至少表明MyFaces实现中可能存在错误。
至少,总体设计方法很差。这种类型的超文本传输协议请求/响应修改最好不发生在PhaseListener中。在那里,它并不是为了。你想在一个普通的servlet Filter中做这类工作。
发布于 2012-03-13 23:47:16
嗯,我和你有同样的问题,但我没有像你那样用doing.My steps这样复杂的方法解决问题
1) create a class that implements the PhaseListener
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
/**
*
* @author fakumawah @date 09.03.2012
*/
public class LoggedInCheck extends BackingBean implements PhaseListener
{
@Override`enter code here`
public PhaseId getPhaseId()
{
return PhaseId.ANY_PHASE;
}
@Override
public void beforePhase(PhaseEvent event)
{
}
@Override
public void afterPhase(PhaseEvent event)
{
FacesContext fc = event.getFacesContext();
boolean loginPage = fc.getViewRoot().getViewId().lastIndexOf("login") > -1 ? true : false;
if (!loginPage && !loggedIn())
{
NavigationHandler nh = fc.getApplication().getNavigationHandler();
nh.handleNavigation(fc, null, "gotologin");
}
}
private boolean loggedIn()
{
return getSessionWrapper().isLoggedInAgain();
}
}对于未注释的代码,我很抱歉,但我想代码真的很容易理解。最需要注意的是afterPhase(..)它检查我是否已经登录,或者我是否已经有会话。如果没有,它会创建一个导航器并将我导航到登录页面。
2)您的isLoggedInAgain()应该如下所示:
/**
* A method to check if Username is already logged in
* @param username
* @return
*/
public boolean isLoggedInAgain()
{
if (session != null) // Check if session is not null
{
if (session.isConnected()) // Check if session is connected
{
return true;
//destroyIfsLibrarySession(); // Session is available -> destroy session
}
else // session is not available
{
logger.log(Level.SEVERE, "Already logged out");
return false;
}
}
return false;
}由于我处理的是来自Oracle CMSDK的LibrarySessions,这就是为什么我的会话测试是这样的。最重要的是以某种方式检查您的会话,并根据会话是否存在给出真或假。
3)在faces-config.xml中配置监听器
<!-- Phase-Listener to check if user is logged in or not -->
<lifecycle>
<phase-listener>com.mycompany.mypackagename.webapp.LoggedInCheck</phase-listener>
</lifecycle>4)最后为"gotologin“定义导航规则
<!-- Navigation Rule for sending user to login page from an expired session -->
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>gotologin</from-outcome>
<to-view-id>/login.em</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>就是这样,只要您在任何页面上都没有会话,并且不在登录页面上,您就会被带到登录页面。
尽情享受
https://stackoverflow.com/questions/8572700
复制相似问题