问题描述
我有一个使用sbt工具在Play框架上构建的Scala应用程序。 此应用程序用于服务基于ASP.Net构建的三个不同项目的静态资产。
在构建过程中,我们有一个脚本将所有三个.Net项目的静态内容复制到scala应用程序中的/ Public文件夹中。
.Net应用程序中的HTML / aspx页面将静态页面称为https://myStaticServer/<relativePath>
。
Scala播放具有以下路线,可配置为在公用文件夹中提供任何文件
路线-
GET /*file controllers.Application.serveStatic(path="/public",file)
和控制器如下:
def serveStatic(path: String,file: String): Action[AnyContent] = {
assets.at(path,file)
}
这很好用,直到我们注意到即使在构建之后修改了源js / css文件,缓存的文件仍会被提供的问题。 现在,我们需要实施缓存清除/指纹识别策略。
播放框架提供了使用sbt-digest插件以及后接AssetFinder或反向路由技术的指纹解析,如以下链接中所述。
https://www.playframework.com/documentation/2.8.x/AssetsOverview#Reverse-routing-and-fingerprinting-for-public-assets
但是,上述两种技术都涉及如下更改模板src:
<link href="@routes.Assets.versioned("<filePath>")"> or <link href="@assetsFinder.path("<filePath>")">
。
我无法实现上述步骤,因为模板不是.scala模板。这些是简单的.html / .aspx页面,不属于Scala Play应用程序。
因此,作为一种解决方法,我想实现一个解决方案,该方案将检查Request标头中的“ If-Modified-Since”,并将其与请求文件上的LastModified日期进行比较。
如果两个值都匹配,则将发送Ok(304),否则将发送Ok.sendFile()。withHeaders(200)状态作为响应。
我担心的是-
def serveStatic(path: String,file: String): Action[AnyContent] = {
val filepath : Path = Paths.get( path,file)
val actualFile = filepath.toFile
val lastModified = Files.getLastModifiedTime(filepath)
//Todo : Find request header "If-modified-since" attribute and compare it to lastModified date of file
// Ques -- How to find Request Header in route Controller?
Action {
Ok.sendFile(
content = actualFile,fileName = _ => actualFile.getName()
).withHeaders("Status"-> "200")
}
}
是-如何在路由控制器中查找请求标头?
b)仅使用Ok的操作效果很好,因为它显示空白页,但是Ok.sendFile引发错误“在TypedActor实现方法之外调用TypedActor.context!”
我是否需要实现HttpHandler和HttpFilter来处理这种情况。甚至建议采用上述方法吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)