由于ViewExpiredException,在注销后需要登录两次

时间:2012-03-08 21:31:34

标签: jsf websphere viewexpiredexception

我在Websphere Process Server上有一个JSF页面(在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 :(得分:0)

最后使用以下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;
}
}