You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by da...@apache.org on 2022/10/09 03:21:14 UTC

[shenyu] branch master updated: [new: feature] not config rule (#4045)

This is an automated email from the ASF dual-hosted git repository.

daming pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new 8e71100da [new: feature] not config rule (#4045)
8e71100da is described below

commit 8e71100da4d9e246283a9bc66370ed3acc95ab56
Author: xiaoyu <xi...@apache.org>
AuthorDate: Sun Oct 9 11:21:07 2022 +0800

    [new: feature] not config rule (#4045)
    
    * [new: feature] not config rule
---
 .../shenyu/plugin/base/AbstractShenyuPlugin.java   | 53 ++++++++++++++++------
 .../apache/shenyu/plugin/cache/CachePlugin.java    | 15 +++++-
 .../shenyu/plugin/casdoor/CasdoorPlugin.java       |  4 +-
 .../plugin/context/path/ContextPathPlugin.java     | 36 +++++++++------
 .../plugin/context/path/ContextPathPluginTest.java |  1 +
 .../apache/shenyu/plugin/divide/DividePlugin.java  | 14 +++++-
 .../plugin/springcloud/SpringCloudPlugin.java      | 12 ++++-
 .../org/apache/shenyu/plugin/waf/WafPlugin.java    | 23 ++++++++--
 .../shenyu/plugin/websocket/WebSocketPlugin.java   | 18 ++++++--
 9 files changed, 133 insertions(+), 43 deletions(-)

diff --git a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/AbstractShenyuPlugin.java b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/AbstractShenyuPlugin.java
index b8d518d6d..06488341d 100644
--- a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/AbstractShenyuPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/AbstractShenyuPlugin.java
@@ -18,6 +18,7 @@
 package org.apache.shenyu.plugin.base;
 
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.shenyu.common.config.ShenyuConfig;
 import org.apache.shenyu.common.dto.ConditionData;
@@ -66,7 +67,7 @@ public abstract class AbstractShenyuPlugin implements ShenyuPlugin {
      * @return {@code Mono<Void>} to indicate when request handling is complete
      */
     protected abstract Mono<Void> doExecute(ServerWebExchange exchange, ShenyuPluginChain chain, SelectorData selector, RuleData rule);
-
+    
     /**
      * Process the Web request and (optionally) delegate to the next
      * {@code ShenyuPlugin} through the given {@link ShenyuPluginChain}.
@@ -90,15 +91,28 @@ public abstract class AbstractShenyuPlugin implements ShenyuPlugin {
                 }
                 Pair<Boolean, SelectorData> matchSelectorData = matchSelector(exchange, selectors);
                 selectorData = matchSelectorData.getRight();
-                if (matchSelectorData.getLeft()) {
-                    cacheSelectorDataIfEnabled(path, selectorData);
+                if (Objects.isNull(selectorData)) {
+                    if (matchCacheConfig.getEnabled() && matchSelectorData.getLeft()) {
+                        selectorData = new SelectorData();
+                        selectorData.setPluginName(named());
+                        cacheSelectorData(path, selectorData);
+                    }
+                    return handleSelectorIfNull(pluginName, exchange, chain);
+                } else {
+                    if (matchCacheConfig.getEnabled() && matchSelectorData.getLeft()) {
+                        cacheSelectorData(path, selectorData);
+                    }
+                }
+            } else {
+                if (StringUtils.isBlank(selectorData.getId())) {
+                    return handleSelectorIfNull(pluginName, exchange, chain);
                 }
-            }
-            if (Objects.isNull(selectorData)) {
-                return handleSelectorIfNull(pluginName, exchange, chain);
             }
             selectorLog(selectorData, pluginName);
-
+            if (Objects.nonNull(selectorData.getContinued()) && !selectorData.getContinued()) {
+                // if continued, not match rules
+                return doExecute(exchange, chain, selectorData, defaultRuleData(selectorData));
+            }
             List<RuleData> rules = BaseDataCache.getInstance().obtainRuleData(selectorData.getId());
             if (CollectionUtils.isEmpty(rules)) {
                 return handleRuleIfNull(pluginName, exchange, chain);
@@ -125,14 +139,16 @@ public abstract class AbstractShenyuPlugin implements ShenyuPlugin {
         }
     }
 
-    private void cacheSelectorDataIfEnabled(final String path, final SelectorData selectorData) {
-        if (matchCacheConfig.getEnabled() && Objects.nonNull(selectorData)) {
-            List<ConditionData> conditionList = selectorData.getConditionList();
-            if (CollectionUtils.isNotEmpty(conditionList)) {
-                boolean isUriCondition = conditionList.stream().allMatch(v -> URI_CONDITION_TYPE.equals(v.getParamType()));
-                if (isUriCondition) {
-                    MatchDataCache.getInstance().cacheSelectorData(path, selectorData, getMaxFreeMemory());
-                }
+    private void cacheSelectorData(final String path, final SelectorData selectorData) {
+        if (StringUtils.isBlank(selectorData.getId())) {
+            MatchDataCache.getInstance().cacheSelectorData(path, selectorData, getMaxFreeMemory());
+            return;
+        }
+        List<ConditionData> conditionList = selectorData.getConditionList();
+        if (CollectionUtils.isNotEmpty(conditionList)) {
+            boolean isUriCondition = conditionList.stream().allMatch(v -> URI_CONDITION_TYPE.equals(v.getParamType()));
+            if (isUriCondition) {
+                MatchDataCache.getInstance().cacheSelectorData(path, selectorData, getMaxFreeMemory());
             }
         }
     }
@@ -147,6 +163,13 @@ public abstract class AbstractShenyuPlugin implements ShenyuPlugin {
         }
         return null;
     }
+    
+    protected RuleData defaultRuleData(final SelectorData selectorData) {
+        RuleData ruleData = new RuleData();
+        ruleData.setSelectorId(selectorData.getId());
+        ruleData.setPluginName(selectorData.getPluginName());
+        return ruleData;
+    }
 
     protected Mono<Void> handleSelectorIfNull(final String pluginName, final ServerWebExchange exchange, final ShenyuPluginChain chain) {
         return chain.execute(exchange);
diff --git a/shenyu-plugin/shenyu-plugin-cache/shenyu-plugin-cache-handler/src/main/java/org/apache/shenyu/plugin/cache/CachePlugin.java b/shenyu-plugin/shenyu-plugin-cache/shenyu-plugin-cache-handler/src/main/java/org/apache/shenyu/plugin/cache/CachePlugin.java
index 3446a72f3..bf3f307ee 100644
--- a/shenyu-plugin/shenyu-plugin-cache/shenyu-plugin-cache-handler/src/main/java/org/apache/shenyu/plugin/cache/CachePlugin.java
+++ b/shenyu-plugin/shenyu-plugin-cache/shenyu-plugin-cache-handler/src/main/java/org/apache/shenyu/plugin/cache/CachePlugin.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.cache;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.common.dto.convert.rule.impl.CacheRuleHandle;
@@ -43,6 +44,8 @@ import java.util.Optional;
  * CacheWritePlugin.
  */
 public class CachePlugin extends AbstractShenyuPlugin {
+    
+    private final CacheRuleHandle defaultRuleHandle = new CacheRuleHandle();
 
     @Override
     public Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain,
@@ -61,11 +64,11 @@ public class CachePlugin extends AbstractShenyuPlugin {
                             return exchange.getResponse().writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(bytes))
                                     .doOnNext(data -> exchange.getResponse().getHeaders().setContentLength(data.readableByteCount())));
                         }
-                        CacheRuleHandle cacheRuleHandle = CachePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+                        CacheRuleHandle cacheRuleHandle = buildRuleHandle(rule);
                         return chain.execute(exchange.mutate().response(new CacheHttpResponse(exchange, cacheRuleHandle)).build());
                     });
         }
-        CacheRuleHandle cacheRuleHandle = CachePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        CacheRuleHandle cacheRuleHandle = buildRuleHandle(rule);
         return chain.execute(exchange.mutate().response(new CacheHttpResponse(exchange, cacheRuleHandle)).build());
     }
 
@@ -78,6 +81,14 @@ public class CachePlugin extends AbstractShenyuPlugin {
     public String named() {
         return PluginEnum.CACHE.getName();
     }
+    
+    private CacheRuleHandle buildRuleHandle(final RuleData rule) {
+        if (StringUtils.isNotEmpty(rule.getId())) {
+            return CachePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        } else {
+            return defaultRuleHandle;
+        }
+    }
 
     static class CacheHttpResponse extends ServerHttpResponseDecorator {
 
diff --git a/shenyu-plugin/shenyu-plugin-casdoor/src/main/java/org/apache/shenyu/plugin/casdoor/CasdoorPlugin.java b/shenyu-plugin/shenyu-plugin-casdoor/src/main/java/org/apache/shenyu/plugin/casdoor/CasdoorPlugin.java
index c3548e86d..7e0cbafb6 100644
--- a/shenyu-plugin/shenyu-plugin-casdoor/src/main/java/org/apache/shenyu/plugin/casdoor/CasdoorPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-casdoor/src/main/java/org/apache/shenyu/plugin/casdoor/CasdoorPlugin.java
@@ -36,6 +36,9 @@ import reactor.core.publisher.Mono;
 
 import java.util.Objects;
 
+/**
+ * The type Casdoor plugin.
+ */
 public class CasdoorPlugin extends AbstractShenyuPlugin {
 
     @Override
@@ -85,5 +88,4 @@ public class CasdoorPlugin extends AbstractShenyuPlugin {
         mutate.header("organization", casdoorUser.getOwner());
         return exchange.mutate().request(mutate.build()).build();
     }
-
 }
diff --git a/shenyu-plugin/shenyu-plugin-context-path/src/main/java/org/apache/shenyu/plugin/context/path/ContextPathPlugin.java b/shenyu-plugin/shenyu-plugin-context-path/src/main/java/org/apache/shenyu/plugin/context/path/ContextPathPlugin.java
index 4fd0b916d..0c19a3850 100644
--- a/shenyu-plugin/shenyu-plugin-context-path/src/main/java/org/apache/shenyu/plugin/context/path/ContextPathPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-context-path/src/main/java/org/apache/shenyu/plugin/context/path/ContextPathPlugin.java
@@ -26,9 +26,6 @@ import org.apache.shenyu.common.enums.PluginEnum;
 import org.apache.shenyu.common.enums.RpcTypeEnum;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
 import org.apache.shenyu.plugin.api.context.ShenyuContext;
-import org.apache.shenyu.plugin.api.result.ShenyuResultEnum;
-import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
-import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
 import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
 import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
 import org.apache.shenyu.plugin.context.path.handler.ContextPathPluginDataHandler;
@@ -46,23 +43,24 @@ public class ContextPathPlugin extends AbstractShenyuPlugin {
     
     private static final Logger LOG = LoggerFactory.getLogger(ContextPathPlugin.class);
     
+    private final ContextMappingRuleHandle defaultRuleHandle;
+    
+    {
+        defaultRuleHandle = new ContextMappingRuleHandle();
+        defaultRuleHandle.setAddPrefixed(true);
+        defaultRuleHandle.setContextPath("/default");
+    }
+    
     @Override
     protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector, final RuleData rule) {
         ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
         assert shenyuContext != null;
-        ContextMappingRuleHandle contextMappingRuleHandle = ContextPathPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
-        if (Objects.isNull(contextMappingRuleHandle)) {
+        ContextMappingRuleHandle ruleHandle = buildRuleHandle(rule);
+        if (Objects.isNull(ruleHandle)) {
             LOG.error("context path rule configuration is null :{}", rule);
             return chain.execute(exchange);
         }
-        String contextPath = contextMappingRuleHandle.getContextPath();
-        if (StringUtils.isNoneBlank(contextPath) && !shenyuContext.getPath().startsWith(contextPath)) {
-            LOG.error("the context path '{}' is invalid.", contextPath);
-            Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.CONTEXT_PATH_ERROR.getCode(),
-                    String.format("%s [invalid context path:'%s']", ShenyuResultEnum.CONTEXT_PATH_ERROR.getMsg(), contextPath), null);
-            return WebFluxResultUtils.result(exchange, error);
-        }
-        buildContextPath(shenyuContext, contextMappingRuleHandle);
+        buildRealURI(shenyuContext, ruleHandle);
         return chain.execute(exchange);
     }
     
@@ -86,13 +84,21 @@ public class ContextPathPlugin extends AbstractShenyuPlugin {
                 RpcTypeEnum.SOFA);
     }
     
+    private ContextMappingRuleHandle buildRuleHandle(final RuleData rule) {
+        if (StringUtils.isNotEmpty(rule.getId())) {
+            return ContextPathPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        } else {
+            return defaultRuleHandle;
+        }
+    }
+    
     /**
-     * Build the context path and realUrl.
+     * Build the realUrl.
      *
      * @param context context
      * @param handle  handle
      */
-    private void buildContextPath(final ShenyuContext context, final ContextMappingRuleHandle handle) {
+    private void buildRealURI(final ShenyuContext context, final ContextMappingRuleHandle handle) {
         String realURI = "";
         String contextPath = handle.getContextPath();
         if (StringUtils.isNoneBlank(contextPath)) {
diff --git a/shenyu-plugin/shenyu-plugin-context-path/src/test/java/org/apache/shenyu/plugin/context/path/ContextPathPluginTest.java b/shenyu-plugin/shenyu-plugin-context-path/src/test/java/org/apache/shenyu/plugin/context/path/ContextPathPluginTest.java
index 3ebd3459b..341d9924b 100644
--- a/shenyu-plugin/shenyu-plugin-context-path/src/test/java/org/apache/shenyu/plugin/context/path/ContextPathPluginTest.java
+++ b/shenyu-plugin/shenyu-plugin-context-path/src/test/java/org/apache/shenyu/plugin/context/path/ContextPathPluginTest.java
@@ -86,6 +86,7 @@ public final class ContextPathPluginTest {
         shenyuContext.setPath("/http/context/order/findById");
         ContextMappingRuleHandle contextMappingRuleHandle = new ContextMappingRuleHandle();
         contextMappingRuleHandle.setContextPath("/http/context");
+        when(ruleData.getId()).thenReturn("1");
         CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(ruleData), contextMappingRuleHandle);
         when(ruleData.getHandle()).thenReturn(GsonUtils.getGson().toJson(contextMappingRuleHandle));
         contextPathPlugin.doExecute(exchange, chain, selectorData, ruleData);
diff --git a/shenyu-plugin/shenyu-plugin-divide/src/main/java/org/apache/shenyu/plugin/divide/DividePlugin.java b/shenyu-plugin/shenyu-plugin-divide/src/main/java/org/apache/shenyu/plugin/divide/DividePlugin.java
index 1cd5e7b6f..7ead17ed9 100644
--- a/shenyu-plugin/shenyu-plugin-divide/src/main/java/org/apache/shenyu/plugin/divide/DividePlugin.java
+++ b/shenyu-plugin/shenyu-plugin-divide/src/main/java/org/apache/shenyu/plugin/divide/DividePlugin.java
@@ -54,12 +54,14 @@ import java.util.Objects;
 public class DividePlugin extends AbstractShenyuPlugin {
 
     private static final Logger LOG = LoggerFactory.getLogger(DividePlugin.class);
+    
+    private final DivideRuleHandle defaultRuleHandle = new DivideRuleHandle();
 
     @Override
     protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector, final RuleData rule) {
         ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
         assert shenyuContext != null;
-        DivideRuleHandle ruleHandle = DividePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        DivideRuleHandle ruleHandle = buildRuleHandle(rule);
         if (ruleHandle.getHeaderMaxSize() > 0) {
             long headerSize = exchange.getRequest().getHeaders().values()
                     .stream()
@@ -81,7 +83,7 @@ public class DividePlugin extends AbstractShenyuPlugin {
         }
         List<Upstream> upstreamList = UpstreamCacheManager.getInstance().findUpstreamListBySelectorId(selector.getId());
         if (CollectionUtils.isEmpty(upstreamList)) {
-            LOG.error("divide upstream configuration error: {}", rule);
+            LOG.error("divide upstream configuration error: {}", selector);
             Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.CANNOT_FIND_HEALTHY_UPSTREAM_URL);
             return WebFluxResultUtils.result(exchange, error);
         }
@@ -129,4 +131,12 @@ public class DividePlugin extends AbstractShenyuPlugin {
     protected Mono<Void> handleRuleIfNull(final String pluginName, final ServerWebExchange exchange, final ShenyuPluginChain chain) {
         return WebFluxResultUtils.noRuleResult(pluginName, exchange);
     }
+    
+    private DivideRuleHandle buildRuleHandle(final RuleData rule) {
+        if (StringUtils.isNotEmpty(rule.getId())) {
+            return DividePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        } else {
+            return defaultRuleHandle;
+        }
+    }
 }
diff --git a/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/SpringCloudPlugin.java b/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/SpringCloudPlugin.java
index 37c0d6e42..62163d0b0 100644
--- a/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/SpringCloudPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/SpringCloudPlugin.java
@@ -47,6 +47,8 @@ import java.util.Objects;
 public class SpringCloudPlugin extends AbstractShenyuPlugin {
 
     private final ShenyuSpringCloudServiceChooser serviceChooser;
+    
+    private final SpringCloudRuleHandle defaultRuleHandle = new SpringCloudRuleHandle();
 
     /**
      * Instantiates a new Spring cloud plugin.
@@ -66,7 +68,7 @@ public class SpringCloudPlugin extends AbstractShenyuPlugin {
         final ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
         assert shenyuContext != null;
         final SpringCloudSelectorHandle springCloudSelectorHandle = SpringCloudPluginDataHandler.SELECTOR_CACHED.get().obtainHandle(selector.getId());
-        final SpringCloudRuleHandle ruleHandle = SpringCloudPluginDataHandler.RULE_CACHED.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        final SpringCloudRuleHandle ruleHandle = buildRuleHandle(rule);
         String serviceId = springCloudSelectorHandle.getServiceId();
         if (StringUtils.isBlank(serviceId)) {
             Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.CANNOT_CONFIG_SPRINGCLOUD_SERVICEID);
@@ -115,6 +117,14 @@ public class SpringCloudPlugin extends AbstractShenyuPlugin {
     protected Mono<Void> handleRuleIfNull(final String pluginName, final ServerWebExchange exchange, final ShenyuPluginChain chain) {
         return WebFluxResultUtils.noRuleResult(pluginName, exchange);
     }
+    
+    private SpringCloudRuleHandle buildRuleHandle(final RuleData rule) {
+        if (StringUtils.isNotEmpty(rule.getId())) {
+            return SpringCloudPluginDataHandler.RULE_CACHED.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        } else {
+            return defaultRuleHandle;
+        }
+    }
 
     private void setDomain(final URI uri, final ServerWebExchange exchange) {
         String domain = uri.getScheme() + "://" + uri.getAuthority();
diff --git a/shenyu-plugin/shenyu-plugin-waf/src/main/java/org/apache/shenyu/plugin/waf/WafPlugin.java b/shenyu-plugin/shenyu-plugin-waf/src/main/java/org/apache/shenyu/plugin/waf/WafPlugin.java
index 4437f858b..fe94b0c5b 100644
--- a/shenyu-plugin/shenyu-plugin-waf/src/main/java/org/apache/shenyu/plugin/waf/WafPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-waf/src/main/java/org/apache/shenyu/plugin/waf/WafPlugin.java
@@ -25,12 +25,12 @@ import org.apache.shenyu.common.dto.convert.rule.WafHandle;
 import org.apache.shenyu.common.enums.PluginEnum;
 import org.apache.shenyu.common.enums.WafEnum;
 import org.apache.shenyu.common.enums.WafModelEnum;
+import org.apache.shenyu.common.utils.Singleton;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
 import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
 import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
 import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
 import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
-import org.apache.shenyu.common.utils.Singleton;
 import org.apache.shenyu.plugin.waf.config.WafConfig;
 import org.apache.shenyu.plugin.waf.handler.WafPluginDataHandler;
 import org.slf4j.Logger;
@@ -47,6 +47,14 @@ import java.util.Objects;
 public class WafPlugin extends AbstractShenyuPlugin {
 
     private static final Logger LOG = LoggerFactory.getLogger(WafPlugin.class);
+    
+    private final WafHandle defaultWafHandle;
+    
+    {
+        defaultWafHandle = new WafHandle();
+        defaultWafHandle.setStatusCode(String.valueOf(HttpStatus.FORBIDDEN.value()));
+        defaultWafHandle.setPermission(WafEnum.REJECT.getName());
+    }
 
     @Override
     protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector, final RuleData rule) {
@@ -59,10 +67,9 @@ public class WafPlugin extends AbstractShenyuPlugin {
             Object error = ShenyuResultWrap.error(exchange, HttpStatus.FORBIDDEN.value(), Constants.REJECT_MSG, null);
             return WebFluxResultUtils.result(exchange, error);
         }
-        String handle = rule.getHandle();
-        WafHandle wafHandle = WafPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        WafHandle wafHandle = buildRuleHandle(rule);
         if (Objects.isNull(wafHandle) || StringUtils.isBlank(wafHandle.getPermission())) {
-            LOG.error("waf handler can not configuration:{}", handle);
+            LOG.error("waf handler can not configuration:{}", wafHandle);
             return chain.execute(exchange);
         }
         if (WafEnum.REJECT.getName().equals(wafHandle.getPermission())) {
@@ -92,4 +99,12 @@ public class WafPlugin extends AbstractShenyuPlugin {
     public int getOrder() {
         return PluginEnum.WAF.getCode();
     }
+    
+    private WafHandle buildRuleHandle(final RuleData rule) {
+        if (StringUtils.isNotEmpty(rule.getId())) {
+            return WafPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        } else {
+            return defaultWafHandle;
+        }
+    }
 }
diff --git a/shenyu-plugin/shenyu-plugin-websocket/src/main/java/org/apache/shenyu/plugin/websocket/WebSocketPlugin.java b/shenyu-plugin/shenyu-plugin-websocket/src/main/java/org/apache/shenyu/plugin/websocket/WebSocketPlugin.java
index 4f2acd27c..772506096 100644
--- a/shenyu-plugin/shenyu-plugin-websocket/src/main/java/org/apache/shenyu/plugin/websocket/WebSocketPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-websocket/src/main/java/org/apache/shenyu/plugin/websocket/WebSocketPlugin.java
@@ -22,10 +22,9 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.dto.SelectorData;
-import org.apache.shenyu.common.dto.convert.rule.impl.DivideRuleHandle;
+import org.apache.shenyu.common.dto.convert.rule.impl.WebSocketRuleHandle;
 import org.apache.shenyu.common.enums.PluginEnum;
 import org.apache.shenyu.common.enums.RpcTypeEnum;
-import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.shenyu.loadbalancer.cache.UpstreamCacheManager;
 import org.apache.shenyu.loadbalancer.entity.Upstream;
 import org.apache.shenyu.loadbalancer.factory.LoadBalancerFactory;
@@ -36,6 +35,8 @@ import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
 import org.apache.shenyu.plugin.api.utils.RequestQueryCodecUtil;
 import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
 import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
+import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
+import org.apache.shenyu.plugin.websocket.handler.WebSocketPluginDataHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
@@ -66,10 +67,13 @@ public class WebSocketPlugin extends AbstractShenyuPlugin {
     
     private static final String SEC_WEB_SOCKET_PROTOCOL = "Sec-WebSocket-Protocol";
     
+    private final WebSocketRuleHandle defaultRuleHandle = new WebSocketRuleHandle();
+    
     private final WebSocketClient webSocketClient;
     
     private final WebSocketService webSocketService;
     
+    
     /**
      * Instantiates a new Web socket plugin.
      *
@@ -89,7 +93,7 @@ public class WebSocketPlugin extends AbstractShenyuPlugin {
             LOG.error("websocket upstream configuration error:{}", rule);
             return chain.execute(exchange);
         }
-        final DivideRuleHandle ruleHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), DivideRuleHandle.class);
+        final WebSocketRuleHandle ruleHandle = buildRuleHandle(rule);
         final String ip = Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getAddress().getHostAddress();
         Upstream upstream = LoadBalancerFactory.selector(upstreamList, ruleHandle.getLoadBalance(), ip);
         if (Objects.isNull(upstream)) {
@@ -104,6 +108,14 @@ public class WebSocketPlugin extends AbstractShenyuPlugin {
                 wsRequestUrl, this.webSocketClient, filterHeaders(headers), buildWsProtocols(headers)));
     }
     
+    private WebSocketRuleHandle buildRuleHandle(final RuleData rule) {
+        if (StringUtils.hasLength(rule.getId())) {
+            return WebSocketPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+        } else {
+            return defaultRuleHandle;
+        }
+    }
+    
     private String buildWsRealPath(final ServerWebExchange exchange, final Upstream upstream, final ShenyuContext shenyuContext) {
         String protocol = upstream.getProtocol();
         if (!StringUtils.hasLength(protocol)) {