Метод действия tr: commandLink не переходит на следующую страницу. Вместо этого снова загружает ту же страницу - PullRequest
2 голосов
/ 17 ноября 2011

В моем приложении 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 моей домашней страницы?

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 21 ноября 2011

Я обнаружил, что это проблема выхода из системы в JSF. Нет проблемы с tr: commandLink.

Я прочитал несколько постов о проблеме выхода из JSF здесь на SO и реализовал то же самое.

Работает как положено.

...