我正在使用Scalatra框架来构建Web应用程序.应用程序依赖于会话,但我不能使用会话cookie(因为从技术上讲,只有一个用户,它同时运行多个会话).
每个会话都有一个唯一的会话密钥,我想将其用作标识符.我希望将此密钥作为GET或POST参数而不是cookie标头发送.
我现在的问题是:如何在没有cookie的情况下将会话信息(即状态)存储在Scalatra servlet中,而只是将参数作为标识符存储?
到目前为止,我尝试使用文件系统来存储所有会话信息,但这太慢而且不必要,因为会话只持续几秒钟.
(安全不是问题)
我在IntelliJ Idea中找不到任何调试Scalatra应用程序的文档或示例.是否可以在调试模式下运行Scalatra应用程序以附加Idea?
我有一个与嵌入式Jetty一起运行的Scalatra Web服务.我现在想编写集成测试:
这应该全部由SBT命令触发.
我该怎么办呢?
我试图通过尝试使用Scalatra来进入Scala.我不久前在课程上完成了Martin Odersky的课程,但我仍然很难理解这是如何工作的:
package com.example.app
import org.scalatra._
class HelloWorldApp extends ScalatraFilter {
get("/") {
<h1>Hello, {params("name")}</h1>
}
}
Run Code Online (Sandbox Code Playgroud)
此示例取自Scalatra主页:http://www.scalatra.org/
如何执行此声明:
get("/") {
Hello, {params("name")}
}
是{}参数的get()方法吗?你能解释一下Scala语言的哪些特性在使用吗?Scalatra源代码的指针将是完美的定义,这将是完美的.
我的目标是为我的小部件构建一个高度并发的后端.我现在将后端作为Web服务公开,它接收运行特定小部件的请求(使用Scalatra),从DB获取小部件的代码并在演员(使用Akka)中运行它,然后回复结果.所以想象我做的事情如下:
get("/run:id") {
...
val actor = Actor.actorOf("...").start
val result = actor !! (("Run",id), 10000)
...
}
Run Code Online (Sandbox Code Playgroud)
现在我相信这不是最好的并发解决方案,我应该在一个actor实现中以某种方式结合侦听请求和运行小部件.您如何设计这个以获得最大的并发性?谢谢.
我正在尝试基于scalatra-sbt.g8的以下内容:
class FooWeb extends ScalatraServlet with ScalateSupport {
beforeAll { contentType = "text/html" }
get("/") {
templateEngine.layout("/WEB-INF/scalate/templates/hello-scalate.jade")
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到以下异常(即使文件存在) - 任何线索?
Could not load resource: [/WEB-INF/scalate/templates/hello-scalate.jade]; are you sure it's within [null]?
org.fusesource.scalate.util.ResourceNotFoundException: Could not load resource: [/WEB-INF/scalate/templates/hello-scalate.jade]; are you sure it's within [null]?
Run Code Online (Sandbox Code Playgroud)
FWIW,最重要的例外是来自org.mortbay.jetty.handler.ContextHandler.getResource1142行:_baseResource==null.
有没有人知道我可以找到一个经典的"聊天"应用程序的例子,使用Akka Futures和Scalatra 2.1?文档中的Futures示例有点微不足道,因为我对Akka是全新的,而且对Scalatra来说相对较新,我想从一个坚实的基础开始.我知道这可能很难,因为Scalatra 2.1仍在正式开发中.
(注意,这是Scalate Jade,如果这有所不同)
我有以下路线:
get("/fruit") {
contentType = "text/html"
jade("fruity", "fruit" -> "apple")
}
Run Code Online (Sandbox Code Playgroud)
这个fruity.jade模板:
-@ val fruit: String
p Alerting #{fruit}
:javascript
alert("#{fruit}");
Run Code Online (Sandbox Code Playgroud)
它呈现如下:
<body><p>Alerting apple</p>
<script type="text/javascript">
//<![CDATA[
alert("#{fruit}");
//]]>
</script>
</body>
Run Code Online (Sandbox Code Playgroud)
该fruit值不是针对javascript部分进行插值的.我怎样才能在javascript中解决它?
我的服务器应用程序使用Scalatra,json4s和Akka.
它收到的大多数请求都是POST,它们会立即返回给客户端并返回固定响应.实际响应以异步方式发送到客户端的服务器套接字.为此,我需要getRemoteAddr从http请求.我正在尝试使用以下代码:
case class MyJsonParams(foo:String, bar:Int)
class MyServices extends ScalatraServlet {
implicit val formats = DefaultFormats
post("/test") {
withJsonFuture[MyJsonParams]{ params =>
// code that calls request.getRemoteAddr goes here
// sometimes request is null and I get an exception
println(request)
}
}
def withJsonFuture[A](closure: A => Unit)(implicit mf: Manifest[A]) = {
contentType = "text/json"
val params:A = parse(request.body).extract[A]
future{
closure(params)
}
Ok("""{"result":"OK"}""")
}
}
Run Code Online (Sandbox Code Playgroud)
该withJsonFuture函数的目的是将一些样板移出路径处理.
这有时会起作用(打印一个非空值request),有时候request是null,我觉得很令人费解.我怀疑我必须"关闭" request我的未来.但是,当没有其他请求发生时,在受控测试方案中也会发生错误.我想request是不可改变的(也许我错了?)
为了解决这个问题,我已将代码更改为以下内容:
case class …Run Code Online (Sandbox Code Playgroud) 我正在对scalatra路由进行测试,但对独立的sbt项目(使用Jetty)使用ScalatraSuite(FunSuiteLike)失败。
产生的错误是:
java.lang.IllegalArgumentException:要求失败:检测到的本地端口<1,这是不允许的
我还尝试过单独运行码头,然后再运行“ sbt测试”,但同时也引发了同样的错误。谁能帮忙解决这个问题?