为什么我的Racket无状态servlet在每个嵌入式URL中显示如此多的信息?

时间:2016-04-21 10:54:56

标签: servlets racket

我一直关注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 dispatchHow to show different content based on the path in Racket web servlets?)显示了解决问题的不同方法,我可能会尝试,但我仍然想知道这个传递的URL是否是设计的,并且Racket中的无状态servlet是否通常以这种方式工作(或者我犯了一个错误)。

1 个答案:

答案 0 :(得分:1)

我认为这必须像它一样,因为它在服务器上是无状态的。状态必须在某个地方,并且在URL中。然后,服务器将对请求中提供的信息做出反应,实际的URL是请求的一部分。然后服务器将向客户端返回一些内容,然后客户端又包含所有需要的状态,以便客户端可以再次发出有用的请求,将其全部放入URL中。