From c3434d1c1f9f7d1e3126d9b01b04218b49cfb59f Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 27 Jun 2023 12:09:37 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-98879=20=E4=BF=AE=E5=A4=8Djxbrowser7?= =?UTF-8?q?=E5=9C=A8windows=E4=B8=8B=E8=B7=AF=E5=BE=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/jxbrowser/JxUIPane.java | 25 ++++++++++++++++--- .../jxbrowser/NxInterceptRequestCallback.java | 10 ++++++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java index 1a968551df..efbca4a47e 100644 --- a/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java @@ -8,6 +8,7 @@ import com.fr.design.ui.ModernUIConstants; import com.fr.design.ui.ModernUIPane; import com.fr.stable.StringUtils; import com.fr.stable.collections.combination.Pair; +import com.fr.stable.os.OperatingSystem; import com.fr.web.struct.AssembleComponent; import com.teamdev.jxbrowser.browser.Browser; import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; @@ -47,6 +48,12 @@ import static com.fr.design.ui.ModernUIConstants.WINDOW; */ public class JxUIPane extends ModernUIPane { + /** + * 冒号 + */ + public static final String COLON = ":"; + private static final String COLON_ESCAPE = "\\:"; + private Browser browser; private String namespace = "Pool"; private String variable = "data"; @@ -126,7 +133,7 @@ public class JxUIPane extends ModernUIPane { */ @Override public void redirect(String url) { - browser.navigation().loadUrl(url); + browser.navigation().loadUrl(encodeWindowsPath(url)); } /** @@ -138,7 +145,7 @@ public class JxUIPane extends ModernUIPane { @Override public void redirect(String url, Map map) { setMap(map); - browser.navigation().loadUrl(url); + browser.navigation().loadUrl(encodeWindowsPath(url)); } private void setMap(Map map) { @@ -220,6 +227,18 @@ public class JxUIPane extends ModernUIPane { return Optional.ofNullable(frame.executeJavaScript(name)); } + /** + * 由于自定义scheme目前走的是url,因此路径会被自动转化,比如windows路径下对冒号问题 + * C:\\abc 变成 /C/abc,这里对冒号进行编码转义 + */ + private static String encodeWindowsPath(String path) { + if (OperatingSystem.isWindows() && path.startsWith(EMB_TAG + SCHEME_HEADER)) { + String s = path.split(EMB_TAG + SCHEME_HEADER)[1]; + return EMB_TAG + SCHEME_HEADER + s.replace(COLON, COLON_ESCAPE); + } + return path; + } + /** * JxUIPane 的建造者 * @@ -492,7 +511,7 @@ public class JxUIPane extends ModernUIPane { pane.browser.navigation().on(listenerPair.getFirst(), listenerPair.getSecond()); } if (StringUtils.isNotEmpty(this.url)) { - pane.browser.navigation().loadUrl(this.url); + pane.browser.navigation().loadUrl(encodeWindowsPath(this.url)); } else if (StringUtils.isNotEmpty(this.html)) { pane.browser.mainFrame().ifPresent(f -> f.loadHtml(html)); } diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java b/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java index 6a578afa6e..ada7b2fff8 100644 --- a/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java @@ -20,6 +20,7 @@ import com.teamdev.jxbrowser.net.callback.InterceptUrlRequestCallback; import org.jetbrains.annotations.NotNull; import java.io.InputStream; +import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Optional; @@ -36,6 +37,8 @@ import static com.fr.design.ui.ModernUIConstants.COMPONENT_TAG; */ public class NxInterceptRequestCallback implements InterceptUrlRequestCallback { + private static final String COLON_DECODE_ESCAPE = "/:"; + private static final String SCHEME_SPLIT = ":/"; private Supplier component; private Supplier> renderParameterBuild; @@ -61,7 +64,7 @@ public class NxInterceptRequestCallback implements InterceptUrlRequestCallback { @Override public Response on(Params params) { UrlRequest urlRequest = params.urlRequest(); - String path = urlRequest.url(); + String path = urlRequest.url().replace(COLON_DECODE_ESCAPE, JxUIPane.COLON); Optional urlRequestJobOptional; if (path.startsWith(COMPONENT_TAG)) { String text = htmlText(renderParameterBuild.get()); @@ -107,7 +110,10 @@ public class NxInterceptRequestCallback implements InterceptUrlRequestCallback { path = path.substring(index + 1); } else { // jxbrowser 7之后,协议会自动补齐双斜杠// - path = path.split(":/")[1]; + int i = path.indexOf(SCHEME_SPLIT); + path = path.substring(i + SCHEME_SPLIT.length()); + // 通过自定义协议之后的url会自动encode一些中文字符,这里做一个decode,否则会导致路径访问失败 + path = URLDecoder.decode(path, StandardCharsets.UTF_8.name()); } return IOUtils.readResource(path); }