2015-11-17 38 views
2

我是新的Play Framework,我想實現一個攔截器或過濾器,在請求轉到Action類之前執行。我將如何實現攔截器/過濾器在播放框架2.4.3(斯卡拉)

我想要一個攔截器/過濾器來返回HTTP錯誤(例如401),如果某個頭部變量不存在。

我做了一些Google搜索,並且發現了Filter(play.api.mvc.Filter)對象,但實現返回mvc.Result而不是Response。

倍率DEF申請(下:(mvc.RequestHeader)=>未來[mvc.Result])(請求:mvc.RequestHeader)

,我能想到的另一種解決方案是創建一個通過擴展ActionBuilder自定義動作,但我寧願不這樣做,如果我可以設計一個捕獲所有功能,如過濾器。

任何幫助將不勝感激。謝謝。

回答

1

在你的過濾器中你有兩個選項,你可以調用next,它將控制傳遞給下一個過濾器,或者你可以明確地返回一個Future[Result],這終止了鏈。如果您撥打next,最終過濾器鏈將結束並且它將達到該操作。

這聽起來像你想的apply方法的過濾器一樣

apply(next: RequestHeader => Future[Result])(request: RequestHeader): Future[SimpleResult] = { 
    if (headersok){ 
    next(request) 
    } else { 
    Future{ Unauthorized } 
    } 

}

6

以供將來參考。這是過濾器的實現。感謝tryx的幫助。

import play.api.mvc 
import play.api.mvc.{RequestHeader, Filter} 
import play.api.mvc.Results._ 
import scala.concurrent.ExecutionContext.Implicits.global 

class AuthorizedFilter(requestHeader: RequestHeader) extends Filter { 



    private def authorizationRequired(request: mvc.RequestHeader) = { 

    request.headers.get("Authorized"). 
     map(authorizedValue => authorizedValue.eq("ABCDEFG")). 
     getOrElse(false) 

    } 


    override def apply(next: (mvc.RequestHeader) => Future[mvc.Result])(request: mvc.RequestHeader) = { 
     if(authorizationRequired(request)) { 

     println("YOU are authorized!!") 

     next(request) 

     } 
     println("NOT AUTHORIZED!") 
     Future {Unauthorized } 
    } 
} 

在應用程序的根級別創建一個Filter對象。 (/應用)。

import javax.inject.Inject 

import play.api.http.HttpFilters 

class Filters @Inject() (authorizedFilter: AuthorizedFilter) extends HttpFilters { 

    def filters = Seq(authorizedFilter) 
} 
相關問題