【问题标题】:Scala Play 2.4 Filters (Logging, CORS) not working on HerokuScala Play 2.4 过滤器(日志记录,CORS)在 Heroku 上不起作用
【发布时间】:2017-08-10 12:30:13
【问题描述】:

我有一个在本地运行良好的 Scala Play (2.4) REST API。当我将它部署到 Heroku 时,我从一个单独的 Web 应用程序调用它时遇到了 CORS 问题。

我通过添加基于文档的 CORS 过滤器解决了这个问题,并且在本地运行时我没有收到 CORS 错误。但是当部署到 Heroku 时,我仍然得到标准的 CORS 错误。

为了隔离问题,我在我的应用程序中添加了一个简单的日志过滤器,它在本地也能正常工作。但即使是这个日志过滤器也不能在 Heroku 上工作。

这让我觉得我的过滤器在部署到 Heroku 时可能没有被调用。

我不确定如何解决此问题。任何帮助将不胜感激。

【问题讨论】:

  • 开发和生产是否有单独的配置?
  • 不,我只使用默认的 application.conf 文件。

标签: scala heroku playframework-2.0 cors servlet-filters


【解决方案1】:

这看起来很奇怪,因为 Heroku 实际上只运行输出

% sbt stage

如果您创建 stage 构建然后运行 ​​Procfile 中的任何内容,您的过滤器是否工作(例如:

% target/universal/stage/bin/myappname -Dhttp.port=$PORT ?

工作设置:

我有几个 Play 2.4 应用在 Heroku 中运行,并带有有效的过滤器,下面是我现在面前的 Play 2.4.6 应用的示例:

build.sbt

确保指定了filters 依赖项:

libraryDependencies ++= Seq(
  ws,
  cache,
  filters,
  ...
)

application.conf

配置 CORS 模块:

play.modules.enabled += "play.filters.cors.CORSModule"
play.filters.cors {
  allowedOrigins = null,      # This means "all"
  allowedHttpMethods = null   # This means "all"
  exposedHeaders = ["Authorization", "Content-Length", "Content-Type", "Content-disposition"],
  preflightMaxAge = 14 days
}

Filters.scala

(位于app 目录的根目录中):

import javax.inject.Inject
import play.api.http.HttpFilters
import play.filters.cors.CORSFilter

class Filters @Inject() (corsFilter: CORSFilter) extends HttpFilters {
  def filters = Seq(corsFilter)
}

如果您已将所有内容都进行了这样的配置,但它仍然无法正常工作,那么您确定您对 Heroku 的部署实际上已成功完成吗?检查日志(% heroku logs --tail

【讨论】:

  • 我将我的代码与此进行了比较,并且以完全相同的方式做事。接受这个作为答案,因为这是正确的方法。升级到 Play 2.5 解决了我的问题
猜你喜欢
  • 2011-12-27
  • 2018-10-19
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2019-01-12
  • 2018-08-24
  • 2013-04-27
相关资源
最近更新 更多