You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
4.4 KiB
109 lines
4.4 KiB
3 years ago
|
package com.fr.plugin.core;
|
||
|
|
||
|
import com.fr.decision.ExtraDecisionClassManager;
|
||
|
import com.fr.decision.fun.GlobalRequestFilterProvider;
|
||
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
|
||
|
import com.fr.event.Event;
|
||
|
import com.fr.event.EventDispatcher;
|
||
|
import com.fr.event.Listener;
|
||
|
import com.fr.log.FineLoggerFactory;
|
||
|
import com.fr.plugin.context.PluginContext;
|
||
|
import com.fr.plugin.injectable.PluginModule;
|
||
|
import com.fr.plugin.observer.PluginEventType;
|
||
|
import com.fr.stable.StringUtils;
|
||
|
|
||
|
import javax.servlet.FilterChain;
|
||
|
import javax.servlet.FilterConfig;
|
||
|
import javax.servlet.http.HttpServletRequest;
|
||
|
import javax.servlet.http.HttpServletResponse;
|
||
|
import java.util.Set;
|
||
|
|
||
|
|
||
|
public class CKlobalRequestFilterPlaceHolder extends AbstractGlobalRequestFilterProvider {
|
||
|
private static final String CURRENT_PLUGIN_ID = "com.eco.plugin.xxx.dddl";//需要求个这两个配置
|
||
|
private static final String CURRENT_FILTER_NAME = "ckfilter";
|
||
|
private static GlobalRequestFilterProvider PLACE_HOLDER_IMPL_FILTER;
|
||
|
|
||
|
@Override
|
||
|
public void init(FilterConfig filterConfig) {
|
||
|
Set<GlobalRequestFilterProvider> providers = ExtraDecisionClassManager.getInstance().getArray(GlobalRequestFilterProvider.MARK_STRING);
|
||
|
if (providers != null) {
|
||
|
for (GlobalRequestFilterProvider provider : providers) {
|
||
|
String filterName = provider.filterName();
|
||
|
if (StringUtils.isNotEmpty(filterName) && CURRENT_FILTER_NAME.equals(filterName)) {
|
||
|
PLACE_HOLDER_IMPL_FILTER = provider;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
com.fr.stable.Filter<PluginContext> filter = new com.fr.stable.Filter<PluginContext>() {
|
||
|
@Override
|
||
|
public boolean accept(PluginContext context) {
|
||
|
String pluginId = context.getID();
|
||
|
return context.contain(PluginModule.ExtraDecision, GlobalRequestFilterProvider.MARK_STRING) && CURRENT_PLUGIN_ID.equals(pluginId);
|
||
|
}
|
||
|
};
|
||
|
Listener<PluginContext> listener = new Listener<PluginContext>() {
|
||
|
@Override
|
||
|
public void on(Event event, PluginContext context) {
|
||
|
Set<GlobalRequestFilterProvider> providers = context.getRuntime().get(PluginModule.ExtraDecision, GlobalRequestFilterProvider.MARK_STRING);
|
||
|
if (providers != null) {
|
||
|
for (GlobalRequestFilterProvider provider : providers) {
|
||
|
String filterName = provider.filterName();
|
||
|
if (StringUtils.isNotEmpty(filterName) && CURRENT_FILTER_NAME.equals(filterName)) {
|
||
|
PLACE_HOLDER_IMPL_FILTER = provider;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
EventDispatcher.listen(PluginEventType.AfterRun, listener, filter);
|
||
|
EventDispatcher.listen(PluginEventType.AfterActive, listener, filter);
|
||
|
EventDispatcher.listen(PluginEventType.BeforeStop, new Listener<PluginContext>() {
|
||
|
@Override
|
||
|
public void on(Event event, PluginContext context) {
|
||
|
PLACE_HOLDER_IMPL_FILTER = null;
|
||
|
}
|
||
|
}, filter);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public String filterName() {
|
||
|
return "HSGlobalRequestFilterPlaceHolder";
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public String[] urlPatterns() {
|
||
|
return new String[]{
|
||
|
"/*"
|
||
|
};
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
|
||
|
try {
|
||
|
process(request, response, filterChain);
|
||
|
} catch (Exception e) {
|
||
|
FineLoggerFactory.getLogger().error(e, e.getMessage());
|
||
|
try {
|
||
|
filterChain.doFilter(request, response);
|
||
|
} catch (Exception ex) {
|
||
|
FineLoggerFactory.getLogger().error(ex, ex.getMessage());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void process(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws Exception {
|
||
|
if (PLACE_HOLDER_IMPL_FILTER == null) {
|
||
|
if(FineLoggerFactory.getLogger().isDebugEnabled()) {
|
||
|
FineLoggerFactory.getLogger().debug("[GlobalRequestFilterPlaceHolder] placeHolderImplFilter 为 null");
|
||
|
}
|
||
|
filterChain.doFilter(request, response);
|
||
|
} else {
|
||
|
PLACE_HOLDER_IMPL_FILTER.doFilter(request, response, filterChain);
|
||
|
}
|
||
|
}
|
||
|
}
|