From 3b54484832df6e1fba0229689552dda3a1706f5a Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 11 May 2017 14:56:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E9=80=A0HttpBaseServlet=20=E7=9A=84pr?= =?UTF-8?q?eExecute=20=E5=92=8C=20authenticate=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/net/Response.java | 18 +++++++++++ src/org/redkale/net/http/HttpBaseServlet.java | 30 +++++++++++++++---- src/org/redkale/net/http/HttpResponse.java | 10 +++++++ 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/org/redkale/net/Response.java b/src/org/redkale/net/Response.java index 7504b2ede..bfd754735 100644 --- a/src/org/redkale/net/Response.java +++ b/src/org/redkale/net/Response.java @@ -5,6 +5,7 @@ */ package org.redkale.net; +import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; import java.util.function.BiConsumer; @@ -34,6 +35,8 @@ public abstract class Response> { protected BiConsumer> recycleListener; + protected Servlet nextServlet; + private final CompletionHandler finishHandler = new CompletionHandler() { @Override @@ -114,6 +117,7 @@ public abstract class Response> { recycleListener = null; } this.output = null; + this.nextServlet = null; request.recycle(); if (channel != null) { if (keepAlive) { @@ -140,6 +144,20 @@ public abstract class Response> { this.request.createtime = System.currentTimeMillis(); } + @SuppressWarnings("unchecked") + protected void nextEvent(S nextServlet) { + this.nextServlet = nextServlet; + } + + @SuppressWarnings("unchecked") + protected void nextEvent() throws IOException { + if (this.nextServlet != null) { + Servlet s = this.nextServlet; + this.nextServlet = null; + s.execute(request, this); + } + } + public void setRecycleListener(BiConsumer> recycleListener) { this.recycleListener = recycleListener; } diff --git a/src/org/redkale/net/http/HttpBaseServlet.java b/src/org/redkale/net/http/HttpBaseServlet.java index 8247ffe88..871631d48 100644 --- a/src/org/redkale/net/http/HttpBaseServlet.java +++ b/src/org/redkale/net/http/HttpBaseServlet.java @@ -215,6 +215,7 @@ public abstract class HttpBaseServlet extends HttpServlet { if (entry.ignore) { authSuccessServlet.execute(request, response); } else { + response.nextEvent(authSuccessServlet); authenticate(entry.moduleid, entry.actionid, request, response, authSuccessServlet); } return; @@ -224,29 +225,43 @@ public abstract class HttpBaseServlet extends HttpServlet { } }; + /** + * 使用 public void preExecute(HttpRequest request, HttpResponse response) throws IOException 代替 + * + * @param request HttpRequest + * @param response HttpResponse + * @param next HttpServlet + * + * @deprecated + * + * @throws IOException IOException + */ + @Deprecated + public void preExecute(HttpRequest request, HttpResponse response, final HttpServlet next) throws IOException { + } + /** *

* 预执行方法,在execute方法之前运行,通常用于常规统计或基础检测,例如 :
*

      *      @Override
-     *      public void preExecute(final HttpRequest request, final HttpResponse response, HttpServlet next) throws IOException {
+     *      public void preExecute(final HttpRequest request, final HttpResponse response) throws IOException {
      *          if (finer) response.setRecycleListener((req, resp) -> {  //记录处理时间比较长的请求
      *              long e = System.currentTimeMillis() - ((HttpRequest) req).getCreatetime();
      *              if (e > 200) logger.finer("http-execute-cost-time: " + e + " ms. request = " + req);
      *          });
-     *          next.execute(request, response);
+     *          response.nextEvent();
      *      }
      * 
*

* * @param request HttpRequest * @param response HttpResponse - * @param next HttpServlet * * @throws IOException IOException */ - public void preExecute(HttpRequest request, HttpResponse response, final HttpServlet next) throws IOException { - next.execute(request, response); + public void preExecute(HttpRequest request, HttpResponse response) throws IOException { + response.nextEvent(); } /** @@ -298,7 +313,10 @@ public abstract class HttpBaseServlet extends HttpServlet { @Override public final void execute(HttpRequest request, HttpResponse response) throws IOException { - preExecute(request, response, preSuccessServlet); + response.nextEvent(preSuccessServlet); + preExecute(request, response); + //兼容以前 + //preExecute(request, response, preSuccessServlet); } public final void preInit(HttpContext context, AnyValue config) { diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index a6a4f532f..ed0675a3f 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -158,6 +158,16 @@ public class HttpResponse extends Response { super.init(channel); } + @Override + protected void nextEvent(S nextServlet) { + super.nextEvent(nextServlet); + } + + @Override + public void nextEvent() throws IOException { + super.nextEvent(); + } + /** * 获取状态码对应的状态描述 *