play for scala 實(shí)現(xiàn)SessionFilter 過(guò)濾未登錄用戶跳轉(zhuǎn)到登錄頁(yè)面
一、編寫SessionFilter.scala代碼
package filters import javax.inject.{Inject, Singleton} import akka.stream.Materializer import controllers.routes import play.api.mvc.{Filter, RequestHeader, Result, Results} import scala.concurrent.Future @Singleton class SessionFilter @Inject()(implicit val mat: Materializer) extends Filter { def apply(nextFilter: RequestHeader => Future[Result]) (requestHeader: RequestHeader): Future[Result] = { if (!requestHeader.session.get("user").isDefined && !requestHeader.path.contains("/signin") && !requestHeader.path.contains("/assets/")) { Future.successful(Results.Redirect(routes.SignController.showSignin())) } else { nextFilter(requestHeader) } } }
說(shuō)明:
!requestHeader.session.get("user").isDefined 是用來(lái)判斷session中是否存在user
!requestHeader.path.contains("/signin") 是用來(lái)排除登錄頁(yè)面,這個(gè)頁(yè)面不登錄也應(yīng)該是可見(jiàn)的,防止出現(xiàn)死循環(huán)跳轉(zhuǎn)
!requestHeader.path.contains("/assets/") 是用來(lái)排除靜態(tài)資源文件的,如圖片、css、JavaScript等
二、在app目錄下的Filters.scala中使用SessionFilter
Filters.scala這個(gè)文件是activator自動(dòng)生成的模板,要使用SessionFilter只要在里面加上sessionFilter: SessionFilter和Seq(sessionFilter)就可以了
import javax.inject._ import filters.{ExampleFilter, SessionFilter} import play.api._ import play.api.http.HttpFilters import play.api.mvc._ /** * This class configures filters that run on every request. This * class is queried by Play to get a list of filters. * * Play will automatically use filters from any class called * `Filters` that is placed the root package. You can load filters * from a different class by adding a `play.http.filters` setting to * the `application.conf` configuration file. * * @param env Basic environment settings for the current application. * @param exampleFilter A demonstration filter that adds a header to * each response. */ @Singleton class Filters @Inject() ( env: Environment, exampleFilter: ExampleFilter, sessionFilter: SessionFilter) extends HttpFilters { override val filters = { // Use the example filter if we're running development mode. If // we're running in production or test mode then don't use any // filters at all. if (env.mode == Mode.Dev) Seq(exampleFilter) else Seq.empty Seq(sessionFilter) } }
以上所述是小編給大家介紹的play for scala 實(shí)現(xiàn)SessionFilter 過(guò)濾未登錄用戶跳轉(zhuǎn)到登錄頁(yè)面,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java獲取當(dāng)前操作系統(tǒng)的信息實(shí)例代碼
這篇文章主要介紹了Java獲取當(dāng)前操作系統(tǒng)的信息實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12基于idea把maven工程轉(zhuǎn)換為web項(xiàng)目
這篇文章主要介紹了基于idea把maven工程轉(zhuǎn)換為web項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Spring?Boot日志基礎(chǔ)使用之如何設(shè)置日志級(jí)別
這篇文章主要介紹了Spring?Boot日志基礎(chǔ)使用設(shè)置日志級(jí)別的方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09使用Java將一個(gè)List運(yùn)用遞歸轉(zhuǎn)成樹(shù)形結(jié)構(gòu)案例
這篇文章主要介紹了使用Java將一個(gè)List運(yùn)用遞歸轉(zhuǎn)成樹(shù)形結(jié)構(gòu)案例,本文通過(guò)詳細(xì)的案例來(lái)解釋說(shuō)明了如何去操作,需要的朋友可以參考下2021-06-06spring-boot-maven-plugin?配置有啥用
這篇文章主要介紹了spring-boot-maven-plugin?配置是干啥的,這個(gè)是SpringBoot的Maven插件,主要用來(lái)打包的,通常打包成jar或者war文件,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08java8 stream sort自定義復(fù)雜排序案例
這篇文章主要介紹了java8 stream sort自定義復(fù)雜排序案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10Java 生成隨機(jī)字符串?dāng)?shù)組的實(shí)例詳解
這篇文章主要介紹了Java 生成隨機(jī)字符串?dāng)?shù)組的實(shí)例詳解的相關(guān)資料,主要是利用Collections.sort()方法對(duì)泛型為String的List 進(jìn)行排序,需要的朋友可以參考下2017-08-08Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 下
在并發(fā)編程中存在線程安全問(wèn)題,主要原因有:1.存在共享數(shù)據(jù) 2.多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或某個(gè)代碼塊,同時(shí)synchronized可以保證一個(gè)線程的變化可見(jiàn)(可見(jiàn)性),即可以代替volatile2021-09-09