Grails java.lang.IllegalStateException:getAttribute:会话已经失效

时间:2018-04-18 16:16:15

标签: tomcat grails illegalstateexception jsessionid

我们的grails应用程序中的数字较少,我们收到java.lang.IllegalStateException: getAttribute: Session already invalidated错误。

我们尝试检查过滤器中的会话是否无效,如果是,则重定向到同一页面但不起作用。看起来会话在请求中间失效。

处理此错误的正确方法是什么?我们应该在顶层放置一个错误处理程序并返回一些http状态吗?

1 个答案:

答案 0 :(得分:1)

在Grails 3.3.9应用程序的请求中间,我们也收到了随机的java.lang.IllegalStateException: getAttribute: Session already invalidated异常。

我们可以将错误归结为以下两个原因:

1)会话已过期。我们通过将application.yml中的会话超时增加到一个工作日来解决此问题。

server:
  session:
    timeout: 28800 # 8h in seconds ...

2)由浏览器“链接预加载”导致的“用户注销” 。现代浏览器会在用户尝试访问页面之前将其预加载到页面中。当用户稍后单击链接时,这将提高加载速度。这意味着,如果您的“注销链接”是一个接受GET请求的简单链接,即使您不想这样做,浏览器也可能会将您注销。

我们发现我们讨厌一个注销链接。因此,我们将其从GET更改为POST。我们的注销链接如下:

<g:link controller="logout">
    <g:message code="title.logout" default="logout" />
</g:link>

所以我们将其更改为

<a href="#" onclick="document['hiddenLogoutForm'].submit();">
    <g:message code="title.logout" default="logout" />            
</a>
<form style="display: none"
      name="hiddenLogoutForm"
      method="POST"
      action="${createLink(controller:'logout') }" >
</form>

这两项更改使java.lang.IllegalStateException: getAttribute: Session already invalidated消失了。祝你好运!