This commit is contained in:
@@ -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<Servlet> createServletClassFilter() {
|
||||
return createClassFilter(null, WebServlet.class, HttpServlet.class, new Class[]{WatchServlet.class}, null, "servlets", "servlet");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ClassFilter<Service> createServiceClassFilter() {
|
||||
return createClassFilter(this.sncpGroup, null, Service.class, new Class[]{WatchService.class}, Annotation.class, "services", "service");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadServlet(ClassFilter<? extends Servlet> servletFilter) throws Exception {
|
||||
if (httpServer != null) loadHttpServlet(this.serverConf.getAnyValue("servlets"), servletFilter);
|
||||
protected ClassFilter<Filter> createFilterClassFilter() {
|
||||
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
|
||||
@@ -72,6 +72,16 @@ public class NodeHttpServer extends NodeServer {
|
||||
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() {
|
||||
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<? 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 {
|
||||
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<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>();
|
||||
for (FilterEntry<? extends Servlet> en : list) {
|
||||
Class<HttpServlet> clazz = (Class<HttpServlet>) 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<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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<Servlet> servletFilter = createServletClassFilter();
|
||||
ClassFilter<Service> serviceFilter = createServiceClassFilter();
|
||||
ClassFilter<Filter> filterFilter = createFilterClassFilter();
|
||||
ClassFilter<Servlet> 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<? extends Filter> filterFilter) throws Exception;
|
||||
|
||||
protected abstract void loadServlet(ClassFilter<? extends Servlet> servletFilter) throws Exception;
|
||||
|
||||
private void initResource() {
|
||||
@@ -477,6 +488,8 @@ public abstract class NodeServer {
|
||||
return transport;
|
||||
}
|
||||
|
||||
protected abstract ClassFilter<Filter> createFilterClassFilter();
|
||||
|
||||
protected abstract ClassFilter<Servlet> createServletClassFilter();
|
||||
|
||||
protected ClassFilter<Service> createServiceClassFilter() {
|
||||
@@ -486,10 +499,19 @@ public abstract class NodeServer {
|
||||
protected ClassFilter createClassFilter(final String localGroup, Class<? extends Annotation> ref,
|
||||
Class inter, Class[] excludeSuperClasses, Class<? extends Annotation> 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;
|
||||
|
||||
@@ -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<? 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
|
||||
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
|
||||
protected ClassFilter<Servlet> createServletClassFilter() {
|
||||
return null;
|
||||
|
||||
@@ -28,6 +28,11 @@ public class NodeWatchServer extends NodeHttpServer {
|
||||
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
|
||||
protected ClassFilter<Servlet> createServletClassFilter() {
|
||||
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 List<Filter<C, R, P>> filters = new ArrayList<>();
|
||||
|
||||
protected Filter<C, R, P> headFilter;
|
||||
|
||||
protected void putServlet(S servlet) {
|
||||
synchronized (lock1) {
|
||||
Set<S> newservlets = new HashSet<>(servlets);
|
||||
@@ -62,6 +66,36 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
|
||||
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 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) {
|
||||
response.context.offerBuffer(buffer);
|
||||
request.prepare();
|
||||
this.execute(request, response);
|
||||
response.filter = this.headFilter;
|
||||
response.servlet = this;
|
||||
response.nextEvent();
|
||||
} else {
|
||||
buffer.clear();
|
||||
final AtomicInteger ai = new AtomicInteger(rs);
|
||||
@@ -91,7 +127,9 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
|
||||
response.context.offerBuffer(buffer);
|
||||
request.prepare();
|
||||
try {
|
||||
execute(request, response);
|
||||
response.filter = PrepareServlet.this.headFilter;
|
||||
response.servlet = PrepareServlet.this;
|
||||
response.nextEvent();
|
||||
} catch (Exception e) {
|
||||
illRequestCounter.incrementAndGet();
|
||||
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 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>() {
|
||||
|
||||
@@ -117,7 +119,8 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
||||
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<C extends Context, R extends Request<C>> {
|
||||
this.request.createtime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <S extends Servlet> void thenEvent(S nextServlet) {
|
||||
this.nextServlet = nextServlet;
|
||||
protected void setFilter(Filter<C, R, Response<C, R>> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
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
|
||||
public void init(HttpContext context, AnyValue config) {
|
||||
super.init(context, config); //必须要执行
|
||||
Collection<HttpServlet> servlets = getServlets();
|
||||
servlets.forEach(s -> {
|
||||
s.preInit(context, getServletConf(s));
|
||||
@@ -269,6 +270,7 @@ public class HttpPrepareServlet extends PrepareServlet<String, HttpContext, Http
|
||||
|
||||
@Override
|
||||
public void destroy(HttpContext context, AnyValue config) {
|
||||
super.destroy(context, config); //必须要执行
|
||||
this.resourceHttpServlet.destroy(context, config);
|
||||
getServlets().forEach(s -> {
|
||||
s.destroy(context, getServletConf(s));
|
||||
|
||||
@@ -178,6 +178,11 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
||||
return v == null ? defValue : v;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void thenEvent(Servlet servlet) {
|
||||
this.servlet = servlet;
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加Cookie值
|
||||
*
|
||||
|
||||
@@ -46,6 +46,19 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
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
|
||||
*
|
||||
@@ -87,7 +100,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
this.prepare.addServlet(servlet, prefix, conf, mappings);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 添加RestServlet
|
||||
*
|
||||
@@ -95,14 +108,14 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
* @param <T> RestServlet
|
||||
* @param name Service的资源名
|
||||
* @param serviceType Service的类型
|
||||
* @param service Service对象
|
||||
* @param service Service对象
|
||||
* @param baseServletClass RestServlet基类
|
||||
* @param prefix url前缀
|
||||
*
|
||||
* @return RestServlet
|
||||
*/
|
||||
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 serviceType Service的类型
|
||||
* @param service Service对象
|
||||
* @param userType 用户数据类型
|
||||
* @param baseServletClass RestServlet基类
|
||||
* @param prefix url前缀
|
||||
* @param conf 配置信息
|
||||
*
|
||||
* @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 配置信息
|
||||
*
|
||||
* @return RestServlet
|
||||
*/
|
||||
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;
|
||||
for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) {
|
||||
if (!(item instanceof HttpServlet)) continue;
|
||||
@@ -137,7 +169,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
}
|
||||
}
|
||||
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
|
||||
try { //若提供动态变更Service服务功能,则改Rest服务无法做出相应更新
|
||||
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) {
|
||||
this.charset = charsetName == null ? UTF8 : charsetName;
|
||||
this.contentType = contentType.trim();
|
||||
this.contentType = contentType == null ? "" : contentType.trim();
|
||||
this.parameters = params;
|
||||
this.boundary = parseBoundary(this.contentType);
|
||||
this.endboundarray = ("--" + this.boundary + "--").getBytes();
|
||||
|
||||
@@ -104,12 +104,12 @@ public final class Rest {
|
||||
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) {
|
||||
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 extends HttpServlet> T createRestServlet(final Class userType0, final Class<T> baseServletType, final Class<? extends Service> 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) {
|
||||
|
||||
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
|
||||
public void init(SncpContext context, AnyValue config) {
|
||||
super.init(context, config); //必须要执行
|
||||
getServlets().forEach(s -> 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)));
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,19 @@ public class SncpServer extends Server<DLong, SncpContext, SncpRequest, SncpResp
|
||||
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) {
|
||||
for (Class type : Sncp.getResourceTypes(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