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