From 3b601979f4a8e182f4aae2750696a64686e3002a Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sun, 14 May 2017 19:42:08 +0800 Subject: [PATCH] --- src/org/redkale/boot/NodeHttpServer.java | 50 +++++++++++++---- src/org/redkale/boot/NodeServer.java | 34 +++++++++--- src/org/redkale/boot/NodeSncpServer.java | 31 ++++++++++- src/org/redkale/boot/NodeWatchServer.java | 5 ++ src/org/redkale/net/Filter.java | 54 +++++++++++++++++++ src/org/redkale/net/PrepareServlet.java | 42 ++++++++++++++- src/org/redkale/net/Response.java | 28 +++++++--- src/org/redkale/net/http/HttpBaseServlet.java | 4 +- src/org/redkale/net/http/HttpFilter.java | 16 ++++++ .../redkale/net/http/HttpPrepareServlet.java | 2 + src/org/redkale/net/http/HttpResponse.java | 5 ++ src/org/redkale/net/http/HttpServer.java | 44 ++++++++++++--- src/org/redkale/net/http/MultiContext.java | 2 +- src/org/redkale/net/http/Rest.java | 23 ++++---- src/org/redkale/net/sncp/SncpFilter.java | 16 ++++++ .../redkale/net/sncp/SncpPrepareServlet.java | 2 + src/org/redkale/net/sncp/SncpServer.java | 13 +++++ src/org/redkale/watch/WatchFilter.java | 16 ++++++ 18 files changed, 339 insertions(+), 48 deletions(-) create mode 100644 src/org/redkale/net/Filter.java create mode 100644 src/org/redkale/net/http/HttpFilter.java create mode 100644 src/org/redkale/net/sncp/SncpFilter.java create mode 100644 src/org/redkale/watch/WatchFilter.java diff --git a/src/org/redkale/boot/NodeHttpServer.java b/src/org/redkale/boot/NodeHttpServer.java index eea8a574d..8404a875d 100644 --- a/src/org/redkale/boot/NodeHttpServer.java +++ b/src/org/redkale/boot/NodeHttpServer.java @@ -19,7 +19,7 @@ import org.redkale.net.sncp.Sncp; import org.redkale.service.*; import org.redkale.util.AnyValue.DefaultAnyValue; import org.redkale.util.*; -import org.redkale.watch.WatchServlet; +import org.redkale.watch.*; /** * HTTP Server节点的配置Server @@ -51,19 +51,19 @@ public class NodeHttpServer extends NodeServer { return httpServer == null ? null : httpServer.getSocketAddress(); } - @Override - protected ClassFilter createServletClassFilter() { - return createClassFilter(null, WebServlet.class, HttpServlet.class, new Class[]{WatchServlet.class}, null, "servlets", "servlet"); - } - @Override protected ClassFilter createServiceClassFilter() { return createClassFilter(this.sncpGroup, null, Service.class, new Class[]{WatchService.class}, Annotation.class, "services", "service"); } @Override - protected void loadServlet(ClassFilter servletFilter) throws Exception { - if (httpServer != null) loadHttpServlet(this.serverConf.getAnyValue("servlets"), servletFilter); + protected ClassFilter createFilterClassFilter() { + return createClassFilter(null, null, HttpFilter.class, new Class[]{WatchFilter.class}, null, "filters", "filter"); + } + + @Override + protected ClassFilter createServletClassFilter() { + return createClassFilter(null, WebServlet.class, HttpServlet.class, new Class[]{WatchServlet.class}, null, "servlets", "servlet"); } @Override @@ -72,6 +72,16 @@ public class NodeHttpServer extends NodeServer { initWebSocketService(); } + @Override + protected void loadFilter(ClassFilter filterFilter) throws Exception { + if (httpServer != null) loadHttpFilter(this.serverConf.getAnyValue("fliters"), filterFilter); + } + + @Override + protected void loadServlet(ClassFilter servletFilter) throws Exception { + if (httpServer != null) loadHttpServlet(this.serverConf.getAnyValue("servlets"), servletFilter); + } + private void initWebSocketService() { final NodeServer self = this; final ResourceFactory regFactory = application.getResourceFactory(); @@ -95,6 +105,22 @@ public class NodeHttpServer extends NodeServer { }, WebSocketNode.class); } + protected void loadHttpFilter(final AnyValue servletsConf, final ClassFilter classFilter) throws Exception { + final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null; + final String threadName = "[" + Thread.currentThread().getName() + "] "; + List> list = new ArrayList(classFilter.getFilterEntrys()); + for (FilterEntry en : list) { + Class clazz = (Class) en.getType(); + if (Modifier.isAbstract(clazz.getModifiers())) continue; + final HttpFilter filter = clazz.newInstance(); + resourceFactory.inject(filter, this); + DefaultAnyValue filterConf = (DefaultAnyValue) en.getProperty(); + this.httpServer.addHttpFilter(filter, filterConf); + if (sb != null) sb.append(threadName).append(" Load ").append(clazz.getName()).append(LINE_SEPARATOR); + } + if (sb != null && sb.length() > 0) logger.log(Level.INFO, sb.toString()); + } + protected void loadHttpServlet(final AnyValue servletsConf, final ClassFilter filter) throws Exception { final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null; final String prefix = servletsConf == null ? "" : servletsConf.getValue("path", ""); @@ -109,11 +135,11 @@ public class NodeHttpServer extends NodeServer { final List> ss = sb == null ? null : new ArrayList<>(); for (FilterEntry en : list) { Class clazz = (Class) en.getType(); - if (WatchServlet.class.isAssignableFrom(clazz)) continue; //给Watch服务使用 if (Modifier.isAbstract(clazz.getModifiers())) continue; WebServlet ws = clazz.getAnnotation(WebServlet.class); if (ws == null || ws.value().length == 0) continue; final HttpServlet servlet = clazz.newInstance(); + resourceFactory.inject(servlet, this); final String[] mappings = ws.value(); String pref = ws.repair() ? prefix : ""; DefaultAnyValue servletConf = (DefaultAnyValue) en.getProperty(); @@ -153,7 +179,9 @@ public class NodeHttpServer extends NodeServer { final String threadName = "[" + Thread.currentThread().getName() + "] "; final List> ss = sb == null ? null : new ArrayList<>(); - final Class baseServletClass = Class.forName(restConf.getValue("base", HttpServlet.class.getName())); + String userTypeStr = restConf.getValue("usertype"); + final Class userType = userTypeStr == null ? null : Class.forName(userTypeStr); + final Class baseServletType = Class.forName(restConf.getValue("base", HttpServlet.class.getName())); final boolean autoload = restConf.getBoolValue("autoload", true); @@ -179,7 +207,7 @@ public class NodeHttpServer extends NodeServer { if (!autoload && !includeValues.contains(stypename)) return; if (!restFilter.accept(stypename)) return; - HttpServlet servlet = httpServer.addRestServlet(name, stype, service, baseServletClass, prefix, (AnyValue) null); + HttpServlet servlet = httpServer.addRestServlet(name, stype, service, userType, baseServletType, prefix, (AnyValue) null); if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null resourceFactory.inject(servlet, NodeHttpServer.this); if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet); diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index 44bd42c65..3745efb4b 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -19,6 +19,7 @@ import javax.annotation.Resource; import javax.persistence.Transient; import static org.redkale.boot.Application.*; import org.redkale.boot.ClassFilter.FilterEntry; +import org.redkale.net.Filter; import org.redkale.net.*; import org.redkale.net.http.WebSocketNode; import org.redkale.net.sncp.*; @@ -161,22 +162,32 @@ public abstract class NodeServer { this.interceptor = (NodeInterceptor) clazz.newInstance(); } - ClassFilter servletFilter = createServletClassFilter(); ClassFilter serviceFilter = createServiceClassFilter(); + ClassFilter filterFilter = createFilterClassFilter(); + ClassFilter servletFilter = createServletClassFilter(); long s = System.currentTimeMillis(); if (servletFilter == null) { - ClassFilter.Loader.load(application.getHome(), serverConf.getValue("excludelibs", "").split(";"), serviceFilter); - } else { + if (filterFilter == null) { + ClassFilter.Loader.load(application.getHome(), serverConf.getValue("excludelibs", "").split(";"), serviceFilter); + } else { + ClassFilter.Loader.load(application.getHome(), serverConf.getValue("excludelibs", "").split(";"), serviceFilter, filterFilter); + } + } else if (filterFilter == null) { ClassFilter.Loader.load(application.getHome(), serverConf.getValue("excludelibs", "").split(";"), serviceFilter, servletFilter); + } else { + ClassFilter.Loader.load(application.getHome(), serverConf.getValue("excludelibs", "").split(";"), serviceFilter, filterFilter, servletFilter); } long e = System.currentTimeMillis() - s; logger.info(this.getClass().getSimpleName() + " load filter class in " + e + " ms"); loadService(serviceFilter); //必须在servlet之前 + loadFilter(filterFilter); loadServlet(servletFilter); if (this.interceptor != null) this.resourceFactory.inject(this.interceptor); } + protected abstract void loadFilter(ClassFilter filterFilter) throws Exception; + protected abstract void loadServlet(ClassFilter servletFilter) throws Exception; private void initResource() { @@ -477,6 +488,8 @@ public abstract class NodeServer { return transport; } + protected abstract ClassFilter createFilterClassFilter(); + protected abstract ClassFilter createServletClassFilter(); protected ClassFilter createServiceClassFilter() { @@ -486,10 +499,19 @@ public abstract class NodeServer { protected ClassFilter createClassFilter(final String localGroup, Class ref, Class inter, Class[] excludeSuperClasses, Class ref2, String properties, String property) { ClassFilter cf = new ClassFilter(ref, inter, excludeSuperClasses, null); - if (properties == null && properties == null) return cf; - if (this.serverConf == null) return cf; + if (properties == null && properties == null) { + cf.setRefused(true); + return cf; + } + if (this.serverConf == null) { + cf.setRefused(true); + return cf; + } AnyValue[] proplist = this.serverConf.getAnyValues(properties); - if (proplist == null || proplist.length < 1) return cf; + if (proplist == null || proplist.length < 1) { + cf.setRefused(true); + return cf; + } cf = null; for (AnyValue list : proplist) { DefaultAnyValue prop = null; diff --git a/src/org/redkale/boot/NodeSncpServer.java b/src/org/redkale/boot/NodeSncpServer.java index 84fb6acc5..6a94314b0 100644 --- a/src/org/redkale/boot/NodeSncpServer.java +++ b/src/org/redkale/boot/NodeSncpServer.java @@ -5,13 +5,16 @@ */ package org.redkale.boot; +import java.lang.reflect.Modifier; import java.net.*; import java.util.*; -import java.util.logging.*; +import java.util.logging.Level; +import org.redkale.boot.ClassFilter.FilterEntry; import org.redkale.net.*; import org.redkale.net.sncp.*; import org.redkale.service.Service; import org.redkale.util.*; +import org.redkale.util.AnyValue.DefaultAnyValue; /** * SNCP Server节点的配置Server @@ -77,10 +80,36 @@ public class NodeSncpServer extends NodeServer { return sncpServer; } + @Override + protected void loadFilter(ClassFilter filterFilter) throws Exception { + if (sncpServer != null) loadSncpFilter(this.serverConf.getAnyValue("fliters"), filterFilter); + } + + protected void loadSncpFilter(final AnyValue servletsConf, final ClassFilter classFilter) throws Exception { + final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null; + final String threadName = "[" + Thread.currentThread().getName() + "] "; + List> list = new ArrayList(classFilter.getFilterEntrys()); + for (FilterEntry en : list) { + Class clazz = (Class) en.getType(); + if (Modifier.isAbstract(clazz.getModifiers())) continue; + final SncpFilter filter = clazz.newInstance(); + resourceFactory.inject(filter, this); + DefaultAnyValue filterConf = (DefaultAnyValue) en.getProperty(); + this.sncpServer.addSncpFilter(filter, filterConf); + if (sb != null) sb.append(threadName).append(" Load ").append(clazz.getName()).append(LINE_SEPARATOR); + } + if (sb != null && sb.length() > 0) logger.log(Level.INFO, sb.toString()); + } + @Override protected void loadServlet(ClassFilter servletFilter) throws Exception { } + @Override + protected ClassFilter createFilterClassFilter() { + return createClassFilter(null, null, SncpFilter.class, null, null, "filters", "filter"); + } + @Override protected ClassFilter createServletClassFilter() { return null; diff --git a/src/org/redkale/boot/NodeWatchServer.java b/src/org/redkale/boot/NodeWatchServer.java index ad2aaaa63..439fa5ae5 100644 --- a/src/org/redkale/boot/NodeWatchServer.java +++ b/src/org/redkale/boot/NodeWatchServer.java @@ -28,6 +28,11 @@ public class NodeWatchServer extends NodeHttpServer { return createClassFilter(this.sncpGroup, null, WatchService.class, null, Annotation.class, "services", "service"); } + @Override + protected ClassFilter createFilterClassFilter() { + return createClassFilter(null, null, WatchFilter.class, null, null, "filters", "filter"); + } + @Override protected ClassFilter createServletClassFilter() { return createClassFilter(null, WebServlet.class, WatchServlet.class, null, null, "servlets", "servlet"); diff --git a/src/org/redkale/net/Filter.java b/src/org/redkale/net/Filter.java new file mode 100644 index 000000000..0fb10fe73 --- /dev/null +++ b/src/org/redkale/net/Filter.java @@ -0,0 +1,54 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.net; + +import java.io.IOException; +import org.redkale.util.AnyValue; + +/** + * 协议拦截器类 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * @param Context的子类型 + * @param Request的子类型 + * @param

Response的子类型 + */ +public abstract class Filter, P extends Response> implements Comparable { + + AnyValue _conf; //当前Filter的配置 + + Filter _next; //下一个Filter + + public void init(C context, AnyValue config) { + } + + public abstract void doFilter(R request, P response) throws IOException; + + public void destroy(C context, AnyValue config) { + } + + public String getName() { + return ""; + } + + /** + * 值越小越靠前执行 + * + * @return + */ + public int getIndex() { + return 0; + } + + @Override + public int compareTo(Object o) { + if (!(o instanceof Filter)) return 1; + return this.getIndex() - ((Filter) o).getIndex(); + } +} diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index 0e33d414d..eb0795d28 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -42,6 +42,10 @@ public abstract class PrepareServlet mappings = new HashMap<>(); + private List> filters = new ArrayList<>(); + + protected Filter headFilter; + protected void putServlet(S servlet) { synchronized (lock1) { Set newservlets = new HashSet<>(servlets); @@ -62,6 +66,36 @@ public abstract class PrepareServlet filter : filters) { + filter.init(context, config); + } + this.headFilter = filters.get(0); + Filter filter = this.headFilter; + for (int i = 1; i < filters.size(); i++) { + filter._next = filters.get(i); + filter = filter._next; + } + } + } + + @Override + public void destroy(C context, AnyValue config) { + if (filters != null && !filters.isEmpty()) { + for (Filter filter : filters) { + filter.destroy(context, config); + } + } + } + + public void addFilter(Filter filter, AnyValue conf) { + filter._conf = conf; + this.filters.add(filter); + } + public abstract void addServlet(S servlet, Object attachment, AnyValue conf, K... mappings); public final void prepare(final ByteBuffer buffer, final R request, final P response) throws IOException { @@ -74,7 +108,9 @@ public abstract class PrepareServlet> { protected BiConsumer> recycleListener; - protected Servlet nextServlet; + protected Filter> filter; + + protected Servlet> servlet; private final CompletionHandler finishHandler = new CompletionHandler() { @@ -117,7 +119,8 @@ public abstract class Response> { recycleListener = null; } this.output = null; - this.nextServlet = null; + this.filter = null; + this.servlet = null; request.recycle(); if (channel != null) { if (keepAlive) { @@ -144,16 +147,25 @@ public abstract class Response> { this.request.createtime = System.currentTimeMillis(); } - @SuppressWarnings("unchecked") - public void thenEvent(S nextServlet) { - this.nextServlet = nextServlet; + protected void setFilter(Filter> filter) { + this.filter = filter; + } + + protected void thenEvent(Servlet servlet) { + this.servlet = servlet; } @SuppressWarnings("unchecked") public void nextEvent() throws IOException { - if (this.nextServlet != null) { - Servlet s = this.nextServlet; - this.nextServlet = null; + if (this.filter != null) { + Filter runner = this.filter; + this.filter = this.filter._next; + runner.doFilter(request, this); + return; + } + if (this.servlet != null) { + Servlet s = this.servlet; + this.servlet = null; s.execute(request, this); } } diff --git a/src/org/redkale/net/http/HttpBaseServlet.java b/src/org/redkale/net/http/HttpBaseServlet.java index 8facdfbda..7332e847b 100644 --- a/src/org/redkale/net/http/HttpBaseServlet.java +++ b/src/org/redkale/net/http/HttpBaseServlet.java @@ -187,7 +187,7 @@ public abstract class HttpBaseServlet extends HttpServlet { private final HttpServlet authSuccessServlet = new HttpServlet() { @Override public void execute(HttpRequest request, HttpResponse response) throws IOException { - Entry entry = (Entry) request.attachment; + Entry entry = (Entry) request.getAttribute("_redkale_entry"); if (entry.cacheseconds > 0) {//有缓存设置 CacheEntry ce = entry.cache.get(request.getRequestURI()); if (ce != null && ce.time + entry.cacheseconds > System.currentTimeMillis()) { //缓存有效 @@ -212,7 +212,7 @@ public abstract class HttpBaseServlet extends HttpServlet { response.finishJson(new RetResult(RET_METHOD_ERROR, "Method(" + request.getMethod() + ") Error")); return; } - request.attachment = entry; + request.setAttribute("_redkale_entry", entry); if (entry.ignore) { authSuccessServlet.execute(request, response); } else { diff --git a/src/org/redkale/net/http/HttpFilter.java b/src/org/redkale/net/http/HttpFilter.java new file mode 100644 index 000000000..b5788b688 --- /dev/null +++ b/src/org/redkale/net/http/HttpFilter.java @@ -0,0 +1,16 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.net.http; + +import org.redkale.net.Filter; + +/** + * + * @author zhangjx + */ +public abstract class HttpFilter extends Filter { + +} diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index 68ba8390f..e931fc4ac 100644 --- a/src/org/redkale/net/http/HttpPrepareServlet.java +++ b/src/org/redkale/net/http/HttpPrepareServlet.java @@ -97,6 +97,7 @@ public class HttpPrepareServlet extends PrepareServlet servlets = getServlets(); servlets.forEach(s -> { s.preInit(context, getServletConf(s)); @@ -269,6 +270,7 @@ public class HttpPrepareServlet extends PrepareServlet { s.destroy(context, getServletConf(s)); diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index 036edf00d..72efd4441 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -178,6 +178,11 @@ public class HttpResponse extends Response { return v == null ? defValue : v; } + @Override + protected void thenEvent(Servlet servlet) { + this.servlet = servlet; + } + /** * 增加Cookie值 * diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index 25e3cc973..f8e46e108 100644 --- a/src/org/redkale/net/http/HttpServer.java +++ b/src/org/redkale/net/http/HttpServer.java @@ -46,6 +46,19 @@ public class HttpServer extends Server RestServlet * @param name Service的资源名 * @param serviceType Service的类型 - * @param service Service对象 + * @param service Service对象 * @param baseServletClass RestServlet基类 * @param prefix url前缀 * * @return RestServlet */ public T addRestServlet(String name, Class serviceType, S service, Class baseServletClass, String prefix) { - return addRestServlet(name, serviceType, service, baseServletClass, prefix, null); + return addRestServlet(name, serviceType, service, null, baseServletClass, prefix, null); } /** @@ -113,14 +126,33 @@ public class HttpServer extends Server T addRestServlet(String name, Class serviceType, S service, final Class userType, Class baseServletClass, String prefix) { + return addRestServlet(name, serviceType, service, userType, baseServletClass, prefix, null); + } + + /** + * 添加RestServlet + * + * @param Service + * @param RestServlet + * @param name Service的资源名 + * @param serviceType Service的类型 + * @param service Service对象 + * @param userType 用户数据类型 + * @param baseServletType RestServlet基类 + * @param prefix url前缀 + * @param conf 配置信息 * * @return RestServlet */ public T addRestServlet(final String name, final Class serviceType, - final S service, final Class baseServletClass, final String prefix, final AnyValue conf) { + final S service, final Class userType, final Class baseServletType, final String prefix, final AnyValue conf) { T servlet = null; for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) { if (!(item instanceof HttpServlet)) continue; @@ -137,7 +169,7 @@ public class HttpServer extends Server T createRestServlet(final Class baseServletClass, final Class serviceType) { - if (baseServletClass == null || serviceType == null) throw new RuntimeException(" Servlet or Service is null Class on createRestServlet"); - if (!HttpServlet.class.isAssignableFrom(baseServletClass)) throw new RuntimeException(baseServletClass + " is not HttpServlet Class on createRestServlet"); - int mod = baseServletClass.getModifiers(); - if (!java.lang.reflect.Modifier.isPublic(mod)) throw new RuntimeException(baseServletClass + " is not Public Class on createRestServlet"); - if (java.lang.reflect.Modifier.isAbstract(mod)) throw new RuntimeException(baseServletClass + " is abstract Class on createRestServlet"); + static T createRestServlet(final Class userType0, final Class baseServletType, final Class serviceType) { + if (baseServletType == null || serviceType == null) throw new RuntimeException(" Servlet or Service is null Class on createRestServlet"); + if (!HttpServlet.class.isAssignableFrom(baseServletType)) throw new RuntimeException(baseServletType + " is not HttpServlet Class on createRestServlet"); + int mod = baseServletType.getModifiers(); + if (!java.lang.reflect.Modifier.isPublic(mod)) throw new RuntimeException(baseServletType + " is not Public Class on createRestServlet"); + if (java.lang.reflect.Modifier.isAbstract(mod)) throw new RuntimeException(baseServletType + " cannot a abstract Class on createRestServlet"); final String serviceDesc = Type.getDescriptor(serviceType); final String webServletDesc = Type.getDescriptor(WebServlet.class); @@ -131,11 +131,12 @@ public final class Rest { final String retInternalName = Type.getInternalName(RetResult.class); final String serviceTypeInternalName = Type.getInternalName(serviceType); - HttpUserType hut = baseServletClass.getAnnotation(HttpUserType.class); - final Class userType = hut == null ? Object.class : hut.value(); - final String supDynName = baseServletClass.getName().replace('.', '/'); + HttpUserType hut = baseServletType.getAnnotation(HttpUserType.class); + final Class userType = (userType0 == null || userType0 == Object.class) ? (hut == null ? null : hut.value()) : userType0; + + final String supDynName = baseServletType.getName().replace('.', '/'); final RestService controller = serviceType.getAnnotation(RestService.class); - if (controller != null && controller.ignore()) throw new RuntimeException(baseServletClass + " is ignore Rest Service Class"); //标记为ignore=true不创建Servlet + if (controller != null && controller.ignore()) throw new RuntimeException(serviceType + " is ignore Rest Service Class"); //标记为ignore=true不创建Servlet ClassLoader loader = Sncp.class.getClassLoader(); String newDynName = serviceTypeInternalName.substring(0, serviceTypeInternalName.lastIndexOf('/') + 1) + "_Dyn" + serviceType.getSimpleName().replaceAll("Service.*$", "") + "RestServlet"; @@ -697,7 +698,7 @@ public final class Rest { } else if ("&".equals(pname) && ptype == userType) { //当前用户对象的类名 mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, reqInternalName, "currentUser", "()Ljava/lang/Object;", false); - mv.visitTypeInsn(CHECKCAST, Type.getInternalName(userType)); + mv.visitTypeInsn(CHECKCAST, Type.getInternalName(ptype)); mv.visitVarInsn(ASTORE, maxLocals); varInsns.add(new int[]{ALOAD, maxLocals}); } else if (ptype == boolean.class) { diff --git a/src/org/redkale/net/sncp/SncpFilter.java b/src/org/redkale/net/sncp/SncpFilter.java new file mode 100644 index 000000000..4ad0479c5 --- /dev/null +++ b/src/org/redkale/net/sncp/SncpFilter.java @@ -0,0 +1,16 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.net.sncp; + +import org.redkale.net.Filter; + +/** + * + * @author zhangjx + */ +public abstract class SncpFilter extends Filter { + +} diff --git a/src/org/redkale/net/sncp/SncpPrepareServlet.java b/src/org/redkale/net/sncp/SncpPrepareServlet.java index 934bb5220..e7f2130b8 100644 --- a/src/org/redkale/net/sncp/SncpPrepareServlet.java +++ b/src/org/redkale/net/sncp/SncpPrepareServlet.java @@ -40,11 +40,13 @@ public class SncpPrepareServlet extends PrepareServlet s.init(context, getServletConf(s))); } @Override public void destroy(SncpContext context, AnyValue config) { + super.destroy(context, config); //必须要执行 getServlets().forEach(s -> s.destroy(context, getServletConf(s))); } diff --git a/src/org/redkale/net/sncp/SncpServer.java b/src/org/redkale/net/sncp/SncpServer.java index 0319bdbb4..6a99e2a50 100644 --- a/src/org/redkale/net/sncp/SncpServer.java +++ b/src/org/redkale/net/sncp/SncpServer.java @@ -37,6 +37,19 @@ public class SncpServer extends Server