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=&lt;filter that I am enabling&gt; 行之后,禁用的过滤器再次启用,因为我看到了熟悉的错误消息:

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 框架仅启用某些过滤器的主要内容,如果未能解决你的问题,请参考以下文章

在 Java Play 应用中启用 CORS 过滤器

play for scala 实现SessionFilter 过滤未登录用户跳转到登录页面

Angular 4 App调用Play Framework Web App的CORS问题

我将如何在播放框架 2.4.3 (Scala) 中实现拦截器/过滤器

Scala play框架中@Singleton的使用

有没有办法使用scala过滤不包含spark数据框中某些内容的字段?