设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Netty 实战:如何编写一个麻小俱全的 Web 框架(3)

发布时间:2019-02-20 08:16 所属栏目:21 来源:逅弈
导读:写 Cookie 和读 Cookie 面临着一样的问题,就是写的时候需要借助于 HttpResponse,将 Cookie 写入 HttpResponse 的 Header 中去,但是用户执行写 Cookie 操作的时候,根本就不关心 HttpResponse,甚至他在写的时候

写 Cookie 和读 Cookie 面临着一样的问题,就是写的时候需要借助于 HttpResponse,将 Cookie 写入 HttpResponse 的 Header 中去,但是用户执行写 Cookie 操作的时候,根本就不关心 HttpResponse,甚至他在写的时候,还没有 HttpResponse。

这时的做法也是将需要写到 HttpResponse 中的 Cookie 保存在 ThreadLocal 中,然后在最后通过 channel 写响应之前,将 Cookie 拿出来塞到 HttpResponse 中去即可,如下列代码所示:

  1. @Override 
  2. public void setCookie(Cookie cookie) { 
  3.     TemporaryDataHolder.storeCookie(cookie); 
  4.  
  5. /** 
  6.  * 响应消息 
  7.  */ 
  8. private void writeResponse(){ 
  9.     boolean close = isClose(); 
  10.     response.headers().add(HttpHeaderNames.CONTENT_LENGTH, String.valueOf(response.content().readableBytes())); 
  11.     // 从ThreadLocal中取出待写入的cookie 
  12.     Set<Cookie> cookies = TemporaryDataHolder.loadCookies(); 
  13.     if(!CollectionUtil.isEmpty(cookies)){ 
  14.         for(Cookie cookie : cookies){ 
  15.             // 将cookie写入response中 
  16.             response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode(cookie)); 
  17.         } 
  18.     } 
  19.     ChannelFuture future = channel.write(response); 
  20.     if(close){ 
  21.         future.addListener(ChannelFutureListener.CLOSE); 
  22.     } 

拦截器

拦截器是一个框架很重要的功能,通过拦截器可以实现一些通用的工作,比如登录鉴权,事务处理等等。记得在 Servlet 的年代,拦截器是非常重要的一个功能,基本上每个系统都会在 web.xml 中配置很多的拦截器。

拦截器的基本思想是,通过一连串的类去执行某个拦截的操作,一旦某个类中的拦截操作返回了 false,那就终止后面的所有流程,直接返回。

这种场景非常适合用责任链模式去实现,而 Netty 的 pipeline 本身就是一个责任链模式的应用,所以我们就可以通过 pipeline 来实现我们的拦截器。这里我定义了两种类型的拦截器:前置拦截器和后置拦截器。

前置拦截器是在处理用户的业务逻辑之前的一个拦截操作,如果该操作返回了 false 则直接 return,不会继续执行用户的业务逻辑。

后置拦截器就有点不同了,后置拦截器主要就是处理一些后续的操作,因为后置拦截器再跟前置拦截器一样,当操作返回了 false 直接 return 的话,已经没有意义了,因为业务逻辑已经执行完了。

理解清楚了具体的逻辑之后,实现起来就很简单了,如下列代码所示:

前置拦截器

Netty 实战:如何编写一个麻小俱全的 Web 框架

后置拦截器

Netty 实战:如何编写一个麻小俱全的 Web 框架

有了实现之后,我们需要把他们加到 pipeline 中合适的位置,让他们在整个责任链中生效,如下图所示:

Netty 实战:如何编写一个麻小俱全的 Web 框架

指定拦截器的执行顺序

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读