- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否有任何简单的方法可以使用 Java 验证 Diameter URI(如下所述)?
Note, a Diameter URI must have one of the forms:
aaa://FQDN[:PORT][;transport=TRANS][;protocol=PROT]
aaas://FQDN[:PORT][;transport=TRANS][;protocol=PROT]
The FQDN (mandatory) has to be replaced with the fully qualified host name (or IP), the PORT (optional, default is 3868) with the port number, TRANS (optional) with the transport protocol (can be TCP or SCTP) and PROT (optional) with diameter.
Some examples of the acceptable forms are:
aaa://server.com
aaa://127.0.0.1
aaa://server.com:1234
aaas://server.com:1234;transport=tcp
aaas://[::1]
aaas://[::1]:1234
aaas://[::1]:1234;transport=tcp;protocol=diameter
Note, as shown above, if using an IPv6 address, the address must be placed in box brackets, whereas the port number (if specified), with its colon separator, should be outside of the brackets.
我认为使用正则表达式执行此操作会非常困惑且难以理解,并且我见过的其他不使用正则表达式的示例看起来也很尴尬(例如 https://code.google.com/p/cipango/source/browse/trunk/cipango-diameter/src/main/java/org/cipango/diameter/util/AAAUri.java?r=763 )。
所以想知道是否有更好的方法来做到这一点,例如类似 URI validator 库的东西,它采用一些规则(例如上面的直径 URI 的规则),然后将它们应用于某些输入来验证它?
我还查看了 Google Guava 库,看看是否有任何可以提供帮助的内容,但我没有立即看到任何内容。
非常感谢!
最佳答案
由于 URI 类不够,而且实际上会为有效的直径 URI 创建异常,因此这不是一个简单的任务。
我认为是reg.ex。是这里的方法,但由于复杂性,如果将它放在辅助类中可能会更好。我同意您链接到的代码看起来不太好——您可以做得更好! :)
看一下下面的代码示例,其中我将正则表达式分解为各个部分,作为“记录”正在发生的事情的一种方式。
它并不完整,它是为了符合您的示例而创建的。特别是IP6类型地址需要工作。此外,您可能希望在验证中提供更多信息;比如为什么失败。
但至少这是一个开始,我认为它比您链接到的代码要好得多。它可能看起来有很多代码,但其中大部分实际上是打印语句和测试...:)此外,由于每个部分都被分解并保留为字段变量,因此您可以创建简单的 getter 来访问每个部分(如果这对您很重要)。
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DiameterUri {
private String diameterUri;
private String protocol;
private String host;
private String port;
private String[] params;
public DiameterUri(String diameterUri) throws URISyntaxException {
this.diameterUri = diameterUri;
validate();
System.out.println(diameterUri);
System.out.println(" protocol=" + protocol);
System.out.println(" host=" + host);
System.out.println(" port=" + port);
System.out.println(" params=" + Arrays.toString(params));
}
private void validate() throws URISyntaxException {
String protocol = "(aaa|aaas)://"; // protocol- required
String ip4 = "[A-Za-z0-9.]+"; // ip4 address - part of "host"
String ip6 = "\\[::1\\]"; // ip6 address - part of "host"
String host = "(" + ip4 + "|" + ip6 + ")"; // host - required
String port = "(:\\d+)?"; // port - optional (one occurrence)
String params = "((;[a-zA-Z0-9]+=[a-zA-Z0-9]+)*)"; // params - optional (multiple occurrences)
String regEx = protocol + host + port + params;
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(diameterUri);
if (matcher.matches()) {
this.protocol = matcher.group(1);
this.host = matcher.group(2);
this.port = matcher.group(3) == null ? null : matcher.group(3).substring(1);
String paramsFromUri = matcher.group(4);
if (paramsFromUri != null && paramsFromUri.length() > 0) {
this.params = paramsFromUri.substring(1).split(";");
} else {
this.params = new String[0];
}
} else {
throw new URISyntaxException(diameterUri, "invalid");
}
}
public static void main(String[] args) throws URISyntaxException {
new DiameterUri("aaa://server.com");
new DiameterUri("aaa://127.0.0.1");
new DiameterUri("aaa://server.com:1234");
new DiameterUri("aaas://server.com:1234;transport=tcp");
new DiameterUri("aaas://[::1]");
new DiameterUri("aaas://[::1]:1234");
new DiameterUri("aaas://[::1]:1234;transport=tcp;protocol=diameter");
try {
new DiameterUri("127.0.0.1");
throw new RuntimeException("Expected URISyntaxException");
} catch (URISyntaxException ignore) {}
}
}
关于java - 在 Java 中验证直径 URI 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15602263/
好吧,令人惊讶的是,我在 Google 中也找不到答案,也没有听到。 一些 html/css 专家可以告诉我们吗? 最佳答案 原因可能是没有默认尺寸。不同的浏览器以不同的方式呈现它们,HTML 中的很
例如,我有一个十进制格式的经纬度(而不是像lat=44.1°9.5'30''这样的度-小时-分钟)。要搜索附近的对象,必须将搜索“半径”指定为具有四个值的矩形: north = 44.1; south
我希望有人可以帮助我。 我有一个 n=2071 节点和 m=9023 边的无向图 g。 我使用 igraph 包计算了 R 中的图形密度并得到以下结果: > graph.density(g,loop=
给你一个连通的加权有向图 G = (V,E),直径 k 2->3->4->5->..->N 这样的路径具有非常低的权重之外,所有的边都具有非常大的权重,所以路径必须通过低成本边,因此通过所有节点。 如
有人能告诉我直径协议(protocol)使用的 GY 和 RO 接口(interface)之间的区别吗??? 据我了解,这两个接口(interface)看起来都非常相似,并且也使用了 AVP。 但我仍
首先,非常感谢您耐心解答我所知道的一个简单问题,任何有超过几周经验的人都可以解决这个问题。我看到人们在这里坚持不懈并乐于助人,我希望你愿意和我一起这样做。 这是我的 fiddle : http://j
我们正在努力为 OCS 创建一个直径适配器。目前我们的 AVP 字典由 go-diameter 提供。 我们正在尝试提供一个可配置的字典来支持关注 vendor 特定 AVP 以支持不同的网络提供商,
我是一名优秀的程序员,十分优秀!