This commit is contained in:
@@ -19,7 +19,7 @@ import org.redkale.net.sncp.Sncp;
|
|||||||
import org.redkale.service.*;
|
import org.redkale.service.*;
|
||||||
import org.redkale.util.AnyValue.DefaultAnyValue;
|
import org.redkale.util.AnyValue.DefaultAnyValue;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
import org.redkale.watch.WatchServlet;
|
import org.redkale.watch.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HTTP Server节点的配置Server
|
* HTTP Server节点的配置Server
|
||||||
@@ -51,19 +51,19 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
return httpServer == null ? null : httpServer.getSocketAddress();
|
return httpServer == null ? null : httpServer.getSocketAddress();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ClassFilter<Servlet> createServletClassFilter() {
|
|
||||||
return createClassFilter(null, WebServlet.class, HttpServlet.class, new Class[]{WatchServlet.class}, null, "servlets", "servlet");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ClassFilter<Service> createServiceClassFilter() {
|
protected ClassFilter<Service> createServiceClassFilter() {
|
||||||
return createClassFilter(this.sncpGroup, null, Service.class, new Class[]{WatchService.class}, Annotation.class, "services", "service");
|
return createClassFilter(this.sncpGroup, null, Service.class, new Class[]{WatchService.class}, Annotation.class, "services", "service");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void loadServlet(ClassFilter<? extends Servlet> servletFilter) throws Exception {
|
protected ClassFilter<Filter> createFilterClassFilter() {
|
||||||
if (httpServer != null) loadHttpServlet(this.serverConf.getAnyValue("servlets"), servletFilter);
|
return createClassFilter(null, null, HttpFilter.class, new Class[]{WatchFilter.class}, null, "filters", "filter");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ClassFilter<Servlet> createServletClassFilter() {
|
||||||
|
return createClassFilter(null, WebServlet.class, HttpServlet.class, new Class[]{WatchServlet.class}, null, "servlets", "servlet");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -72,6 +72,16 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
initWebSocketService();
|
initWebSocketService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void loadFilter(ClassFilter<? extends Filter> filterFilter) throws Exception {
|
||||||
|
if (httpServer != null) loadHttpFilter(this.serverConf.getAnyValue("fliters"), filterFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void loadServlet(ClassFilter<? extends Servlet> servletFilter) throws Exception {
|
||||||
|
if (httpServer != null) loadHttpServlet(this.serverConf.getAnyValue("servlets"), servletFilter);
|
||||||
|
}
|
||||||
|
|
||||||
private void initWebSocketService() {
|
private void initWebSocketService() {
|
||||||
final NodeServer self = this;
|
final NodeServer self = this;
|
||||||
final ResourceFactory regFactory = application.getResourceFactory();
|
final ResourceFactory regFactory = application.getResourceFactory();
|
||||||
@@ -95,6 +105,22 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
}, WebSocketNode.class);
|
}, WebSocketNode.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void loadHttpFilter(final AnyValue servletsConf, final ClassFilter<? extends Filter> classFilter) throws Exception {
|
||||||
|
final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null;
|
||||||
|
final String threadName = "[" + Thread.currentThread().getName() + "] ";
|
||||||
|
List<FilterEntry<? extends Filter>> list = new ArrayList(classFilter.getFilterEntrys());
|
||||||
|
for (FilterEntry<? extends Filter> en : list) {
|
||||||
|
Class<HttpFilter> clazz = (Class<HttpFilter>) 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<? extends Servlet> filter) throws Exception {
|
protected void loadHttpServlet(final AnyValue servletsConf, final ClassFilter<? extends Servlet> filter) throws Exception {
|
||||||
final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null;
|
final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null;
|
||||||
final String prefix = servletsConf == null ? "" : servletsConf.getValue("path", "");
|
final String prefix = servletsConf == null ? "" : servletsConf.getValue("path", "");
|
||||||
@@ -109,11 +135,11 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
final List<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>();
|
final List<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>();
|
||||||
for (FilterEntry<? extends Servlet> en : list) {
|
for (FilterEntry<? extends Servlet> en : list) {
|
||||||
Class<HttpServlet> clazz = (Class<HttpServlet>) en.getType();
|
Class<HttpServlet> clazz = (Class<HttpServlet>) en.getType();
|
||||||
if (WatchServlet.class.isAssignableFrom(clazz)) continue; //给Watch服务使用
|
|
||||||
if (Modifier.isAbstract(clazz.getModifiers())) continue;
|
if (Modifier.isAbstract(clazz.getModifiers())) continue;
|
||||||
WebServlet ws = clazz.getAnnotation(WebServlet.class);
|
WebServlet ws = clazz.getAnnotation(WebServlet.class);
|
||||||
if (ws == null || ws.value().length == 0) continue;
|
if (ws == null || ws.value().length == 0) continue;
|
||||||
final HttpServlet servlet = clazz.newInstance();
|
final HttpServlet servlet = clazz.newInstance();
|
||||||
|
resourceFactory.inject(servlet, this);
|
||||||
final String[] mappings = ws.value();
|
final String[] mappings = ws.value();
|
||||||
String pref = ws.repair() ? prefix : "";
|
String pref = ws.repair() ? prefix : "";
|
||||||
DefaultAnyValue servletConf = (DefaultAnyValue) en.getProperty();
|
DefaultAnyValue servletConf = (DefaultAnyValue) en.getProperty();
|
||||||
@@ -153,7 +179,9 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
final String threadName = "[" + Thread.currentThread().getName() + "] ";
|
final String threadName = "[" + Thread.currentThread().getName() + "] ";
|
||||||
final List<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>();
|
final List<AbstractMap.SimpleEntry<String, String[]>> 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);
|
final boolean autoload = restConf.getBoolValue("autoload", true);
|
||||||
|
|
||||||
@@ -179,7 +207,7 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
if (!autoload && !includeValues.contains(stypename)) return;
|
if (!autoload && !includeValues.contains(stypename)) return;
|
||||||
if (!restFilter.accept(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
|
if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
||||||
resourceFactory.inject(servlet, NodeHttpServer.this);
|
resourceFactory.inject(servlet, NodeHttpServer.this);
|
||||||
if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
|
if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import javax.annotation.Resource;
|
|||||||
import javax.persistence.Transient;
|
import javax.persistence.Transient;
|
||||||
import static org.redkale.boot.Application.*;
|
import static org.redkale.boot.Application.*;
|
||||||
import org.redkale.boot.ClassFilter.FilterEntry;
|
import org.redkale.boot.ClassFilter.FilterEntry;
|
||||||
|
import org.redkale.net.Filter;
|
||||||
import org.redkale.net.*;
|
import org.redkale.net.*;
|
||||||
import org.redkale.net.http.WebSocketNode;
|
import org.redkale.net.http.WebSocketNode;
|
||||||
import org.redkale.net.sncp.*;
|
import org.redkale.net.sncp.*;
|
||||||
@@ -161,22 +162,32 @@ public abstract class NodeServer {
|
|||||||
this.interceptor = (NodeInterceptor) clazz.newInstance();
|
this.interceptor = (NodeInterceptor) clazz.newInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassFilter<Servlet> servletFilter = createServletClassFilter();
|
|
||||||
ClassFilter<Service> serviceFilter = createServiceClassFilter();
|
ClassFilter<Service> serviceFilter = createServiceClassFilter();
|
||||||
|
ClassFilter<Filter> filterFilter = createFilterClassFilter();
|
||||||
|
ClassFilter<Servlet> servletFilter = createServletClassFilter();
|
||||||
long s = System.currentTimeMillis();
|
long s = System.currentTimeMillis();
|
||||||
if (servletFilter == null) {
|
if (servletFilter == null) {
|
||||||
|
if (filterFilter == null) {
|
||||||
ClassFilter.Loader.load(application.getHome(), serverConf.getValue("excludelibs", "").split(";"), serviceFilter);
|
ClassFilter.Loader.load(application.getHome(), serverConf.getValue("excludelibs", "").split(";"), serviceFilter);
|
||||||
} else {
|
} 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);
|
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;
|
long e = System.currentTimeMillis() - s;
|
||||||
logger.info(this.getClass().getSimpleName() + " load filter class in " + e + " ms");
|
logger.info(this.getClass().getSimpleName() + " load filter class in " + e + " ms");
|
||||||
loadService(serviceFilter); //必须在servlet之前
|
loadService(serviceFilter); //必须在servlet之前
|
||||||
|
loadFilter(filterFilter);
|
||||||
loadServlet(servletFilter);
|
loadServlet(servletFilter);
|
||||||
|
|
||||||
if (this.interceptor != null) this.resourceFactory.inject(this.interceptor);
|
if (this.interceptor != null) this.resourceFactory.inject(this.interceptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected abstract void loadFilter(ClassFilter<? extends Filter> filterFilter) throws Exception;
|
||||||
|
|
||||||
protected abstract void loadServlet(ClassFilter<? extends Servlet> servletFilter) throws Exception;
|
protected abstract void loadServlet(ClassFilter<? extends Servlet> servletFilter) throws Exception;
|
||||||
|
|
||||||
private void initResource() {
|
private void initResource() {
|
||||||
@@ -477,6 +488,8 @@ public abstract class NodeServer {
|
|||||||
return transport;
|
return transport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected abstract ClassFilter<Filter> createFilterClassFilter();
|
||||||
|
|
||||||
protected abstract ClassFilter<Servlet> createServletClassFilter();
|
protected abstract ClassFilter<Servlet> createServletClassFilter();
|
||||||
|
|
||||||
protected ClassFilter<Service> createServiceClassFilter() {
|
protected ClassFilter<Service> createServiceClassFilter() {
|
||||||
@@ -486,10 +499,19 @@ public abstract class NodeServer {
|
|||||||
protected ClassFilter createClassFilter(final String localGroup, Class<? extends Annotation> ref,
|
protected ClassFilter createClassFilter(final String localGroup, Class<? extends Annotation> ref,
|
||||||
Class inter, Class[] excludeSuperClasses, Class<? extends Annotation> ref2, String properties, String property) {
|
Class inter, Class[] excludeSuperClasses, Class<? extends Annotation> ref2, String properties, String property) {
|
||||||
ClassFilter cf = new ClassFilter(ref, inter, excludeSuperClasses, null);
|
ClassFilter cf = new ClassFilter(ref, inter, excludeSuperClasses, null);
|
||||||
if (properties == null && properties == null) return cf;
|
if (properties == null && properties == null) {
|
||||||
if (this.serverConf == null) return cf;
|
cf.setRefused(true);
|
||||||
|
return cf;
|
||||||
|
}
|
||||||
|
if (this.serverConf == null) {
|
||||||
|
cf.setRefused(true);
|
||||||
|
return cf;
|
||||||
|
}
|
||||||
AnyValue[] proplist = this.serverConf.getAnyValues(properties);
|
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;
|
cf = null;
|
||||||
for (AnyValue list : proplist) {
|
for (AnyValue list : proplist) {
|
||||||
DefaultAnyValue prop = null;
|
DefaultAnyValue prop = null;
|
||||||
|
|||||||
@@ -5,13 +5,16 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.boot;
|
package org.redkale.boot;
|
||||||
|
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
import java.util.*;
|
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.*;
|
||||||
import org.redkale.net.sncp.*;
|
import org.redkale.net.sncp.*;
|
||||||
import org.redkale.service.Service;
|
import org.redkale.service.Service;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
|
import org.redkale.util.AnyValue.DefaultAnyValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SNCP Server节点的配置Server
|
* SNCP Server节点的配置Server
|
||||||
@@ -77,10 +80,36 @@ public class NodeSncpServer extends NodeServer {
|
|||||||
return sncpServer;
|
return sncpServer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void loadFilter(ClassFilter<? extends Filter> filterFilter) throws Exception {
|
||||||
|
if (sncpServer != null) loadSncpFilter(this.serverConf.getAnyValue("fliters"), filterFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void loadSncpFilter(final AnyValue servletsConf, final ClassFilter<? extends Filter> classFilter) throws Exception {
|
||||||
|
final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null;
|
||||||
|
final String threadName = "[" + Thread.currentThread().getName() + "] ";
|
||||||
|
List<FilterEntry<? extends Filter>> list = new ArrayList(classFilter.getFilterEntrys());
|
||||||
|
for (FilterEntry<? extends Filter> en : list) {
|
||||||
|
Class<SncpFilter> clazz = (Class<SncpFilter>) 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
|
@Override
|
||||||
protected void loadServlet(ClassFilter<? extends Servlet> servletFilter) throws Exception {
|
protected void loadServlet(ClassFilter<? extends Servlet> servletFilter) throws Exception {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ClassFilter<Filter> createFilterClassFilter() {
|
||||||
|
return createClassFilter(null, null, SncpFilter.class, null, null, "filters", "filter");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ClassFilter<Servlet> createServletClassFilter() {
|
protected ClassFilter<Servlet> createServletClassFilter() {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ public class NodeWatchServer extends NodeHttpServer {
|
|||||||
return createClassFilter(this.sncpGroup, null, WatchService.class, null, Annotation.class, "services", "service");
|
return createClassFilter(this.sncpGroup, null, WatchService.class, null, Annotation.class, "services", "service");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ClassFilter<Filter> createFilterClassFilter() {
|
||||||
|
return createClassFilter(null, null, WatchFilter.class, null, null, "filters", "filter");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ClassFilter<Servlet> createServletClassFilter() {
|
protected ClassFilter<Servlet> createServletClassFilter() {
|
||||||
return createClassFilter(null, WebServlet.class, WatchServlet.class, null, null, "servlets", "servlet");
|
return createClassFilter(null, WebServlet.class, WatchServlet.class, null, null, "servlets", "servlet");
|
||||||
|
|||||||
54
src/org/redkale/net/Filter.java
Normal file
54
src/org/redkale/net/Filter.java
Normal file
@@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 协议拦截器类
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* 详情见: https://redkale.org
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
* @param <C> Context的子类型
|
||||||
|
* @param <R> Request的子类型
|
||||||
|
* @param <P> Response的子类型
|
||||||
|
*/
|
||||||
|
public abstract class Filter<C extends Context, R extends Request<C>, P extends Response<C, R>> implements Comparable {
|
||||||
|
|
||||||
|
AnyValue _conf; //当前Filter的配置
|
||||||
|
|
||||||
|
Filter<C, R, P> _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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -42,6 +42,10 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
|
|||||||
|
|
||||||
private Map<K, S> mappings = new HashMap<>();
|
private Map<K, S> mappings = new HashMap<>();
|
||||||
|
|
||||||
|
private List<Filter<C, R, P>> filters = new ArrayList<>();
|
||||||
|
|
||||||
|
protected Filter<C, R, P> headFilter;
|
||||||
|
|
||||||
protected void putServlet(S servlet) {
|
protected void putServlet(S servlet) {
|
||||||
synchronized (lock1) {
|
synchronized (lock1) {
|
||||||
Set<S> newservlets = new HashSet<>(servlets);
|
Set<S> newservlets = new HashSet<>(servlets);
|
||||||
@@ -62,6 +66,36 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
|
|||||||
return mappings.get(key);
|
return mappings.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(C context, AnyValue config) {
|
||||||
|
if (filters != null && !filters.isEmpty()) {
|
||||||
|
Collections.sort(filters);
|
||||||
|
for (Filter<C, R, P> filter : filters) {
|
||||||
|
filter.init(context, config);
|
||||||
|
}
|
||||||
|
this.headFilter = filters.get(0);
|
||||||
|
Filter<C, R, P> 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<C, R, P> filter, AnyValue conf) {
|
||||||
|
filter._conf = conf;
|
||||||
|
this.filters.add(filter);
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void addServlet(S servlet, Object attachment, AnyValue conf, K... mappings);
|
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 {
|
public final void prepare(final ByteBuffer buffer, final R request, final P response) throws IOException {
|
||||||
@@ -74,7 +108,9 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
|
|||||||
} else if (rs == 0) {
|
} else if (rs == 0) {
|
||||||
response.context.offerBuffer(buffer);
|
response.context.offerBuffer(buffer);
|
||||||
request.prepare();
|
request.prepare();
|
||||||
this.execute(request, response);
|
response.filter = this.headFilter;
|
||||||
|
response.servlet = this;
|
||||||
|
response.nextEvent();
|
||||||
} else {
|
} else {
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
final AtomicInteger ai = new AtomicInteger(rs);
|
final AtomicInteger ai = new AtomicInteger(rs);
|
||||||
@@ -91,7 +127,9 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
|
|||||||
response.context.offerBuffer(buffer);
|
response.context.offerBuffer(buffer);
|
||||||
request.prepare();
|
request.prepare();
|
||||||
try {
|
try {
|
||||||
execute(request, response);
|
response.filter = PrepareServlet.this.headFilter;
|
||||||
|
response.servlet = PrepareServlet.this;
|
||||||
|
response.nextEvent();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
illRequestCounter.incrementAndGet();
|
illRequestCounter.incrementAndGet();
|
||||||
response.finish(true);
|
response.finish(true);
|
||||||
|
|||||||
@@ -35,7 +35,9 @@ 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;
|
protected Filter<C, R, ? extends Response<C, R>> filter;
|
||||||
|
|
||||||
|
protected Servlet<C, R, ? extends Response<C, R>> servlet;
|
||||||
|
|
||||||
private final CompletionHandler finishHandler = new CompletionHandler<Integer, ByteBuffer>() {
|
private final CompletionHandler finishHandler = new CompletionHandler<Integer, ByteBuffer>() {
|
||||||
|
|
||||||
@@ -117,7 +119,8 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
|||||||
recycleListener = null;
|
recycleListener = null;
|
||||||
}
|
}
|
||||||
this.output = null;
|
this.output = null;
|
||||||
this.nextServlet = null;
|
this.filter = null;
|
||||||
|
this.servlet = null;
|
||||||
request.recycle();
|
request.recycle();
|
||||||
if (channel != null) {
|
if (channel != null) {
|
||||||
if (keepAlive) {
|
if (keepAlive) {
|
||||||
@@ -144,16 +147,25 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
|||||||
this.request.createtime = System.currentTimeMillis();
|
this.request.createtime = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
protected void setFilter(Filter<C, R, Response<C, R>> filter) {
|
||||||
public <S extends Servlet> void thenEvent(S nextServlet) {
|
this.filter = filter;
|
||||||
this.nextServlet = nextServlet;
|
}
|
||||||
|
|
||||||
|
protected void thenEvent(Servlet servlet) {
|
||||||
|
this.servlet = servlet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void nextEvent() throws IOException {
|
public void nextEvent() throws IOException {
|
||||||
if (this.nextServlet != null) {
|
if (this.filter != null) {
|
||||||
Servlet s = this.nextServlet;
|
Filter runner = this.filter;
|
||||||
this.nextServlet = null;
|
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);
|
s.execute(request, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ public abstract class HttpBaseServlet extends HttpServlet {
|
|||||||
private final HttpServlet authSuccessServlet = new HttpServlet() {
|
private final HttpServlet authSuccessServlet = new HttpServlet() {
|
||||||
@Override
|
@Override
|
||||||
public void execute(HttpRequest request, HttpResponse response) throws IOException {
|
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) {//有缓存设置
|
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()) { //缓存有效
|
||||||
@@ -212,7 +212,7 @@ public abstract class HttpBaseServlet extends HttpServlet {
|
|||||||
response.finishJson(new RetResult(RET_METHOD_ERROR, "Method(" + request.getMethod() + ") Error"));
|
response.finishJson(new RetResult(RET_METHOD_ERROR, "Method(" + request.getMethod() + ") Error"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
request.attachment = entry;
|
request.setAttribute("_redkale_entry", entry);
|
||||||
if (entry.ignore) {
|
if (entry.ignore) {
|
||||||
authSuccessServlet.execute(request, response);
|
authSuccessServlet.execute(request, response);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
16
src/org/redkale/net/http/HttpFilter.java
Normal file
16
src/org/redkale/net/http/HttpFilter.java
Normal file
@@ -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<HttpContext, HttpRequest, HttpResponse> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -97,6 +97,7 @@ public class HttpPrepareServlet extends PrepareServlet<String, HttpContext, Http
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(HttpContext context, AnyValue config) {
|
public void init(HttpContext context, AnyValue config) {
|
||||||
|
super.init(context, config); //必须要执行
|
||||||
Collection<HttpServlet> servlets = getServlets();
|
Collection<HttpServlet> servlets = getServlets();
|
||||||
servlets.forEach(s -> {
|
servlets.forEach(s -> {
|
||||||
s.preInit(context, getServletConf(s));
|
s.preInit(context, getServletConf(s));
|
||||||
@@ -269,6 +270,7 @@ public class HttpPrepareServlet extends PrepareServlet<String, HttpContext, Http
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroy(HttpContext context, AnyValue config) {
|
public void destroy(HttpContext context, AnyValue config) {
|
||||||
|
super.destroy(context, config); //必须要执行
|
||||||
this.resourceHttpServlet.destroy(context, config);
|
this.resourceHttpServlet.destroy(context, config);
|
||||||
getServlets().forEach(s -> {
|
getServlets().forEach(s -> {
|
||||||
s.destroy(context, getServletConf(s));
|
s.destroy(context, getServletConf(s));
|
||||||
|
|||||||
@@ -178,6 +178,11 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
|||||||
return v == null ? defValue : v;
|
return v == null ? defValue : v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void thenEvent(Servlet servlet) {
|
||||||
|
this.servlet = servlet;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 增加Cookie值
|
* 增加Cookie值
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -46,6 +46,19 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
return ((HttpPrepareServlet) this.prepare).resourceHttpServlet;
|
return ((HttpPrepareServlet) this.prepare).resourceHttpServlet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加HttpFilter
|
||||||
|
*
|
||||||
|
* @param filter HttpFilter
|
||||||
|
* @param conf AnyValue
|
||||||
|
*
|
||||||
|
* @return HttpServer
|
||||||
|
*/
|
||||||
|
public HttpServer addHttpFilter(HttpFilter filter, AnyValue conf) {
|
||||||
|
this.prepare.addFilter(filter, conf);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加HttpServlet
|
* 添加HttpServlet
|
||||||
*
|
*
|
||||||
@@ -102,7 +115,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
* @return RestServlet
|
* @return RestServlet
|
||||||
*/
|
*/
|
||||||
public <S extends Service, T extends HttpServlet> T addRestServlet(String name, Class<S> serviceType, S service, Class<T> baseServletClass, String prefix) {
|
public <S extends Service, T extends HttpServlet> T addRestServlet(String name, Class<S> serviceType, S service, Class<T> 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<String, HttpContext, HttpRequest, HttpRes
|
|||||||
* @param name Service的资源名
|
* @param name Service的资源名
|
||||||
* @param serviceType Service的类型
|
* @param serviceType Service的类型
|
||||||
* @param service Service对象
|
* @param service Service对象
|
||||||
|
* @param userType 用户数据类型
|
||||||
* @param baseServletClass RestServlet基类
|
* @param baseServletClass RestServlet基类
|
||||||
* @param prefix url前缀
|
* @param prefix url前缀
|
||||||
|
*
|
||||||
|
* @return RestServlet
|
||||||
|
*/
|
||||||
|
public <S extends Service, T extends HttpServlet> T addRestServlet(String name, Class<S> serviceType, S service, final Class userType, Class<T> baseServletClass, String prefix) {
|
||||||
|
return addRestServlet(name, serviceType, service, userType, baseServletClass, prefix, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加RestServlet
|
||||||
|
*
|
||||||
|
* @param <S> Service
|
||||||
|
* @param <T> RestServlet
|
||||||
|
* @param name Service的资源名
|
||||||
|
* @param serviceType Service的类型
|
||||||
|
* @param service Service对象
|
||||||
|
* @param userType 用户数据类型
|
||||||
|
* @param baseServletType RestServlet基类
|
||||||
|
* @param prefix url前缀
|
||||||
* @param conf 配置信息
|
* @param conf 配置信息
|
||||||
*
|
*
|
||||||
* @return RestServlet
|
* @return RestServlet
|
||||||
*/
|
*/
|
||||||
public <S extends Service, T extends HttpServlet> T addRestServlet(final String name, final Class<S> serviceType,
|
public <S extends Service, T extends HttpServlet> T addRestServlet(final String name, final Class<S> serviceType,
|
||||||
final S service, final Class<T> baseServletClass, final String prefix, final AnyValue conf) {
|
final S service, final Class userType, final Class<T> baseServletType, final String prefix, final AnyValue conf) {
|
||||||
T servlet = null;
|
T servlet = null;
|
||||||
for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) {
|
for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) {
|
||||||
if (!(item instanceof HttpServlet)) continue;
|
if (!(item instanceof HttpServlet)) continue;
|
||||||
@@ -137,7 +169,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
final boolean first = servlet == null;
|
final boolean first = servlet == null;
|
||||||
if (servlet == null) servlet = Rest.createRestServlet(baseServletClass, serviceType);
|
if (servlet == null) servlet = Rest.createRestServlet(userType, baseServletType, serviceType);
|
||||||
if (servlet == null) return null; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
if (servlet == null) return null; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
||||||
try { //若提供动态变更Service服务功能,则改Rest服务无法做出相应更新
|
try { //若提供动态变更Service服务功能,则改Rest服务无法做出相应更新
|
||||||
Field field = servlet.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);
|
Field field = servlet.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public final class MultiContext {
|
|||||||
|
|
||||||
public MultiContext(final Charset charsetName, final String contentType, final DefaultAnyValue params, final InputStream in, String fielnameRegex) {
|
public MultiContext(final Charset charsetName, final String contentType, final DefaultAnyValue params, final InputStream in, String fielnameRegex) {
|
||||||
this.charset = charsetName == null ? UTF8 : charsetName;
|
this.charset = charsetName == null ? UTF8 : charsetName;
|
||||||
this.contentType = contentType.trim();
|
this.contentType = contentType == null ? "" : contentType.trim();
|
||||||
this.parameters = params;
|
this.parameters = params;
|
||||||
this.boundary = parseBoundary(this.contentType);
|
this.boundary = parseBoundary(this.contentType);
|
||||||
this.endboundarray = ("--" + this.boundary + "--").getBytes();
|
this.endboundarray = ("--" + this.boundary + "--").getBytes();
|
||||||
|
|||||||
@@ -104,12 +104,12 @@ public final class Rest {
|
|||||||
return (!controller.name().isEmpty()) ? controller.name() : serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase();
|
return (!controller.name().isEmpty()) ? controller.name() : serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
static <T extends HttpServlet> T createRestServlet(final Class<T> baseServletClass, final Class<? extends Service> serviceType) {
|
static <T extends HttpServlet> T createRestServlet(final Class userType0, final Class<T> baseServletType, final Class<? extends Service> serviceType) {
|
||||||
if (baseServletClass == null || serviceType == null) throw new RuntimeException(" Servlet or Service is null Class on createRestServlet");
|
if (baseServletType == 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");
|
if (!HttpServlet.class.isAssignableFrom(baseServletType)) throw new RuntimeException(baseServletType + " is not HttpServlet Class on createRestServlet");
|
||||||
int mod = baseServletClass.getModifiers();
|
int mod = baseServletType.getModifiers();
|
||||||
if (!java.lang.reflect.Modifier.isPublic(mod)) throw new RuntimeException(baseServletClass + " is not Public Class on createRestServlet");
|
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(baseServletClass + " is abstract 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 serviceDesc = Type.getDescriptor(serviceType);
|
||||||
final String webServletDesc = Type.getDescriptor(WebServlet.class);
|
final String webServletDesc = Type.getDescriptor(WebServlet.class);
|
||||||
@@ -131,11 +131,12 @@ public final class Rest {
|
|||||||
final String retInternalName = Type.getInternalName(RetResult.class);
|
final String retInternalName = Type.getInternalName(RetResult.class);
|
||||||
final String serviceTypeInternalName = Type.getInternalName(serviceType);
|
final String serviceTypeInternalName = Type.getInternalName(serviceType);
|
||||||
|
|
||||||
HttpUserType hut = baseServletClass.getAnnotation(HttpUserType.class);
|
HttpUserType hut = baseServletType.getAnnotation(HttpUserType.class);
|
||||||
final Class userType = hut == null ? Object.class : hut.value();
|
final Class userType = (userType0 == null || userType0 == Object.class) ? (hut == null ? null : hut.value()) : userType0;
|
||||||
final String supDynName = baseServletClass.getName().replace('.', '/');
|
|
||||||
|
final String supDynName = baseServletType.getName().replace('.', '/');
|
||||||
final RestService controller = serviceType.getAnnotation(RestService.class);
|
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();
|
ClassLoader loader = Sncp.class.getClassLoader();
|
||||||
String newDynName = serviceTypeInternalName.substring(0, serviceTypeInternalName.lastIndexOf('/') + 1) + "_Dyn" + serviceType.getSimpleName().replaceAll("Service.*$", "") + "RestServlet";
|
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) { //当前用户对象的类名
|
} else if ("&".equals(pname) && ptype == userType) { //当前用户对象的类名
|
||||||
mv.visitVarInsn(ALOAD, 1);
|
mv.visitVarInsn(ALOAD, 1);
|
||||||
mv.visitMethodInsn(INVOKEVIRTUAL, reqInternalName, "currentUser", "()Ljava/lang/Object;", false);
|
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);
|
mv.visitVarInsn(ASTORE, maxLocals);
|
||||||
varInsns.add(new int[]{ALOAD, maxLocals});
|
varInsns.add(new int[]{ALOAD, maxLocals});
|
||||||
} else if (ptype == boolean.class) {
|
} else if (ptype == boolean.class) {
|
||||||
|
|||||||
16
src/org/redkale/net/sncp/SncpFilter.java
Normal file
16
src/org/redkale/net/sncp/SncpFilter.java
Normal file
@@ -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<SncpContext, SncpRequest, SncpResponse> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -40,11 +40,13 @@ public class SncpPrepareServlet extends PrepareServlet<DLong, SncpContext, SncpR
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(SncpContext context, AnyValue config) {
|
public void init(SncpContext context, AnyValue config) {
|
||||||
|
super.init(context, config); //必须要执行
|
||||||
getServlets().forEach(s -> s.init(context, getServletConf(s)));
|
getServlets().forEach(s -> s.init(context, getServletConf(s)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroy(SncpContext context, AnyValue config) {
|
public void destroy(SncpContext context, AnyValue config) {
|
||||||
|
super.destroy(context, config); //必须要执行
|
||||||
getServlets().forEach(s -> s.destroy(context, getServletConf(s)));
|
getServlets().forEach(s -> s.destroy(context, getServletConf(s)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,19 @@ public class SncpServer extends Server<DLong, SncpContext, SncpRequest, SncpResp
|
|||||||
super.init(config);
|
super.init(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加SncpFilter
|
||||||
|
*
|
||||||
|
* @param filter SncpFilter
|
||||||
|
* @param conf AnyValue
|
||||||
|
*
|
||||||
|
* @return HttpServer
|
||||||
|
*/
|
||||||
|
public SncpServer addSncpFilter(SncpFilter filter, AnyValue conf) {
|
||||||
|
this.prepare.addFilter(filter, conf);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public void addSncpServlet(Service sncpService) {
|
public void addSncpServlet(Service sncpService) {
|
||||||
for (Class type : Sncp.getResourceTypes(sncpService)) {
|
for (Class type : Sncp.getResourceTypes(sncpService)) {
|
||||||
SncpDynServlet sds = new SncpDynServlet(BsonFactory.root().getConvert(), Sncp.getResourceName(sncpService), type, sncpService);
|
SncpDynServlet sds = new SncpDynServlet(BsonFactory.root().getConvert(), Sncp.getResourceName(sncpService), type, sncpService);
|
||||||
|
|||||||
16
src/org/redkale/watch/WatchFilter.java
Normal file
16
src/org/redkale/watch/WatchFilter.java
Normal file
@@ -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.watch;
|
||||||
|
|
||||||
|
import org.redkale.net.http.HttpFilter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
*/
|
||||||
|
public abstract class WatchFilter extends HttpFilter {
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user