我一直关注Racket's tutorial on building Web servlets,同时还阅读有关撰写Web Applications in Racket的文档。我已经尝试简化教程中的示例,同时还遵循Web文档中的建议,即您希望使用Stateless Servlets来提高可伸缩性"。
我的简化示例只显示了一个数字列表,并允许用户通过输入表单向列表中添加一个数字。到达教程中Advanced Control Flow的部分,其中" send/suspend/dispatch"解释了机制,我尝试了我的示例应用程序,发现添加了一个额外的数字,但浏览器中显示的嵌入式URL包含大量信息,包括我的脚本的完整路径,我宁愿在生产环境中保守秘密。以下是我所说的URL的两个例子:
http://localhost:8080/;(("c"%20.%20"0((3)%203%20(((lib%20%5C"web-server%2Flang%2Fabort-resume.rkt%5C")%20.%20%5C"lifted.3%5C")%20((lib%20%5C"web-server%2Flang%2Fweb-cells.rkt%5C")%20.%20deserialize-info:frame-v0)%20(%23%5C"%2FUsers%2Flogc%2FDocuments%2Fcode%2Fpersonal%2Fracket%2Fapp%2Fservlet.rkt%5C"%20.%20%5C"lifted.142%5C"))%200%20()%20()%20(0%20(1%20(h%20-%20()))%20(c%20(v!%20(2%20(q%201%202%203))%20%23f%20%23f))))"))?number=12
http://localhost:8080/;(("c"%20.%20"0((3)%203%20(((lib%20%5C"web-server%2Flang%2Fabort-resume.rkt%5C")%20.%20%5C"lifted.3%5C")%20((lib%20%5C"web-server%2Flang%2Fweb-cells.rkt%5C")%20.%20deserialize-info:frame-v0)%20(%23%5C"%2FUsers%2Flogc%2FDocuments%2Fcode%2Fpersonal%2Fracket%2Fapp%2Fservlet.rkt%5C"%20.%20%5C"lifted.142%5C"))%200%20()%20()%20(0%20(1%20(h%20-%20()))%20(c%20(v!%20(2%20(c%20(u%20.%20%5C"12%5C")%20q%201%202%203))%20%23f%20%23f))))"))?number=45
以下是我简化教程应用程序的完整代码。我只是将代码分成两个文件," servlet.rkt"保持处理程序功能和" serve.rkt"启动servlet。
serve.rkt :
#lang racket
(require "servlet.rkt"
web-server/servlet-env)
(serve/servlet app
#:port 8080
#:stateless? #t
#:command-line? #t
#:servlet-path "/")
servlet.rkt :
#lang web-server
(require web-server/http)
(provide interface-version stuffer app)
(define interface-version 'stateless)
(define stuffer
(stuffer-chain
serialize-stuffer
(md5-stuffer (build-path (find-system-path 'home-dir) ".urls"))))
(define CONTENTS
(list 1 2 3))
(define (app req)
(render-number-list CONTENTS req))
(define (render-number-list numbers req)
(define (response-generator embed/url)
(response/xexpr
`(html
(body (h1 "Contents")
(form
((action ,(embed/url insert-number-handler)))
(input ((name "number")))
(input ((type "submit"))))
(ul ,@(map render-number numbers))))))
(define (insert-number-handler req)
(render-number-list
(cons (extract-binding/single 'number (request-bindings req)) numbers)
req))
(send/suspend/dispatch response-generator))
(define (render-number number)
`(li ,(format "~a" number)))
为了它的价值,我使用了一个shell脚本来执行 serve.rkt 。
仓/应用:
#!/bin/sh
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
racket $DIR/../serve.rkt
我的问题是:这是(嵌入式URL中的长信息列表)可以避免吗?我错误配置了什么吗?这是否与我试图使这个servlet无状态,或者这个无关的事实有关?
相关问题(Racket URL dispatch,How to show different content based on the path in Racket web servlets?)显示了解决问题的不同方法,我可能会尝试,但我仍然想知道这个传递的URL是否是设计的,并且Racket中的无状态servlet是否通常以这种方式工作(或者我犯了一个错误)。
答案 0 :(得分:1)
我认为这必须像它一样,因为它在服务器上是无状态的。状态必须在某个地方,并且在URL中。然后,服务器将对请求中提供的信息做出反应,实际的URL是请求的一部分。然后服务器将向客户端返回一些内容,然后客户端又包含所有需要的状态,以便客户端可以再次发出有用的请求,将其全部放入URL中。