В моем приложении JSF после успешного входа я перехожу на мою домашнюю страницу приложения, где у меня есть ссылка Logout
.
Вот соответствующий HTML-код для ссылки выхода из системы.
<div id="top_white">
<div style="float: right"><tr:form><tr:commandLink id="logout" action="#{Controller.Logout}"><img alt="logout" src="../../images/logout.gif"/></tr:commandLink></tr:form></div>
</div>
А вот мой Controller
, который sessionscoped
public class Controller {
private static Logger LOGGER = Logger.getLogger(Controller.class);
public Controller() {
req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
session = req.getSession(false);
String userid = session.getAttribute("userid").toString();
if(List == null){
List = new ArrayList<List>();
List = new DAO().loadListByid(Long.valueOf(userid));
LOGGER.debug("successfully loaded the list for the user");
}
}
private long Username;
private String Password=null;
HttpServletRequest req;
HttpSession session;
private List<List> List=null;
// getter and setters
public String Logout(){
session.invalidate();
LOGGER.debug("In LogOut");
return "loggedout";
}
}
В конструкторе я проверяю идентификатор пользователя в сеансе и загружаю определенный список для пользователя.
У меня также есть ServletFilter
, который проверяет некоторый идентификатор в каждом сеансе. Если он не найден, он перенаправляет на страницу InvalidUser. Мой фильтр сопоставляется с /faces/jsp/*
, так что для всех jsp в папке jsp проверяются на идентификатор в сеансе.
Вот метод doFilter
моего фильтра
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
LOGGER.debug("In doFilter");
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
LOGGER.debug("request:" + request.getRequestURL().toString());
try{
if (session.getAttribute("id") != null) {
LOGGER.debug("id found:" + session.getAttribute("id"));
chain.doFilter(req, res); // id found, so just continue request.
}
}catch(NullPointerException e){
LOGGER.debug("No id found Exception: ", e);
response.sendRedirect(properties.getProperty(INVALID_USER_REDIRECTURL, true)); // No id found, so redirect to Invalid user page.
}
}
Я также добавил PhaseListener
для отладки жизненного цикла JSF, который взят из здесь .
Когда страница загружается впервые, я вижу следующий журнал сервера только с первой и последней фазами жизненного цикла JSF
["http-bio-8090"-exec-114] DEBUG SessionFilter - In doFilter
["http-bio-8090"-exec-114] DEBUG SessionFilter - request:http://my homepageurl
["http-bio-8090"-exec-114] DEBUG SessionFilter - id found
["http-bio-8090"-exec-114] ERROR org.apache.myfaces.config.FacesConfigurator - Configuration objects do not support clean-up. Update aborted
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RESTORE_VIEW(1)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RESTORE_VIEW(1)
["http-bio-8090"-exec-114] DEBUG org.apache.myfaces.lifecycle.LifecycleImpl - exiting from lifecycle.execute in RESTORE_VIEW(1) because getRenderResponse is true from one of the after listeners
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RENDER_RESPONSE(6)
["http-bio-8090"-exec-114] INFO org.apache.myfaces.config.annotation.DefaultLifecycleProviderFactory - Using LifecycleProvider org.apache.myfaces.config.annotation.AllAnnotationLifecycleProvider
["http-bio-8090"-exec-114] DEBUG Controller - id found in controller
["http-bio-8090"-exec-114] DEBUG DAOProperties - dao.properties loaded successfully
["http-bio-8090"-exec-114] DEBUG SvrConnection - In JNDI
["http-bio-8090"-exec-114] DEBUG DAO - Successfully connected to database
["http-bio-8090"-exec-114] DEBUG DAO - connection closed
["http-bio-8090"-exec-114] DEBUG Controller - successfully loaded the list for the user
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RENDER_RESPONSE(6)
Вышеприведенный журнал соответствует ожидаемому, поскольку отсутствует тип отправки материала. Так что перечислены только первый и последний этапы.
Но настоящая проблема возникает, когда я нажимаю Logout
commandLink, о котором я упоминал в верхней части этого поста.
После того, как я нажму на ссылку Logout
, вот журнал сервера.
["http-bio-8090"-exec-114] DEBUG SessionFilter - In doFilter
["http-bio-8090"-exec-114] DEBUG SessionFilter - request:http://my homepage url
["http-bio-8090"-exec-114] DEBUG SessionFilter - appid found
["http-bio-8090"-exec-114] ERROR org.apache.myfaces.config.FacesConfigurator - Configuration objects do not support clean-up. Update aborted
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RESTORE_VIEW(1)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RESTORE_VIEW(1)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE APPLY_REQUEST_VALUES(2)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE APPLY_REQUEST_VALUES(2)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE PROCESS_VALIDATIONS(3)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE PROCESS_VALIDATIONS(3)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE UPDATE_MODEL_VALUES(4)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE UPDATE_MODEL_VALUES(4)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE INVOKE_APPLICATION(5)
["http-bio-8090"-exec-114] DEBUG Controller - In LogOut
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE INVOKE_APPLICATION(5)
["http-bio-8090"-exec-114] DEBUG org.apache.myfaces.lifecycle.LifecycleImpl - exiting from lifecycle.execute in INVOKE_APPLICATION(5) because getRenderResponse is true from one of the after listeners
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RENDER_RESPONSE(6)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RENDER_RESPONSE(6)
["http-bio-8090"-exec-116] DEBUG SessionFilter - In doFilter
["http-bio-8090"-exec-116] DEBUG SessionFilter - request:http://my homepage url
["http-bio-8090"-exec-116] DEBUG SessionFilter - No id found Exception:
java.lang.NullPointerException
Из приведенного выше журнала, как и ожидалось, мой метод действия вызывается в INVOKE_APPLICATION
, и вызывается метод Logout()
моего контроллера, и сессия становится недействительной, и возвращается строка loggedout
.
У меня есть следующее правило навигации в faces-config.xml
<navigation-rule>
<from-view-id>/jsp/Services.jsp</from-view-id>
<navigation-case>
<from-outcome>loggedout</from-outcome>
<to-view-id>/others/Logout.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Но это navigation-rule
не выполняется. Вместо этого в фазе RENDER_RESPONSE
он пытается перезагрузить мою же домашнюю страницу url. Очевидно, что в сеансе нет id
, что вызывает выброс NullPointerException
.
У меня есть jsp в соответствующих папках, как указано выше. Я использую JSF 1.2 и myFaces 1.2.9.
1) Почему навигационный кейс не выполняется?
2) Почему снова загружается URL моей домашней страницы?
Пожалуйста, помогите.