我在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>
当您登录时,您将被重定向到首先导致异常的页面。除了实际发生的事情再次抛出异常,然后我们返回登录页面。
所以你必须登录两次。
不确定该怎么办或从哪里开始寻找。任何帮助,将不胜感激。 我已经查看过现有的问题并且无法解决。
编辑:我忘了提到如果触发异常的操作是刷新,但如果操作点击命令栏就失败(必须登录两次),这样可以正常工作。
答案 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;
}
}