【发布时间】:2016-03-29 14:50:43
【问题描述】:
在 Play 2.3 中,我可以根据不同的请求路径或方法禁用某些过滤器。但是,我在 Play 2.4 中找不到方法。 https://www.playframework.com/documentation/2.4.x/ScalaHttpFilters。如何在 Play 2.4 HttpFilters 中获得类似的结果。
这是我在 Play 2.3 中的做法。
object CacheCtrlHeadersFilter extends EssentialFilter {
def apply(action: EssentialAction) = new EssentialAction {
def apply(requestHeader: RequestHeader) = {
action(requestHeader).map { result =>
result.withHeaders(
CACHE_CONTROL -> "no-cache, no-store, must-revalidate, private",
PRAGMA -> "no-cache"
)
}
}
}
}
import play.api.libs.iteratee._
object FilterChainByRequestHeader {
def apply[A](action: EssentialAction, filtersFun: (RequestHeader) => List[EssentialFilter]): EssentialAction = new EssentialAction {
def apply(rh: RequestHeader): Iteratee[Array[Byte], Result] = {
val chain = filtersFun(rh).reverse.foldLeft(action) { (a, i) => i(a) }
chain(rh)
}
}
}
object Global extends GlobalSettings {
val securityFilter = SecurityHeadersFilter()
val defaultFilters = List(securityFilter,
CacheCtrlHeadersFilter)
def filters(rh: RequestHeader) = {
if (rh.method == "OPTIONS") <----------- by method
defaultFilters.filterNot(_.eq(securityFilter))
else if (rh.path.startsWith("/apps/google")) <----------- by path
defaultFilters.filterNot(_.eq(securityFilter))
else defaultFilters
}
override def doFilter(a: EssentialAction): EssentialAction = {
FilterChainByRequestHeader(super.doFilter(a), filters)
}
}
Play 2.4 中的 HttpFilters 中没有可用的 RequestHeader
class Filters @Inject() (
securityHeadersFilter: SecurityHeadersFilter,
cacheCtrlHeadersFilter: CacheCtrlHeadersFilter
) extends HttpFilters {
val filters = Seq(securityHeadersFilter, cacheCtrlHeadersFilter)
}
【问题讨论】:
-
只是一个想法,但也许您可以扩展过滤器并在其中构建逻辑?
-
@gpgekko 是的,我想过。但我想知道这是否是唯一的解决方案。
-
@gpgekko 另外,如果我构建一个过滤器,如何在 apply 函数中跳过当前过滤器?
-
我现在没有 Scala 文档(并且我不熟悉 Scala),但我想一个 if 语句只调用 super / 如果为真则改变结果并且不更改/返回在 else 中未更改的结果
标签: scala playframework playframework-2.3 playframework-2.4