Scala Play 框架仅启用某些过滤器
Posted
技术标签:
【中文标题】Scala Play 框架仅启用某些过滤器【英文标题】:Scala Play framework enable only certain filters 【发布时间】:2017-10-12 03:15:21 【问题描述】:我正在尝试仅启用一个播放过滤器,同时禁用其他过滤器(如主机过滤或 CSRF 过滤)。
这是我的application.conf file
:
play.http.filters=<filter that I am enabling>
play.filters.disabled+=play.filters.hosts.AllowedHostsFilter
play.filters.disabled+=play.filters.csrf.CSRFFilter
似乎在我在一开始添加play.http.filters=<filter that I am enabling>
行之后,禁用的过滤器再次启用,因为我看到了熟悉的错误消息:
Illegal 'x-forwarded-for' header: Invalid input ':', expected listSep or 'EOI' (line 1, column 13)
在scala play框架中禁用某些过滤器和启用某些过滤器的正确方法是什么?
【问题讨论】:
【参考方案1】:在 play 2.6 中,禁用/启用默认过滤器由 changig application.conf 完成。要启用默认过滤器,应添加play.filters.enabled。要禁用默认过滤器,您应该添加play.filters.disabled。
我认为这里有些混乱。 play.http.filters 应该是应用程序中类的完全限定类名。此类负责启用/禁用过滤器。这是一个简单的过滤器示例,它尊重 play.filters.enabled/disabled 配置:
import javax.inject.Inject, Singleton
import play.api.http.DefaultHttpFilters
import play.api.http.EnabledFilters
import play.api.mvc.EssentialAction, EssentialFilter
import scala.concurrent.ExecutionContext
// Our example filter
@Singleton
class ExampleFilter @Inject()(implicit ec: ExecutionContext) extends EssentialFilter
override def apply(next: EssentialAction) = EssentialAction request =>
next(request).map result =>
result.withHeaders("X-ExampleFilter" -> "foo")
// All our filters
class Filters @Inject()(
defaultFilters: EnabledFilters, // respect play.filters.enabled and play.filters.disabled
exampleFilter: ExampleFilter, // you can pass user-defined filter
) extends DefaultHttpFilters(defaultFilters.filters: _*)
【讨论】:
谢谢。但是,我想要的唯一过滤器不是默认过滤器,而是来自 3rd 方库的过滤器。看起来 play.filters.enabled 仅适用于默认播放过滤器。在这种情况下,我怎么能不启用默认过滤器?谢谢【参考方案2】:在 Play 2.6 中,您应该能够按照 documentation 中的说明执行 play.filters.enabled=[youDesiredFilter]
。
只会启用该列表中的过滤器。如果未列出所有默认过滤器,它们将被禁用。
【讨论】:
以上是关于Scala Play 框架仅启用某些过滤器的主要内容,如果未能解决你的问题,请参考以下文章
play for scala 实现SessionFilter 过滤未登录用户跳转到登录页面
Angular 4 App调用Play Framework Web App的CORS问题