PlayFrameworkのセッションはCookieになります。ブラウザを閉じるまで有効なので、従来のservletなどで実現してきたsessionの観念はありません。
これが意外と困ってしまうので(タイムアウトした際にログアウトさせるなど)Cookieに時間を持たせることによりにたようなものを実装してみました
routes
GET / controllers.Application.index GET /login controllers.Application.login POST /login controllers.Application.submit
controllers.Application.scala
package controllers import play.api._ import play.api.mvc._ import helper.Session import helper.Login import play.api.data._ import play.api.data.Forms._ import play.api.data.validation.Constraints._ case class User(id:String,password:String) object Application extends Controller { val userForm = Form[User]( mapping( "id" ->nonEmptyText, "password"->text(minLength=6)) ((id,password)=>User(id,password))((user:User)=>Some(user.id,user.password)) ) def index = Action {request=>{ if(Session.check(request))Ok(views.html.index("LoginOK")) else Redirect(routes.Application.login) } } def login=Action{ Ok(views.html.login(userForm)) } def submit = Action { implicit request => userForm.bindFromRequest.fold( errors => BadRequest(views.html.login(errors)), user => { if(Login.check(request,user.id,user.password))Redirect(routes.Application.index).withSession(Session.set(request)) else BadRequest(views.html.login(userForm)) } ) } }
helper.Login.scala
本来ならばログインIDとパスワードとつきあわせてチェックするのですがとりあえず必ずOKになるように
package helper import play.api._ import play.api.mvc._ object Login { def check(req:Request[AnyContent],id:String,password:String):Boolean={ true // NO check } }
helper.Session.scala
クッキーに保存した時刻と現在時刻を比較し、ログアウトの判定
package helper import play.api._ import play.api.mvc._ object Session { val MAX_MILLISEC:Long=1000*60 // time out val SESSION_KEY="play2" def check(req:Request[AnyContent]):Boolean={ req.session.get(SESSION_KEY).map{ user=>{ val cookieDate=user.toLong val nowDate=new java.util.Date().getTime(); if(nowDate-cookieDatenew java.util.Date().getTime().toString()) } // ログアウトボタンを押したらこれを呼ぶ、未実装 def del(req:Request[AnyContent])={ req.session - SESSION_KEY } }
views.index.scala.html
@(message: String) @message
views.login.scala.html
@(userForm:Form[User]) @import helper._ @helper.form(action=routes.Application.submit){ @inputText( userForm("id"), '_label -> "Username", '_help -> "Please choose a valid username.", '_error -> userForm.globalError ) @inputPassword( userForm("password"), '_label -> "Password", '_help -> "A password must be at least 6 characters. " ) }
ログイン後1分放置するとログイン画面に戻ります