检查URL在Java中是否有效的最佳方法是什么?
如果试图打电话new URL(urlString)并抓住一个MalformedURLException,但似乎对任何开头的东西感到满意http://.
我不关心建立联系,只关心有效性.有这个方法吗?Hibernate Validator中的注释?我应该使用正则表达式吗?
编辑: 接受的URL的一些示例是http://***和http://my favorite site!.
我正面临一个问题,我在我的代码中使用了UrlValidator.
UrlValidator urlValidator = UrlValidator.getInstance();
if(urlValidator.isValid(url)) {
throw new IllegalArgumentException( url + "not valid");
}
where url i'm passing is
[1]: http://localhost:8080/myapp/Education.html
Run Code Online (Sandbox Code Playgroud)
如果我正在传递url,我将收到IllegalArgumentException
[2]: https://www.google.co.in/
Run Code Online (Sandbox Code Playgroud)
它的工作正常.如何使此代码适用于localhost:8080
像'www.test.com'这样的字符串很好.像'www.888.com'这样的字符串很好.像'stackoverflow.com'这样的字符串很好.像'GOoGle.Com'这样的字符串很好.
为什么?因为那些是有效的网址.如果他们已经注册,则没有必要重要.
现在糟糕的字符串是:
'goog*d\x''manydots ... com'
为什么,因为你不能注册这些网址.
如果我在java中有一个字符串应该是一个好的url什么是验证它的最佳方法?
非常感谢
我有一个类似的网址,
http://localhost:8080/Project-war/utility/Login.jsf?fallback=%2FProject-war%2Fpublic_resources%2FShowDetails.jsf%3Fid%3D9
当请求登录页面时,会形成此 URL。成功登录后请求将重定向到的返回 URL 作为查询字符串参数附加到 URL。
如果这个 URL 被用户故意更改,
http://localhost:8080/Project-war/utility/Login.jsf?fallback=%2FProject-war%2Fpublic_resources%2FShowDetails.jsf%3Fid%
一些尾随字符已被删除。这是一个格式错误的 URL。在这种情况下,它会导致抛出以下异常。
WARNING: Error invoking requestInitialized method on ServletRequestListener org.jboss.weld.servlet.WeldListener
java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern
at org.glassfish.grizzly.http.util.URLDecoder.decode(URLDecoder.java:488)
at org.glassfish.grizzly.http.util.Parameters.processParameters(Parameters.java:654)
at org.glassfish.grizzly.http.util.Parameters.processParameters(Parameters.java:692)
at org.glassfish.grizzly.http.util.Parameters.handleQueryParameters(Parameters.java:335)
at org.glassfish.grizzly.http.server.Request.parseRequestParameters(Request.java:1995)
at org.glassfish.grizzly.http.server.Request.getParameter(Request.java:1052)
at org.apache.catalina.connector.Request.getParameter(Request.java:1547)
at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:448)
at org.jboss.weld.servlet.ConversationContextActivator.getConversationId(ConversationContextActivator.java:115)
at org.jboss.weld.servlet.ConversationContextActivator.activateConversationContext(ConversationContextActivator.java:82)
at org.jboss.weld.servlet.WeldListener.requestInitialized(WeldListener.java:201)
at org.apache.catalina.core.StandardContext.fireRequestInitializedEvent(StandardContext.java:5225)
at org.apache.catalina.core.StandardHostValve.preInvoke(StandardHostValve.java:647)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:166)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) …Run Code Online (Sandbox Code Playgroud) 我想在java中检查验证URL是否允许使用通配符.
我找到了一些关于在java中验证URL的好例子(REGEX,urlValidator),但是那些没有提供通配符.
这是我正在练习的内容:
CODE(urlValidator)
public void urlValidiTest(){
System.out.println(this.urlCheck("https://www.google.com"));
System.out.println(this.urlCheck("https://google.com"));
System.out.println(this.urlCheck("*.com"));
}
public boolean urlCheck(String url){
return new UrlValidator().isValid(url);
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT
真正
真正
假
CODE(正则表达式)
public void regexTest() {
String[] URLs = new String[] { "http://www.google.com", "http://google.com/","*.com" };
Pattern REGEX = Pattern.compile("(?i)^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$");
for (String url : URLs) {
Matcher matcher = REGEX.matcher(url);
if (matcher.find()) {
System.out.println(matcher.group());
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果
我想要做的是以上所有URL都有效.
我该如何解决这个问题呢?
任何评论将不胜感激.谢谢.
更新
我摆脱了方案部分,并在答案之后的域部分添加了|*和| \.*(|*和|.*给了我一个错误 - 无效的转义序列(有效的是\ b\t \n\f\r \n \"\') - 但我不确定更改是否正确).
现在它不允许"google.com"; …
我需要生成有效的 URL。
示例:我传递了 url: google.com 。生成器返回http://google.com/。
一些浏览器会这样做。我尝试做我自己的算法,但失败了。
另一个例子:www.yadayadayada.com/../test 返回http://www.yadayadayada.com/test/
public String generateValidURL(String url) {
int pos = 0;
try {
url = url.trim();
url = url.replaceAll(" ", "%20");
if (url.startsWith("http") && (!url.substring(4).startsWith("://"))) {
for (int i = 4; i < 7; i++) {
if ((url.charAt(i) == '/') || (url.charAt(i) == ':')) {
pos = i;
}
}
url = url.substring(pos + 1);
}
if(url.startsWith("https")){
url = url.replace("https", "http");
}
if (!url.startsWith("http")) {
url = "http://" + url; …Run Code Online (Sandbox Code Playgroud) 如何在android中验证URL ...我正在尝试使用正则表达式,但即使网址正确也始终返回false
使用的代码:
private boolean checkEmail(String email) {
return URL.matcher(email).matches();
}
public final Pattern URL = Pattern.compile(
"/((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:ww??w.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#???(?:[\\w]*))?)/"
);
Run Code Online (Sandbox Code Playgroud)
我对正则表达式有非常基础的知识,所以我不知道上面使用的字符串是否正确.请帮忙...
斯威夫特 5、Xcode 10、iOS 12
我的代码用于UIApplication.shared.canOpenURL验证 URL,不幸的是没有“http://”就失败了。
例子:
print(UIApplication.shared.canOpenURL(URL(string: "stackoverflow.com")!)) //false
print(UIApplication.shared.canOpenURL(URL(string: "http://stackoverflow.com")!)) //true
print(UIApplication.shared.canOpenURL(URL(string: "129.0.0.1")!)) //false
print(UIApplication.shared.canOpenURL(URL(string: "ftp://129.0.0.1")!)) //true
Run Code Online (Sandbox Code Playgroud)
我知道方案(iOS9+)的变化,我知道如果字符串尚未以“http://”开头,我可以添加前缀,然后检查这个新字符串,但我仍然想知道:
问题:我如何添加“没有方案”方案,以便像“stackoverflow.com”这样的有效 URL 也返回true(这是否可能?)?
java ×7
url ×4
regex ×2
android ×1
generator ×1
glassfish ×1
glassfish-4 ×1
ios ×1
jakarta-ee ×1
swift ×1
validation ×1
xcode ×1