如何在使用绝对网址的非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 (将#修改为@)