改造HttpBaseServlet 的preExecute 和 authenticate 方法

This commit is contained in:
Redkale
2017-05-11 14:56:48 +08:00
parent fa2513d934
commit 3b54484832
3 changed files with 52 additions and 6 deletions

View File

@@ -5,6 +5,7 @@
*/ */
package org.redkale.net; package org.redkale.net;
import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.CompletionHandler; import java.nio.channels.CompletionHandler;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@@ -34,6 +35,8 @@ public abstract class Response<C extends Context, R extends Request<C>> {
protected BiConsumer<R, Response<C, R>> recycleListener; protected BiConsumer<R, Response<C, R>> recycleListener;
protected Servlet nextServlet;
private final CompletionHandler finishHandler = new CompletionHandler<Integer, ByteBuffer>() { private final CompletionHandler finishHandler = new CompletionHandler<Integer, ByteBuffer>() {
@Override @Override
@@ -114,6 +117,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
recycleListener = null; recycleListener = null;
} }
this.output = null; this.output = null;
this.nextServlet = null;
request.recycle(); request.recycle();
if (channel != null) { if (channel != null) {
if (keepAlive) { if (keepAlive) {
@@ -140,6 +144,20 @@ public abstract class Response<C extends Context, R extends Request<C>> {
this.request.createtime = System.currentTimeMillis(); this.request.createtime = System.currentTimeMillis();
} }
@SuppressWarnings("unchecked")
protected <S extends Servlet> 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<R, Response<C, R>> recycleListener) { public void setRecycleListener(BiConsumer<R, Response<C, R>> recycleListener) {
this.recycleListener = recycleListener; this.recycleListener = recycleListener;
} }

View File

@@ -215,6 +215,7 @@ public abstract class HttpBaseServlet extends HttpServlet {
if (entry.ignore) { if (entry.ignore) {
authSuccessServlet.execute(request, response); authSuccessServlet.execute(request, response);
} else { } else {
response.nextEvent(authSuccessServlet);
authenticate(entry.moduleid, entry.actionid, request, response, authSuccessServlet); authenticate(entry.moduleid, entry.actionid, request, response, authSuccessServlet);
} }
return; 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 {
}
/** /**
* <p> * <p>
* 预执行方法在execute方法之前运行通常用于常规统计或基础检测例如 : <br> * 预执行方法在execute方法之前运行通常用于常规统计或基础检测例如 : <br>
* <blockquote><pre> * <blockquote><pre>
* &#64;Override * &#64;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) -&#62; { //记录处理时间比较长的请求 * if (finer) response.setRecycleListener((req, resp) -&#62; { //记录处理时间比较长的请求
* long e = System.currentTimeMillis() - ((HttpRequest) req).getCreatetime(); * long e = System.currentTimeMillis() - ((HttpRequest) req).getCreatetime();
* if (e &#62; 200) logger.finer("http-execute-cost-time: " + e + " ms. request = " + req); * if (e &#62; 200) logger.finer("http-execute-cost-time: " + e + " ms. request = " + req);
* }); * });
* next.execute(request, response); * response.nextEvent();
* } * }
* </pre></blockquote> * </pre></blockquote>
* <p> * <p>
* *
* @param request HttpRequest * @param request HttpRequest
* @param response HttpResponse * @param response HttpResponse
* @param next HttpServlet
* *
* @throws IOException IOException * @throws IOException IOException
*/ */
public void preExecute(HttpRequest request, HttpResponse response, final HttpServlet next) throws IOException { public void preExecute(HttpRequest request, HttpResponse response) throws IOException {
next.execute(request, response); response.nextEvent();
} }
/** /**
@@ -298,7 +313,10 @@ public abstract class HttpBaseServlet extends HttpServlet {
@Override @Override
public final void execute(HttpRequest request, HttpResponse response) throws IOException { 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) { public final void preInit(HttpContext context, AnyValue config) {

View File

@@ -158,6 +158,16 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
super.init(channel); super.init(channel);
} }
@Override
protected <S extends Servlet> void nextEvent(S nextServlet) {
super.nextEvent(nextServlet);
}
@Override
public void nextEvent() throws IOException {
super.nextEvent();
}
/** /**
* 获取状态码对应的状态描述 * 获取状态码对应的状态描述
* *