From f15754386b4a8c40a5a53a0ccfd182806763252e Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sun, 14 May 2017 12:27:27 +0800 Subject: [PATCH] --- .../redkale/net/http/HttpPrepareServlet.java | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index ea25463ac..f81339fbe 100644 --- a/src/org/redkale/net/http/HttpPrepareServlet.java +++ b/src/org/redkale/net/http/HttpPrepareServlet.java @@ -41,16 +41,29 @@ public class HttpPrepareServlet extends PrepareServlet> excludeUrlMaps; //禁用的URL的正则表达式, 必须与 excludeUrlPredicates 保持一致 + private Map> excludeUrlMaps; //禁用的URL的正则表达式, 必须与 excludeUrlPredicates 保持一致 - private Predicate[] excludeUrlPredicates; //禁用的URL的Predicate, 必须与 excludeUrlMaps 保持一致 + private BiPredicate[] excludeUrlPredicates; //禁用的URL的Predicate, 必须与 excludeUrlMaps 保持一致 public void addExcludeUrlReg(final String urlreg) { if (urlreg == null || urlreg.isEmpty()) return; synchronized (excludeLock) { if (excludeUrlMaps != null && excludeUrlMaps.containsKey(urlreg)) return; if (excludeUrlMaps == null) excludeUrlMaps = new HashMap<>(); - Predicate predicate = Pattern.compile(urlreg).asPredicate(); + String mapping = urlreg; + if (Utility.contains(mapping, '.', '*', '{', '[', '(', '|', '^', '$', '+', '?', '\\')) { //是否是正则表达式)) + if (mapping.endsWith("/*")) { + mapping = mapping.substring(0, mapping.length() - 1) + ".*"; + } else { + mapping = mapping + "$"; + } + } + final String reg = mapping; + final boolean begin = mapping.charAt(0) == '^'; + final Predicate regPredicate = Pattern.compile(reg).asPredicate(); + BiPredicate predicate = (prefix, uri) -> { + return begin || prefix.isEmpty() ? regPredicate.test(uri) : uri.matches(prefix + reg); + }; excludeUrlMaps.put(urlreg, predicate); excludeUrlPredicates = Utility.append(excludeUrlPredicates, predicate); } @@ -60,7 +73,7 @@ public class HttpPrepareServlet extends PrepareServlet predicate = excludeUrlMaps.get(urlreg); + BiPredicate predicate = excludeUrlMaps.get(urlreg); excludeUrlMaps.remove(urlreg); int index = -1; for (int i = 0; i < excludeUrlPredicates.length; i++) { @@ -74,7 +87,7 @@ public class HttpPrepareServlet extends PrepareServlet 0) { - for (Predicate predicate : excludeUrlPredicates) { - if (predicate != null && predicate.test(uri)) { - forbid = true; - break; - } - } - } - if (forbid) { - response.finish(403, response.getHttpCode(403)); - return; - } - Servlet servlet = null; + HttpServlet servlet = null; if (request.isWebSocket()) { servlet = wsmappings.get(uri); if (servlet == null && this.regWsArray != null) { @@ -168,6 +168,19 @@ public class HttpPrepareServlet extends PrepareServlet 0) { + for (BiPredicate predicate : excludeUrlPredicates) { + if (predicate != null && predicate.test(servlet._prefix, uri)) { + forbid = true; + break; + } + } + } + if (forbid) { + response.finish(403, response.getHttpCode(403)); + return; + } servlet.execute(request, response); } catch (Exception e) { request.getContext().getLogger().log(Level.WARNING, "Servlet occur, forece to close channel. request = " + request, e);