我正在使用 Apache Shiro。我想在会话过期后将我的用户重定向到“登录”页面。
我尝试了以下代码,但重定向不起作用。 我有一个 NPE:
<块引用>验证会话时出错:java.lang.NullPointerException
对于行:
FacesContext.getCurrentInstance().getApplication().getNavigationHandler()
.handleNavigation(FacesContext.getCurrentInstance(), null, /login.xhtml);
这是我的代码:
public class MySessionListener2 extends SessionListenerAdapter {
@Override
public void onExpiration(Session session) {
System.out.println("会Session expiration:" + session.getId());
FacesContext.getCurrentInstance().getApplication().getNavigationHandler()
.handleNavigation(FacesContext.getCurrentInstance(), null, Constants.LOGIN);
}
}
堆栈跟踪:
04:12:52,177 ERROR [org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler] (SessionValidationThread-1) Error while validating the session: java.lang.NullPointerException
at deployment.myapp.war//com.myapp.util.MySessionListener1.onExpiration(MySessionListener1.java:58)
at deployment.myapp.war//org.apache.shiro.session.mgt.AbstractNativeSessionManager.notifyExpiration(AbstractNativeSessionManager.java:208)
at deployment.myapp.war//org.apache.shiro.session.mgt.AbstractValidatingSessionManager.onExpiration(AbstractValidatingSessionManager.java:157)
at deployment.myapp.war//org.apache.shiro.web.session.mgt.DefaultWebSessionManager.onExpiration(DefaultWebSessionManager.java:284)
at deployment.myapp.war//org.apache.shiro.session.mgt.AbstractValidatingSessionManager.validate(AbstractValidatingSessionManager.java:145)
at deployment.myapp.war//org.apache.shiro.session.mgt.AbstractValidatingSessionManager.validateSessions(AbstractValidatingSessionManager.java:288)
at deployment.myapp.war//org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler.run(ExecutorServiceSessionValidationScheduler.java:120)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)