From 7f270eb9d7f3525706eb1d0ca0973bc3cd3bcdbd Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Fri, 17 Mar 2017 20:04:09 +0800 Subject: [PATCH] --- src/org/redkale/net/http/HttpBaseServlet.java | 103 +++++++++++++----- src/org/redkale/net/http/HttpRequest.java | 4 + .../redkale/test/rest/SimpleRestServlet.java | 9 +- 3 files changed, 85 insertions(+), 31 deletions(-) diff --git a/src/org/redkale/net/http/HttpBaseServlet.java b/src/org/redkale/net/http/HttpBaseServlet.java index f6a4e47f0..60f6ad535 100644 --- a/src/org/redkale/net/http/HttpBaseServlet.java +++ b/src/org/redkale/net/http/HttpBaseServlet.java @@ -183,37 +183,69 @@ public abstract class HttpBaseServlet extends HttpServlet { private Map.Entry[] mappings; + private final HttpServlet authSuccessServlet = new HttpServlet() { + @Override + public void execute(HttpRequest request, HttpResponse response) throws IOException { + Entry entry = (Entry) request.attachment; + if (entry.cacheseconds > 0) {//有缓存设置 + CacheEntry ce = entry.cache.get(request.getRequestURI()); + if (ce != null && ce.time + entry.cacheseconds > System.currentTimeMillis()) { //缓存有效 + response.setStatus(ce.status); + response.setContentType(ce.contentType); + response.finish(ce.getBuffers()); + return; + } + response.setBufferHandler(entry.cacheHandler); + } + entry.servlet.execute(request, response); + } + }; + + private final HttpServlet preSuccessServlet = new HttpServlet() { + @Override + public void execute(HttpRequest request, HttpResponse response) throws IOException { + for (Map.Entry en : mappings) { + if (request.getRequestURI().startsWith(en.getKey())) { + Entry entry = en.getValue(); + if (!entry.checkMethod(request.getMethod())) { + response.finishJson(new RetResult(RET_METHOD_ERROR, "Method(" + request.getMethod() + ") Error")); + return; + } + request.attachment = entry; + if (entry.ignore) { + authSuccessServlet.execute(request, response); + } else { + authenticate(entry.moduleid, entry.actionid, request, response, authSuccessServlet); + } + return; + } + } + throw new IOException(this.getClass().getName() + " not found method for URI(" + request.getRequestURI() + ")"); + } + }; + + /** + * 使用 public void preExecute(HttpRequest request, HttpResponse response, final HttpServlet next) throws IOException 方法代替 + * + * @param request HttpRequest + * @param response HttpResponse + * + * @return boolean + * @throws IOException + * @deprecated + */ + @Deprecated public boolean preExecute(HttpRequest request, HttpResponse response) throws IOException { return true; } + public void preExecute(HttpRequest request, HttpResponse response, final HttpServlet next) throws IOException { + if (preExecute(request, response)) next.execute(request, response); + } + @Override public final void execute(HttpRequest request, HttpResponse response) throws IOException { - if (!preExecute(request, response)) return; - for (Map.Entry en : mappings) { - if (request.getRequestURI().startsWith(en.getKey())) { - Entry entry = en.getValue(); - if (!entry.checkMethod(request.getMethod())) { - response.finishJson(new RetResult(RET_METHOD_ERROR, "Method(" + request.getMethod() + ") Error")); - return; - } - if (entry.ignore || authenticate(entry.moduleid, entry.actionid, request, response)) { - if (entry.cacheseconds > 0) {//有缓存设置 - CacheEntry ce = entry.cache.get(request.getRequestURI()); - if (ce != null && ce.time + entry.cacheseconds > System.currentTimeMillis()) { //缓存有效 - response.setStatus(ce.status); - response.setContentType(ce.contentType); - response.finish(ce.getBuffers()); - return; - } - response.setBufferHandler(entry.cacheHandler); - } - entry.servlet.execute(request, response); - } - return; - } - } - throw new IOException(this.getClass().getName() + " not found method for URI(" + request.getRequestURI() + ")"); + preExecute(request, response, preSuccessServlet); } public final void preInit(HttpContext context, AnyValue config) { @@ -233,7 +265,26 @@ public abstract class HttpBaseServlet extends HttpServlet { public final void postDestroy(HttpContext context, AnyValue config) { } - public abstract boolean authenticate(int moduleid, int actionid, HttpRequest request, HttpResponse response) throws IOException; + /** + * 使用 public void authenticate(int moduleid, int actionid, HttpRequest request, HttpResponse response, final HttpServlet next) throws IOException 代替 + * + * @param moduleid moduleid + * @param actionid actionid + * @param request HttpRequest + * @param response HttpResponse + * + * @return boolean + * @throws IOException + * @deprecated + */ + @Deprecated + public boolean authenticate(int moduleid, int actionid, HttpRequest request, HttpResponse response) throws IOException { + return true; + } + + public void authenticate(int moduleid, int actionid, HttpRequest request, HttpResponse response, final HttpServlet next) throws IOException { + if (authenticate(moduleid, actionid, request, response)) next.execute(request, response); + } protected void setHeader(HttpRequest request, String name, Serializable value) { request.header.setValue(name, String.valueOf(value)); diff --git a/src/org/redkale/net/http/HttpRequest.java b/src/org/redkale/net/http/HttpRequest.java index 5ab83aee9..b7231ea81 100644 --- a/src/org/redkale/net/http/HttpRequest.java +++ b/src/org/redkale/net/http/HttpRequest.java @@ -66,6 +66,8 @@ public class HttpRequest extends Request { private final String remoteAddrHeader; + Object attachment; //供 HttpBaseServlet传递Entry使用 + public HttpRequest(HttpContext context, String remoteAddrHeader) { super(context); this.remoteAddrHeader = remoteAddrHeader; @@ -336,6 +338,8 @@ public class HttpRequest extends Request { this.boundary = false; this.bodyparsed = false; + this.attachment = null; + this.header.clear(); this.params.clear(); this.array.clear(); diff --git a/test/org/redkale/test/rest/SimpleRestServlet.java b/test/org/redkale/test/rest/SimpleRestServlet.java index 4bf7c735e..c21149a72 100644 --- a/test/org/redkale/test/rest/SimpleRestServlet.java +++ b/test/org/redkale/test/rest/SimpleRestServlet.java @@ -6,7 +6,6 @@ import javax.annotation.Resource; import org.redkale.net.http.*; import org.redkale.service.RetResult; - public class SimpleRestServlet extends RestHttpServlet { protected static final RetResult RET_UNLOGIN = RetCodes.retResult(RetCodes.RET_USER_UNLOGIN); @@ -26,16 +25,16 @@ public class SimpleRestServlet extends RestHttpServlet { //普通鉴权 @Override - public boolean authenticate(int module, int actionid, HttpRequest request, HttpResponse response) throws IOException { + public void authenticate(int module, int actionid, HttpRequest request, HttpResponse response, HttpServlet next) throws IOException { UserInfo info = currentUser(request); if (info == null) { response.finishJson(RET_UNLOGIN); - return false; + return; } else if (!info.checkAuth(module, actionid)) { response.finishJson(RET_AUTHILLEGAL); - return false; + return; } - return true; + next.execute(request, response); } }