セッションの有効期限

HttpSession.setMaxInactiveInterval()で設定する有効期限はサーバでの有効期限。
CookieでセッションIDを管理している場合、ブラウザが閉じられるとCookieは破棄されるので、セッションは継続しない。
自動ログインのように、ブラウザが一度閉じられてもセッションを継続させたい場合は、Cookieの有効期限を設定する必要がある。

HttpSession session = request.getSession(true);//この時点でCookieにセッションIDが設定される
session.setMaxInactiveInterval(60 * 60 * 24 * 10);//セッション有効期限10日
Cookie cookie = new Cookie("JSESSIONID", session.getId());//自前でセットするCookieを作る
cookie.setMaxAge(60 * 60 * 24 * 10);//Cookie有効期限10日
cookie.setPath("/");
response.addCookie(cookie);//Cookieの設定を上書き

こんな感じ〜
ちなみに、試すときはブラウザの設定をよく確かめよう・・・ハマッタ。

時間の扱い

すぐに忘れるのでメモ。

JSTの日付を取得したい

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
sdf.setTimeZone(TimeZone.getTimeZone("JST"));//タイムゾーンを必ず指定するようにすれば間違いはない
System.out.println(sdf.format(new Date()));//UTCのDateオブジェクトがJSTのyyyy/MM/ddに変換される

JSTで今日の0時丁度のUTCミリ秒を取得

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("JST"));//タイムゾーンをJSTに    
cal.setTimeInMillis(System.currentTimeMillis());//現在のUTCミリ秒をセット
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);                    //時間を0時丁度にセット
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTimeInMillis());

任意の日付を取得したければ上記二つを組み合わせればおk

System.out.println(sdf.format(new Date(cal.getTimeInMillis())));

基本的に比較やらなんやらで時間を扱うときはすべてUTCミリ秒で考えれば簡単だ。

FORMプラグインでファイルアップロードしてレスポンスをJSONで受け取る

レスポンスに次のようなjsonが返ってくるとする。

{"header":{"message":"successful","status":"0"}}

ajaxSubmit()でファイルをアップロードするとiframeを使うので、レスポンスのContent-typeがapplication/jsonだとjsonのファイルをダウンロードしようとしてしまい上手く動かない。
なのでレスポンスをtext/plainにしてやると動いた。
が、FFでは動くんだけどIEだと動かない。

$('#form1').ajaxSubmit({
    dataType:'json',
    success:function(data){
        alert(data.header.message);//
    }
});    

そこで、少々強引だがContent-typeをtext/htmlレスポンスして処理することにした。
※text/htmlだとダブルクオートのエスケープシーケンスがダブルクオートとして読み込まれてしまいパースできなくなる

dataTypeをjsonではなく、xmlとして処理すればうまくいく。

$('#form1').ajaxSubmit({
    dataType:'xml',
    success:function(data){
        var jsonText = $('body', data).text();
        var json = $.parseJSON(jsonText);
        alert(json.header.message);
    }
});

iframeには次のようなhtmlが出力されるのでxmlとして解析してやればおk

<head></head><body>{"header":{"message":"successful","status":"0"}}</body>

本来なら、ファイルアップロードはその他のフォームデータとは別に処理するようにして、レスポンスをjson以外にしてやればいいことなのかもしれないけど、面倒なのでこの方法でとりあえずは良しとしよう。
動いてるし。

備忘録をはじめる

ローカルにはメモ書きみたいなことをしているが、やはりいろいろと不都合が多い。
という訳でWEB上に備忘録をつけることにした。
間違いには優しく指摘して頂けるとありがたいのであります。