clojure ring 让webapp变得毫无神秘感

首先要说明的是:clojure ring不是新思想,根据其git首页的描述,是从Python‘s WSGI and Ruby‘s Rack获得思想。最近写了几星期的clojure代码,觉得clojure ring实在是太简单了(这是褒义),所以忍不住介绍一下。

先看一下SPEC:https://github.com/ring-clojure/ring/blob/master/SPEC

总结起来就是一句话:你收到一个map,返回一个map,你的Handler就做这件事情。

那么中间件呢?就是包裹一下handler,在handler之前做点事,在handler之后做点事。

下面是假象的handler代码:

;request比如 {:uri / :query-string "a=1"}

(defn ahandler [request]
    {:status 200 :body "hello"}
)

中间件(相当于java的filter类似)

(defn amiddleware [handler]
    (fn [request]
        (let [new-request (dosomething request)
              response (handler new-request)]
              ;如果要对response处理一下,就在这里处理。
       )))

中间件的作用这里就举上面的例子,如果最终handler直接用query-string总归不太方便,那么可以在中间件里面用它产生一个新的key,比如paras,而paras是一个map,这样可以直接用(:a paras)获取a的值。当然ring是定义基础的约定,在它的上面就是形形色色的框架了。

不过写这篇短博客的主要目的还是为了提醒自己不要和自己已知的java相混淆。

clojure和java的习惯差异很大,在java的世界里,当你获得一个Request(Response)对象,你把它传给其他类去加工,不管经过几个步骤,你的Request还是原来的Request,你的Response还是原来的Response,只不过内容变化而已。

clojure是不可变为主,所以它的request和response是每经过一个步骤都是新的。

(defn shiro-body
  [handler request]
  (let [subject (build-subject request)
        session-before (.getSession subject false)
        response (.execute (build-callable))
        session-after (.getSession (sec-util/get-subject))]
    (if (and (not session-before) session-after)
      (assoc-in response [:cookies :JSESSIONID] (create-cookie (.getId session-after)))
      (if (and (session-before) (not session-after))
        (assoc-in response [:cookies :JSESSIONID] (create-cookie (.getId session-after) :http-only false :max-age 0))
        response))))

上面的代码是我集成ring和apache shiro的一个middleware,刚开始的时候老是觉得修改了response,返回response即可。但是clojure的规则不是这样。

(let [response {:status 200 :body "hello"}]
    (assoc-in response [:cookies :JSESSIONID] "xxxooo")
    response))
;这里就误会了,总是觉得response已经修改了,其实 (assoc-in response [:cookies :JSESSIONID] "xxxooo") 才是新的response。不要在最后加response!

;这样即可。
(let [response {:status 200 :body "hello"}]
    (assoc-in response [:cookies :JSESSIONID] "xxxooo"))

上面shiro-body的流程就是:

1、如果进来的时候subject没有session,出去的时候有了,说明经过了session操作,或者登录了,需要在cookie里面加上sessionid。

2、如果进来的时候subject有session,出去的时候没有了,说明session失效了,或者登出了,需要删除cookie

3、如果进来出去都没有,或者都有,就不作为。

时间: 2024-08-14 19:14:52

clojure ring 让webapp变得毫无神秘感的相关文章

[阮一峰]在软件开发中,一旦这些技术被取代,你的知识将变得毫无价值,因为它们大部分都是实施的细节。

原文:http://www.ruanyifeng.com/blog/2018/10/weekly-issue-28.html 在软件开发中,技术变化如此之快,你花费了大量时间学习技术和工具,一旦这些技术被取代,你的知识将变得毫无价值,因为它们大部分都是实施的细节. 我最近总是在想这段话,软件开发算不算是真正的知识? 如果它是一种真正的知识,那么理论上,我们学到的东西大部分应该不会过时,就好像微积分不会过时一样.可是实际上,我们都知道,软件开发技能有时效性,十年前学习的编程知识,十年后几乎肯定不能

有理想的程序员必须知道的15件事

作为程序员,要取得非凡成就需要记住的15件事. 1.走一条不一样的路 在有利于自己的市场中竞争,如果你满足于"泯然众人矣",那恐怕就得跟那些低工资国家的程序员们同场竞技了. 2.了解自己的公司 以我在医院.咨询公司.物流企业以及大技术公司工作的经验来看,这一点所言不虚. 不同公司的运营模式差异极大.如果你理解企业的运营模式,那你就不一样了!在这家公司中(或者对客户而言),你是参与业务运营的资产,你的工作能直接产生效益! 3.与最优秀的人为伍 很早以前,我喜欢打篮球,被分配到一个水平比较

转载:15件事造就有理想的程序员

1.走一条不一样的路 在有利于自己的市场中竞争,如果你满足于“泯然众人矣”,那恐怕就得跟那些低工资国家的程序员们同场竞技了. 2.了解自己的公司 以我在医院.咨询公司.物流企业以及大技术公司工作的经验来看,这一点所言不虚. 不同公司的运营模式差异极大.如果你理解企业的运营模式,那你就不一样了!在这家公司中(或者对客户而言),你是参与业务运营的资产,你的工作能直接产生效益! 3.与最优秀的人为伍 很早以前,我喜欢打篮球,被分配到一个水平比较高的队里.一开始适应的确很困难,但环境的压力越大(重大比赛

程序员应该知道的15件事 在生活与工作中用他们来警惕自己

http://www.nowamagic.net/librarys/veda/detail/2313作为程序员,要取得非凡成就需要记住的15件事.这些道理也许都很浅显,但是你需要在生活与工作中用他们来警惕自己. 走一条不一样的路.在有利于自己的市场中竞争,如果你满足于“泯然众人矣”,那恐怕就得跟那些低工资国家的程序员们同场竞技了. 了解自己的公司.以我在医院.咨询公司.物流企业以及大技术公司工作的经验来看,这一点所言不虚. 不同公司的运营模式差异极大.如果你理解企业的运营模式,那你就不一样了!在

深入了解MVC(转)

MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性.可移植性,代码的可重用性. MVC即Model.View.Controller即模型.视图.控制器.我在和同行讨论技术,阅读别人的代码时发现,很多程序员倾向于将软件的业务逻辑放在Controller里,将数据库访问操作的代码放在Model里. 最终软件(网站)的代码结构是,View层是界面,Controller层是业

快节奏多人在线游戏网络入门系列教程(3):实体插值

简介 在第一篇文章中,我们介绍了权威服务器的概念和其防作弊的能力.然而,该框架简单的实现会导致一系列糟糕的响应性和可玩性.在第二篇文章中,我们介绍了客户端预测与服务器协调技术来克服这些缺点. 这两篇文章使用的技术使得单一玩家在在网络游戏上能够获取和单机游戏一样的游戏体验,即使在因特网具有一定延迟的情况下. 本文,我们将讨论多个玩家连接同一个权威服务器的情况. 服务器时间步长 上一篇文章中服务器的行为非常简单--读取客户端输入,更新游戏状态,返回给客户端.然而当有多个客户端存在的情况下,服务器的主

忆鲁迅《故乡》中的一句话

当年读鲁迅小说<故乡>的时候,对最后一段话一直似懂非懂,只是觉得颇有道理,却说不出个所以然: "我想,希望本是无所谓有,无所谓无的.这正如地上的路:其实地上本没有路,走的人多了,也便成了路." 为什么成功学.鸡汤文害人?我以前也没想明白,现在懂了:错不在动机,动机原本是好的,不过是想激励人前进罢了.错在方法上,错在试图拿别人的成功制造自己的满足,这无异于饮鸩止渴,一个人浸淫其中日久,只会变得毫无行动力,成为整天念叨远大理想的犬儒主义者,惭愧地说,我本人就是其中一员.但我们不

css预处理语言的模块化实践

编写css是前端工作中,一项普通而又频繁的劳动,由于css并不是一门语言,所以在程序设计上显得有些简陋.对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目,那就需要对css进行管理和规范了,否则会发生不可挽回的后果(吓唬谁呢??). 背景上一节[从css谈模块化]我们通过规范的约束,将css的编写方式进行了优化和改进,形成一种可持续发展的路线.但还是遗留了一些问题:冗余.虽然我们通过定义公共模块和私有模块,来委婉地分担common的体积,但commo

Atitit&#160;.c#的未来新特性计划草案

Atitit .c#的未来新特性计划草案 1. C#的未来:追踪空引用1 1.1. 2. 变量命名空间1 1.2. 10. 项目引用Native dll2 1.3. 10. 项目引用Native dll2 2. 三.设计面向 面向变量的汇编语言,高级语言出现后,从Pascal/C语言面向过程和变量,到C++以后的面向对象2 2.1. 1. 面向集合3 2.2. 2. 面向并发3 2.3. 3. 面向任务(异步3 3. 参考3 1. C#的未来:追踪空引用 olang 都体现了新一代编程语言的设计