diff --git a/CHANGELOG.md b/CHANGELOG.md index 490fece57..fddf0f48a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,10 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.20(2023-05-27) +# 5.8.20(2023-05-28) ### 🐣新特性 +* 【core 】 UrlQuery增加setStrict方法,区分是否严格模式(issue#I78PB1@Gitee) ### 🐞Bug修复 diff --git a/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java b/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java index d3811b162..5cd56ca13 100755 --- a/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java @@ -69,12 +69,26 @@ public class RFC3986 { */ public static final PercentCodec QUERY_PARAM_VALUE = PercentCodec.of(QUERY).removeSafe('&'); + /** + * query中的value编码器,严格模式,value中不能包含任何分隔符。 + * + * @since 6.0.0 + */ + public static final PercentCodec QUERY_PARAM_VALUE_STRICT = UNRESERVED; + /** * query中的key
* key不能包含"{@code &}" 和 "=" */ public static final PercentCodec QUERY_PARAM_NAME = PercentCodec.of(QUERY_PARAM_VALUE).removeSafe('='); + /** + * query中的key编码器,严格模式,key中不能包含任何分隔符。 + * + * @since 6.0.0 + */ + public static final PercentCodec QUERY_PARAM_NAME_STRICT = UNRESERVED; + /** * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" * diff --git a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlQuery.java b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlQuery.java index 6a59c64f6..b9495f62d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlQuery.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlQuery.java @@ -33,6 +33,10 @@ public class UrlQuery { * 是否为x-www-form-urlencoded模式,此模式下空格会编码为'+' */ private final boolean isFormUrlEncoded; + /** + * 是否严格模式,严格模式下,query的name和value中均不允许有分隔符。 + */ + private boolean isStrict; /** * 构建UrlQuery @@ -136,6 +140,17 @@ public class UrlQuery { this.isFormUrlEncoded = isFormUrlEncoded; } + /** + * 设置是否严格模式 + * @param strict 是否严格模式 + * @return this + * @since 5.8.20 + */ + public UrlQuery setStrict(final boolean strict) { + isStrict = strict; + return this; + } + /** * 增加键值对 * @@ -254,6 +269,9 @@ public class UrlQuery { return build(FormUrlencoded.ALL, FormUrlencoded.ALL, charset, encodePercent); } + if (isStrict) { + return build(RFC3986.QUERY_PARAM_NAME_STRICT, RFC3986.QUERY_PARAM_VALUE_STRICT, charset, encodePercent); + } return build(RFC3986.QUERY_PARAM_NAME, RFC3986.QUERY_PARAM_VALUE, charset, encodePercent); } diff --git a/hutool-core/src/test/java/cn/hutool/core/net/UrlQueryTest.java b/hutool-core/src/test/java/cn/hutool/core/net/UrlQueryTest.java index c50b3c11b..ec5f19a05 100644 --- a/hutool-core/src/test/java/cn/hutool/core/net/UrlQueryTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/net/UrlQueryTest.java @@ -144,4 +144,15 @@ public class UrlQueryTest { final UrlQuery query = UrlQuery.of(queryStr, null); Assert.assertEquals(queryStr, query.toString()); } + + @Test + public void issueI78PB1Test() { + // 严格模式 + final UrlQuery query = new UrlQuery().setStrict(true); + query.add(":/?#[]@!$&'()*+,;= ", ":/?#[]@!$&'()*+,;= "); + + final String string = query.build(CharsetUtil.CHARSET_UTF_8); + Assert.assertEquals("%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%20=" + + "%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%20", string); + } }