zoukankan      html  css  js  c++  java
  • play for scala 实现SessionFilter 过滤未登录用户跳转到登录页面

    一、编写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)
        }
      }
    }

    说明:

    !requestHeader.session.get("user").isDefined 是用来判断session中是否存在user

    !requestHeader.path.contains("/signin") 是用来排除登录页面,这个页面不登录也应该是可见的,防止出现死循环跳转

    !requestHeader.path.contains("/assets/") 是用来排除静态资源文件的,如图片、css、JavaScript等

    二、在app目录下的Filters.scala中使用SessionFilter

    Filters.scala这个文件是activator自动生成的模板,要使用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)
      }
    }

    原创文章,转载请注明出处。

  • 相关阅读:
    html设置360兼容/极速模式
    es查询备忘录
    TypeError: __init__() got an unexpected keyword argument 'strict'
    pandas处理csv
    scrapy中cookie处理
    滑动验证码破解(一)
    python 自定义属性访问 __setattr__, __getattr__,__getattribute__, __call__
    数据库的增删改、单表查询
    库的操作,表的操作,数据类型,完整性约束
    Mysql常用命令(二)
  • 原文地址:https://www.cnblogs.com/tangjizhong/p/6100654.html
Copyright © 2011-2022 走看看