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

Beh*_*çar 5 grails tomcat jsessionid illegalstateexception

我们的 grails 应用程序中出现java.lang.IllegalStateException: getAttribute: Session already invalidated少量错误。

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

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

Mar*_*mid 4

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

我们可以将错误归因于这两个原因:

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

server:
  session:
    timeout: 28800 # 8h in seconds ...
Run Code Online (Sandbox Code Playgroud)

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

我们发现我们有一个用于注销的链接。所以我们把它从GET改为POST。我们的注销链接如下:

<g:link controller="logout">
    <g:message code="title.logout" default="logout" />
</g:link>
Run Code Online (Sandbox Code Playgroud)

所以我们把它改为

<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>
Run Code Online (Sandbox Code Playgroud)

这两个变化使java.lang.IllegalStateException: getAttribute: Session already invalidated消失。祝你好运!