PlayFramework2.1でセッションタイムアウトを作ってみた

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分放置するとログイン画面に戻ります