微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在使用绝对网址的非Scala模板的Scala Play中实现缓存清除?

如何解决如何在使用绝对网址的非Scala模板的Scala Play中实现缓存清除?

我有一个使用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)状态作为响应。

我担心的是-

  1. 由于我是Scala Play框架的新手,因此这种方法更适合。将文件中的修改日期与每个请求的标头值进行比较会对性能产生影响吗?
  2. a)我在哪里编写逻辑以进行上述处理?目前,我正在如下修改路由控制器-
 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 举报,一经查实,本站将立刻删除。