После выхода из системы требуется дважды войти в систему из-за исключительной ситуации ViewExpiredException - PullRequest
0 голосов
/ 09 марта 2012

У меня есть страница JSF на Websphere Process Server (поверх WAS 7), которая имеет исключение ViewExpiredException.Когда это происходит, я хочу, чтобы пользователь вышел из системы, а затем снова вошел в нее. Я установил перенаправление для этого исключения в web.xml на следующую страницу выхода из системы:

<%  
  session.invalidate();
  response.sendRedirect("ibm_security_logout?logoutExitPage=/faces/ToDosOpen.jsp");
%>

, которая затем перенаправляет настраница входа:

<%@ page import="com.ibm.wbit.tel.client.jsf.infrastructure.Messages, java.util.Locale" language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%
    String contextPath = request.getContextPath();
    Locale locale = request.getLocale();
    final String SECURITY_CHECK = "j_security_check";
%>

...
</head>

<body>
...

<h1><%= Messages.getString("LOGIN_LINE", locale) %></h1>

<div class="help-text"><%= Messages.getString("LOGIN_LINE_DESCR", locale) %></div>

<form target="_top" method="POST" action=<%= SECURITY_CHECK %>>
    <table id="login-form">
        <tr>
            <td><%= Messages.getString("LOGIN_NAME", locale) %>:</td>
            <td><input type="text" name="j_username"></td>
        </tr>
        <tr>
            <td><%= Messages.getString("LOGIN_PASSWORD", locale) %>:</td>
            <td><input type="password" name="j_password"></td>
        </tr>
        <tr> 
            <td id="login-button" colspan="2">
<input type="submit" name="login" value="
<%= Messages.getString("BUTTON_LOGIN", locale) %>"></td>
            </tr>
    </table>

 </form>

И когда вы входите в систему, вы перенаправляетесь на страницу, которая вызвала исключение.Кроме того, что на самом деле происходит, исключение выдается снова, и мы возвращаемся на страницу входа.

Таким образом, вы должны войти в систему дважды.

Не уверен, что с этим делать или с чего начать искать.Любая помощь будет оценена.Я просмотрел существующие вопросы по этому вопросу и не смог их решить.


РЕДАКТИРОВАТЬ: я забыл упомянуть, что это работает нормально, если действие, которое вызвало исключение, было обновление,но завершается неудачно (необходимо дважды войти в систему), если действие щелкало по панели команд.

1 Ответ

0 голосов
/ 11 мая 2012

Наконец-то решил, используя следующий ViewHandler. Это в основном воссоздает вид, который истек. В случае, когда были параметры POST, они, очевидно, были потеряны, поэтому любое представление, которое не может быть создано без них, требует специальной обработки.

Надеюсь, это будет полезно всем, кто сталкивается с этой проблемой, и, пожалуйста, дайте мне знать, если вы видите что-то не так с этим решением, потому что я не уверен на 100%.

/**
 * This class just handles cases where the session expired
 * which causes an exception on reload.
 */
public class ViewExpiredHandler extends ViewHandlerWrapper {

private ViewHandler wrapped;

public ViewExpiredHandler(ViewHandler wrapped) {
    this.wrapped = wrapped;
}

@Override
public UIViewRoot restoreView( FacesContext ctx, String viewId )
{
    UIViewRoot viewRoot = super.restoreView( ctx, viewId );
    try {
        if ( viewRoot == null) {

            viewRoot = super.createView( ctx, viewId );
            ctx.setViewRoot( viewRoot );

        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return viewRoot;
}

@Override
protected ViewHandler getWrapped() {
    return wrapped;
}
}
...