GAE/J でセッションを使っていて困った現象が1つ。

JSESSIONIDが永続化されないのだ。

Chromeで見てみると御覧の通りで実機に上げても同じ。

web.xml の session-timeout を設定しても変わらない。

jetty のソースを眺めてみたがそんな実装になっているように見えない。
GAEの独自の仕様なのだろうか?

自力でセッションを実装しても良いのだができればやりたく無いので 逃げ手を探してみた。

Set-Cookie は同じキーが複数ある場合、 後の方が有効になるはずなので Filter をかましてみた。

public class SessionFilter implements Filter { public void init(FilterConfig conf) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException { chain.doFilter(req, res); HttpServletRequest _req = (HttpServletRequest) req; HttpServletResponse _res = (HttpServletResponse) res; HttpSession session = _req.getSession(); Cookie jsid = new Cookie("JSESSIONID",session.getId()); jsid.setMaxAge(session.getMaxInactiveInterval()); jsid.setPath("/"); _res.addCookie(jsid); } public void destroy() { } }

なんか行けてるみたい。
とりあえず、session-timeout の設定が効くようになった。

しかし、GAE が何らかの意図を持ってやっている場合、 将来的に動かなくなるかもしれないのでこういう回避に仕方は嫌なんだよね。

でも、ブラウザ立ち上げっぱなしすれば同じだから意味がない。 どういう仕様なんだろ。