クッキーの有効期限は68年後までです。
有効期限がうまくセットできないpattern
HttpServletResponseにクッキーをセットするときに有効期限を決めてセットしたかったんだけど、あまりに未来の日付だと有効期限にその日付がセットされずにセッション終了という扱いになってしまう。
有効期限はDBにあり、検索した結果から現在時間を引いた残りの秒を渡していた。
理由は簡単。
セッションの有効期限はint型だから。※DBのTimestampはlong型で計算していた
まずはDBから取得した時間を引数にして残りの時間(秒)を計算する
private static int check(long timeTo){ Timestamp now = new Timestamp(new Date().getTime()); int limit = 0; // 現在時刻から終了日までの時間を計算 long nowL = now.getTime(); try{ long res = (timeTo - nowL) / 1000;// 秒単位 limit = (int)res; }catch (Exception e) { limit = 14*24*60*60;//14日 } return limit; }
その結果をクッキーにセット
public void setCookie(HttpServletResponse response,String value, int limit){ Cookie cookie; try { cookie = new Cookie("hogehoge", URLEncoder.encode(value, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } cookie.setPath("/"); cookie.setMaxAge(limit); response.addCookie(cookie); }
ここでsetMaxAgeにセットする秒はint型なので、現在時刻からInteger.MAX_VALUE秒後までしか最大でセットできない。
ちなみに2014年1月1日0時0分0秒のInteger.MAX_VALUE(2147483647)秒後の日時は2082年1月19日03時14分07秒。
だいたい68年19日ちょい。
テストデータは80年後くらいになっていたので残りの秒を割り出すときにint型に変換していたので桁があふれてしまい、マイナスになってしまっていた。
それをそのままsetMaxAgeにセットしていたので終了が「セッション終了」になった、というのが顛末。
すぐに原因は分かったけど、実際のところ何年後まで入るのかちょっと知りたかったのでめも。