This commit is contained in:
Redkale
2017-03-17 20:04:09 +08:00
parent 974a6bfeaa
commit 7f270eb9d7
3 changed files with 85 additions and 31 deletions

View File

@@ -183,21 +183,10 @@ public abstract class HttpBaseServlet extends HttpServlet {
private Map.Entry<String, Entry>[] mappings; private Map.Entry<String, Entry>[] mappings;
public boolean preExecute(HttpRequest request, HttpResponse response) throws IOException { private final HttpServlet authSuccessServlet = new HttpServlet() {
return true;
}
@Override @Override
public final void execute(HttpRequest request, HttpResponse response) throws IOException { public void execute(HttpRequest request, HttpResponse response) throws IOException {
if (!preExecute(request, response)) return; Entry entry = (Entry) request.attachment;
for (Map.Entry<String, 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) {//有缓存设置 if (entry.cacheseconds > 0) {//有缓存设置
CacheEntry ce = entry.cache.get(request.getRequestURI()); CacheEntry ce = entry.cache.get(request.getRequestURI());
if (ce != null && ce.time + entry.cacheseconds > System.currentTimeMillis()) { //缓存有效 if (ce != null && ce.time + entry.cacheseconds > System.currentTimeMillis()) { //缓存有效
@@ -210,11 +199,54 @@ public abstract class HttpBaseServlet extends HttpServlet {
} }
entry.servlet.execute(request, response); entry.servlet.execute(request, response);
} }
};
private final HttpServlet preSuccessServlet = new HttpServlet() {
@Override
public void execute(HttpRequest request, HttpResponse response) throws IOException {
for (Map.Entry<String, 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; return;
} }
} }
throw new IOException(this.getClass().getName() + " not found method for URI(" + request.getRequestURI() + ")"); 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 {
preExecute(request, response, preSuccessServlet);
}
public final void preInit(HttpContext context, AnyValue config) { public final void preInit(HttpContext context, AnyValue config) {
String path = _prefix == null ? "" : _prefix; String path = _prefix == null ? "" : _prefix;
@@ -233,7 +265,26 @@ public abstract class HttpBaseServlet extends HttpServlet {
public final void postDestroy(HttpContext context, AnyValue config) { 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) { protected void setHeader(HttpRequest request, String name, Serializable value) {
request.header.setValue(name, String.valueOf(value)); request.header.setValue(name, String.valueOf(value));

View File

@@ -66,6 +66,8 @@ public class HttpRequest extends Request<HttpContext> {
private final String remoteAddrHeader; private final String remoteAddrHeader;
Object attachment; //供 HttpBaseServlet传递Entry使用
public HttpRequest(HttpContext context, String remoteAddrHeader) { public HttpRequest(HttpContext context, String remoteAddrHeader) {
super(context); super(context);
this.remoteAddrHeader = remoteAddrHeader; this.remoteAddrHeader = remoteAddrHeader;
@@ -336,6 +338,8 @@ public class HttpRequest extends Request<HttpContext> {
this.boundary = false; this.boundary = false;
this.bodyparsed = false; this.bodyparsed = false;
this.attachment = null;
this.header.clear(); this.header.clear();
this.params.clear(); this.params.clear();
this.array.clear(); this.array.clear();

View File

@@ -6,7 +6,6 @@ import javax.annotation.Resource;
import org.redkale.net.http.*; import org.redkale.net.http.*;
import org.redkale.service.RetResult; import org.redkale.service.RetResult;
public class SimpleRestServlet extends RestHttpServlet<UserInfo> { public class SimpleRestServlet extends RestHttpServlet<UserInfo> {
protected static final RetResult RET_UNLOGIN = RetCodes.retResult(RetCodes.RET_USER_UNLOGIN); protected static final RetResult RET_UNLOGIN = RetCodes.retResult(RetCodes.RET_USER_UNLOGIN);
@@ -26,16 +25,16 @@ public class SimpleRestServlet extends RestHttpServlet<UserInfo> {
//普通鉴权 //普通鉴权
@Override @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); UserInfo info = currentUser(request);
if (info == null) { if (info == null) {
response.finishJson(RET_UNLOGIN); response.finishJson(RET_UNLOGIN);
return false; return;
} else if (!info.checkAuth(module, actionid)) { } else if (!info.checkAuth(module, actionid)) {
response.finishJson(RET_AUTHILLEGAL); response.finishJson(RET_AUTHILLEGAL);
return false; return;
} }
return true; next.execute(request, response);
} }
} }