标签: ring

如何阻止外部http请求?(确保AJAX通话)

我想使用post来更新数据库并且不希望人们手动执行它,也就是说,它应该只能通过客户端中的AJAX来实现.在这种情况下是否有一些众所周知的加密技巧?

假设我发出一个GET请求,将新用户插入我的数据库中site.com/adduser/<userid>.有人可能通过发出虚假请求来过多填充我的数据库.

security ajax http ring

6
推荐指数
1
解决办法
4876
查看次数

部署后在ring/compjure应用程序启动时执行功能

可能重复:
如何在环项目中运行任意启动功能?

我正在使用clojure环中间件,使用compojure来构建一个简单的api.我经常将应用程序部署为战争.

这很好用,但我正在寻找在应用启动时运行一次初始化代码的方法.当我运行"lein ring server"时它运行得很好 - 但是,当部署为战争时,它似乎只在第一个请求命中服务器时运行(即懒惰).有没有办法让它不是懒惰(不使用AOT) - 或者是否有更好的方法来挂钩环中间件生命周期?

clojure compojure ring

6
推荐指数
1
解决办法
1438
查看次数

Clojure环wrap -json-params弄乱了JSON数组

我目前正在使用clojure中的一些REST API,我正在使用带有compojure的ring.middleware.format库来将jSON转换为clojure数据结构.

我遇到了一个很大的问题,因为发布到环形应用程序的JSON会将所有数组替换为数组中的第一个项目.IE它将把这个JSON发布到它

{
    "buyer":"Test Name",
    "items":[
        {"qty":1,"size":"S","product":"Red T-Shirt"},
        {"qty":1,"size":"M","product":"Green T-Shirt"}
    ],
    "address":"123 Fake St",
    "shipping":"express"
}
Run Code Online (Sandbox Code Playgroud)

对此

{
    "buyer": "Test Name",
    "items": {
        "qty": 1,
        "size": "M",
        "product": "Green T-Shirt"
    },
    "address": "123 Fake St",
    "shipping": "express"
}
Run Code Online (Sandbox Code Playgroud)

它适用于任何数组,包括数组是根元素时.

我在clojure中使用以下代码来返回json:

(defroutes app-routes
  (GET "/"
       []
       {:body test-data})
  (POST "/"
        {data :params}
        {:body data}))
        ;{:body (str "Printing " (count (data :jobs)) " jobs")}))

(def app
  (-> (handler/api app-routes)
      (wrap-json-params)
      (wrap-json-response)))
Run Code Online (Sandbox Code Playgroud)

GET路由没有正确的数组和输出问题,因此它必须是我获取数据或wrap-restful-params中间件的方式.

有任何想法吗?

clojure compojure ring

6
推荐指数
1
解决办法
2522
查看次数

如何在Ring-Compojure应用程序上设置Content-Type标头

我正在尝试通过实现一个简单的Web应用程序开始使用Clojure和Clojurescript.到目前为止事情进展顺利,从不同的教程中读到我提出的代码如下:

core.clj:

(ns myapp.core
(:require [compojure.core :as compojure]
          [compojure.handler :as handler]
          [compojure.route :as route]
          [myapp.controller :as controller]))

(compojure/defroutes app-routes
  (compojure/GET "/" [] controller/index)
  (route/resources "/public")
  (route/not-found "Not Found"))

(def app
  (handler/site app-routes))
Run Code Online (Sandbox Code Playgroud)

controller.clj:

(ns myapp.controller
  (:use ring.util.response)
  (:require [myapp.models :as model]
            [myapp.templates :as template]))

(defn index
  "Index page handler"
  [req]
  (->> (template/home-page (model/get-things)) response))
Run Code Online (Sandbox Code Playgroud)

templates.clj:

(ns myapp.templates
  (:use net.cgrand.enlive-html)
  (:require [myapp.models :as model]))


(deftemplate home-page "index.html" [things]
  [:li] (clone-for [thing things] (do->
                                   (set-attr 'data-id (:id thing))
                                   (content (:name thing)))))
Run Code Online (Sandbox Code Playgroud)

问题是我无法在页面上显示非ascii字符,我不知道如何在页面上设置HTTP标头. …

clojure compojure ring http-headers

6
推荐指数
1
解决办法
5233
查看次数

defn定义的clojure函数的attr-map是什么?

作为一个clojure初学者,我正在阅读clojure代码,让自己熟悉Clojure的语法.下面的代码片段是Ring项目中的一个函数

(defn- request-context
"Create an UploadContext object from a request map."
{:tag UploadContext}
[request encoding]
(reify UploadContext
(getContentType [this]       (get-in request [:headers "content-type"]))
(getContentLength [this]     (or (req/content-length request) -1))
(contentLength [this]        (or (req/content-length request) -1))
(getCharacterEncoding [this] encoding)
(getInputStream [this]       (:body request))))
Run Code Online (Sandbox Code Playgroud)

我不清楚的是这条线

{:tag UploadContext}
Run Code Online (Sandbox Code Playgroud)

如果审查一个clojure函数的定义

(defn function-name doc-string? attr-map? [parameter-list]
conditions-map?
(expressions))
Run Code Online (Sandbox Code Playgroud)

我猜(但不确定)地图应该是"attr-map?".但什么是"attr-map?"?我google了,找不到好的解释.

任何引入"attr-map"的例子或链接?将不胜感激.我也想知道如何在我粘贴的代码中使用attr-map.

clojure ring

6
推荐指数
1
解决办法
854
查看次数

为什么ring的资源响应会响应application/octet-stream内容类型?

我想弄清楚Ring为什么resource-response选择回复application/octet-stream内容类型.我最近更新了一些我一直在学习的示例代码,以便它使用更新的代码ring-defaults.在使用之前ring-defaults,此代码使用html内容类型进行响应.为什么现在选择八位字节流?

(ns replays.handler
  (:require [compojure.core :refer [GET defroutes]]
            [compojure.route :as route]
            [ring.util.response :refer [response resource-response]]
            [ring.middleware.json :as middleware]
            [ring.middleware.defaults :refer [wrap-defaults api-defaults]]))

(defroutes app-routes
  (GET  "/" [] (resource-response "index.html" {:root "public"}))
  (GET  "/widgets" [] (response [{:name "Widget 1"} {:name "Widget 2"}]))
  (route/resources "/public")
  (route/not-found "not found"))

(def app
  (-> app-routes
      (middleware/wrap-json-body)
      (middleware/wrap-json-response)
      (wrap-defaults api-defaults)))
Run Code Online (Sandbox Code Playgroud)

而且,对于版本号,这是项目文件......

(defproject replays "0.1.0-SNAPSHOT"

  :url "http://example.com/FIXME"
  :description "FIXME: write description"

  :plugins [[lein-pdo "0.1.1"]
            [lein-ring "0.9.3"]
            [lein-cljsbuild …
Run Code Online (Sandbox Code Playgroud)

clojure compojure ring

6
推荐指数
1
解决办法
1978
查看次数

使用防伪和环模拟测试POST路由

我想用一个简单的POST请求编写测试ring.mock- 如下所示:

(testing "id post route"
    (let [response (app (mock/request :post "/" {:id "Foo"}))]
      (is (= 302 (:status response)))))
Run Code Online (Sandbox Code Playgroud)

但是,由于我使用wrap-csrf中间件,因此我得到403状态响应,因为我没有提供防伪令牌.

有没有办法在ring.mock不禁用wrap-csrf中间件的情况下编写POST测试?

testing clojure mocking csrf ring

6
推荐指数
2
解决办法
860
查看次数

Clojure用ring-json编码Joda DateTime

使用以下应用程序:

; src/webapp/core.clj
(ns webapp.core
  (:require [compojure.core :refer [defroutes GET]]
            [ring.middleware.json :as mid-json]
            [clj-time.jdbc]))

(defn foo [request]
  {:body {:now (org.joda.time.DateTime/now)}})

(defroutes routes
  (GET "/foo" [] foo))

(def app
  (-> routes
      (mid-json/wrap-json-response)))
Run Code Online (Sandbox Code Playgroud)

点击/ foo端点给我这个错误:

com.fasterxml.jackson.core.JsonGenerationException:JSON不能编码类的对象:class org.joda.time.DateTime:2017-10-21T03:38:16.207Z

是否有一种简单的方法可以让ring-json对DateTime对象进行编码?我是否必须编写自己的中间件才能将其转换为例如字符串?如果是这样,我该怎么做?(我以前从未写过环中间件).

我的project.clj有这些依赖项FYI:

[[org.clojure/clojure "1.8.0"]
 [org.clojure/java.jdbc "0.6.1"]
 [ring/ring-jetty-adapter "1.4.0"]
 [compojure "1.4.0"]
 [ring/ring-json "0.4.0"]
 [clj-time "0.14.0"]]
Run Code Online (Sandbox Code Playgroud)

json clojure jodatime ring

6
推荐指数
1
解决办法
635
查看次数

如何在 Compojure 中使用 CORS 和 JSON 响应?

我正在创建一个简单的 API,它将JSON数据返回给用户。出于开发目的,我想启用 CORS,以便我的react前端可以在本地调用 API。目前,它抱怨

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问Origin ' http://localhost:3001 '。

问题:如何使用ring-cors(或类似的东西)来启用 CORS 并发回 JSON 数据?

观察:对于当前(app ..)(wrap-cors ...)没有提供交叉原点标题。

我已经尝试了几种不同的顺序,但似乎都不起作用。例如,(wrap cors ...)跟随(wrap-defaults ...)不起作用。

移动电源

(ns qitab-api.handler
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [ring.middleware.defaults :refer [wrap-defaults site-defaults]]
            [ring.middleware.json :refer [wrap-json-response wrap-json-body]]
            [ring.middleware.cors :refer [wrap-cors]]
            [ring.util.response :as r]))

(defroutes app-routes
   (GET "/" []
     (r/response {:hello "World!!"}))
   (route/not-found "Not Found"))

(def app
  (-> app-routes
      wrap-json-body
      wrap-json-response
     (wrap-defaults site-defaults)
     (wrap-cors …
Run Code Online (Sandbox Code Playgroud)

clojure compojure ring cors

6
推荐指数
1
解决办法
1682
查看次数

如何在特定的reitit路由上应用环防伪?

在包装使用metosin/reitit 创建的特定路由时,我不断收到“无效的防伪令牌” reitit.ring/ring-router。我也试过 reitit 的中间件 registry,但它也不起作用。虽然我可以用wrap-sessionand包装整个处理程序wrap-anti-forgery,但这会破坏 reitit 在允许特定于路由的中间件方面的优势。

(ns t.core

 (:require [immutant.web :as web]
           [reitit.ring :as ring]
           [ring.middleware.anti-forgery :refer [wrap-anti-forgery]]
           [ring.middleware.content-type :refer [wrap-content-type]]
           [ring.middleware.params :refer [wrap-params]]
           [ring.middleware.keyword-params :refer [wrap-keyword-params]]
           [ring.middleware.session :refer [wrap-session]]
           [ring.util.anti-forgery :refer [anti-forgery-field]]
           [ring.util.response :as res]))


(defn render-index [_req]
 (res/response (str "<form action='/sign-in' method='post'>"
                    (anti-forgery-field)
                    "<button>Sign In</button></form>")))

(defn sign-in [{:keys [params session]}]
 (println "params: " params
          "session:" session)
 (res/redirect "/index.html"))

(defn wrap-af [handler]
 (-> handler
     wrap-anti-forgery
     wrap-session
     wrap-keyword-params
     wrap-params))

(def …
Run Code Online (Sandbox Code Playgroud)

clojure ring

6
推荐指数
1
解决办法
536
查看次数

标签 统计

ring ×10

clojure ×9

compojure ×5

ajax ×1

cors ×1

csrf ×1

http ×1

http-headers ×1

jodatime ×1

json ×1

mocking ×1

security ×1

testing ×1