clojure - Compojure:陷阱 500 URL 解码错误

标签 clojure illegalargumentexception compojure

我在 Compojure 中有一个 Web 服务,其中一条路由如下所示:

 "/myapp/dosomething/:input"

当 :input 是应用程序处理的正常内容时,这很有效,例如一个单词,一串数字等,但是当输入垃圾时,例如

GET /myapp/dosomething/%25%24%25%5E%24%25%5E%25%24%5E

我收到 500 错误。我的问题是,如何捕获它并返回 400?

 HTTP ERROR 500

 Problem accessing /myapp/dosomething/%25%24%25%5E%24%25%5E%25%24%5E. Reason:

     Server Error
 Caused by:

 java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "$%"
at java.net.URLDecoder.decode(URLDecoder.java:192)
at clout.core$path_decode.invoke(core.clj:33)
at clout.core$path_decode.invoke(core.clj:31)
at clojure.core$map$fn__4207.invoke(core.clj:2485)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:60)
at clojure.lang.RT.seq(RT.java:484)
at clojure.core$seq.invoke(core.clj:133)
at clojure.core$map$fn__4211.invoke(core.clj:2490)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:60)
at clojure.lang.RT.seq(RT.java:484)
at clojure.core$seq.invoke(core.clj:133)
at clojure.core.protocols$seq_reduce.invoke(protocols.clj:30)
at clojure.core.protocols$fn__6026.invoke(protocols.clj:54)
at clojure.core.protocols$fn__5979$G__5974__5992.invoke(protocols.clj:13)
at clojure.core$reduce.invoke(core.clj:6177)
at clout.core$assoc_keys_with_groups.invoke(core.clj:54)
at clout.core.CompiledRoute.route_matches(core.clj:84)
at compojure.core$if_route$fn__472.invoke(core.clj:38)
at compojure.core$if_method$fn__465.invoke(core.clj:24)
at compojure.core$routing$fn__490.invoke(core.clj:106)
at clojure.core$some.invoke(core.clj:2443)
at compojure.core$routing.doInvoke(core.clj:106)
at clojure.lang.RestFn.applyTo(RestFn.java:139)
at clojure.core$apply.invoke(core.clj:619)
at compojure.core$routes$fn__494.invoke(core.clj:111)
at ring.middleware.keyword_params$wrap_keyword_params$fn__710.invoke(keyword_params.clj:27)
at ring.middleware.nested_params$wrap_nested_params$fn__749.invoke(nested_params.clj:65)
at ring.middleware.params$wrap_params$fn__682.invoke(params.clj:55)
at ring.middleware.multipart_params$wrap_multipart_params$fn__777.invoke(multipart_params.clj:103)
at ring.middleware.flash$wrap_flash$fn__1064.invoke(flash.clj:14)
at ring.middleware.session$wrap_session$fn__1055.invoke(session.clj:40)
at ring.middleware.cookies$wrap_cookies$fn__986.invoke(cookies.clj:160)
at vinws_chrome.servlet$_service$fn__116.invoke(servlet.clj:1)
at ring.util.servlet$make_service_method$fn__54.invoke(servlet.clj:145)

最佳答案

此问题出现在由 Lein-Ring 插件生成的 war 文件中,并且最近已根据此报告在 Lein-Ring 0.8.6 中得到修复。

原因与 Java Servlet 和 Ring 处理路径信息字段的方式不同有关。 Java Servlet 规范对上下文路径进行了 url 编码,但对路径信息进行了解码。 Ring 将 :context:path-info 键都视为 url 编码。

关于clojure - Compojure:陷阱 500 URL 解码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17373206/

相关文章:

arrays - Clojure 将字符串替换应用于数组中的每个元素

clojure - Clojure 中箭头宏和双箭头宏的区别

clojure - 如何沙箱 Clojure?

json - 如何在 compojure 处理程序中获取 selflink?

clojure - 为什么我可以在 Clojure 中更改不可变变量?

eclipse - java.lang.IllegalArgumentException : The main resource set specified [. ...\org.eclipse.wst.server.core\tmp0\wtpwebapps\...] 无效

eclipse - java.lang.IllegalArgumentException : Invalid <url-pattern> xmlServletPath in servlet mapping 异常

android-asynctask - ProgressDialog 发生致命异常 : java. lang.IllegalArgumentException

clojure - Ring/Compojure 在子文件夹中提供 index.html?

clojure - 从嵌套 map (和矢量)创建 HTML 表格