2

我面临的情况是,如果我在会话中存储了一个表单,在进行新的战争部署并尝试访问该表单后,我会得到一个 java.lang.ClassCastException。

为了使这对用户透明,我编写了以下代码:

try {
        command = (ReservationOfBooksCommand) request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
    } catch (ClassCastException e) {
        request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
    }

但不确定是否有更优雅的选择,因为我不喜欢捕获 RuntimeExceptions 并且不想在每次部署新战争时重新启动服务器。

谢谢。

4

3 回答 3

3

您可以使用 instanceof 运算符

Object command = request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);

if(!(command instanceof ReservationOfBooksCommand)){
        request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
}else{
   ...
}
于 2010-12-08T19:37:42.480 回答
1

由于您已将此问题标记为tomcat,因此我建议您:

  1. META-INF/context.xml在您自己的 Web 应用程序中创建一个。
  2. 在 context.xml 中添加以下代码行。

样本:

<context>
    <!-- stuff here-->

    <!-- Persistence Manager. This handles all of session Tomcat handles from our app. -->
    <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false">
        <Store className="org.apache.catalina.session.FileStore" /> 
    </Manager>

</context>

正如 Michael Barker 所说,默认情况下,大多数应用程序服务器在重新部署后会清理请求和会话。

要允许 Tomcat 存储会话,请设置saveOnRestart="true". 这允许tomcat 使用PersistentManagera来存储会话FileStore(意思是,使用文件存储系统而不是数据库存储系统)。

希望这可以帮助。

于 2010-12-08T19:42:39.773 回答
0

一些应用服务器允许在重新部署之前清除会话。 例如, Resin将继续为旧会话使用旧代码,将新会话转移到新代码上。显然,您将需要在某个时候使用户会话到期。

于 2010-12-08T19:35:32.527 回答