2017-02-23 82 views
0

什么应该是一个简单的代码挣扎(但当时我是新手)非法参数HTTP主机

String ipaddrlist = request.getParameter("ipaddrlist"); 
System.out.println (ipaddrlist); 

ReaderDriver art = new ReaderDriver(); 

String ipaddrs[] = ipaddrlist.split(","); 
System.out.println (Arrays.toString(ipaddrs)); 

for(int i=0; i< ipaddrs.length ; i++) 
{ 
art.setOutputs(ipaddrs[i], false); 
} 

ipaddrlist =,192.168.150.210 ipaddrs =,192.168.150.210(拆分逗号远来自IP地址)。使用数组是因为列表中可能有多个IP地址。

但for(int循环似乎是发送正确的IP地址,也是一个空导致java IllegalArgumentException = http host = null。我不知道如何打印for循环到控制台,所以我可以看到正在发送什么。

如果我更换for循环,只需使用一个固定的IP地址,然后没有什么异常。

我不想有设置代理服务器等,如果我能避免它,一个捕获异常似乎没有工作

ReaderDriver的前两行(但我不想要改变如果可能的话这个代码,这个问题似乎是在for循环的真实IP地址后发送空)

public boolean setOutputs(String ipAddress, boolean status) 
{ 
String url = (new StringBuilder()).append("http://").append(ipAddress).append("/UE/rci").toString(); 

我想停止对环比发送IP addreeses以外的任何其他(即空白)。

想法感激。

+0

你能也粘贴代码ReaderDriver类。根据这段代码,我们将无法弄清楚setOutputs API在做什么。其余的代码看起来很好。如果在逗号之前没有值,那么它将被视为空白。 – Maverick

+0

更新的原始代码,但请参阅评论。 – Active

回答

-1

只是做在你的代码简单的验证:

for(int i=0; i< ipaddrs.length ; i++) 
{ 
    // Or you can validate by your way(for exp: checking url), here is checking null or empty 
    if (ipaddrs[i] != null && !ipaddrs[i].isEmpty()) 
     art.setOutputs(ipaddrs[i], false); 
} 
+0

非常感谢ducanhng(以及所有其他人的回应),这完全解决了这个问题。 – Active

+0

我认为你的程序在打印结果时只需要一个简单的方法来传递null或empty(没有例外)。所以在这里,如果你想做一些其他的验证,也可以看到我的评论。 – ducanhng

-1

只要删除尾部的逗号,如果它在那里。

String sanitizedIpAddr = ""; 
String ipaddrlist = request.getParameter("ipaddrlist"); 
System.out.println (ipaddrlist); 

ReaderDriver art = new ReaderDriver(); 

if(ipaddrlist.charAt(ipaddrlist.length()-1) == ','){ 
     sanitizedIpAddr = ipaddrlist.substring(0, ipaddrlist.length()-2); 
     } 

String ipaddrs[] = sanitizedIpAddr.split(","); 
System.out.println (Arrays.toString(ipaddrs)); 

for(int i=0; i< ipaddrs.length ; i++) 
{ 
art.setOutputs(ipaddrs[i], false); 
} 

然后继续您的常规代码。

+0

感谢爱德华多,但我现在似乎有2个字符串数组放在for循环(ipaddrlist和sanitizedIPAddr),不知道如何做到这一点,你能重现我的原始代码与你的添加(它是一个新手,你可以看到) – Active

+0

@Active只需用新消毒过的东西代替所有东西。你所做的只是在最后删除逗号,如果有的话。这应该解决你的空指针异常 –

+0

谢谢,但这打破了代码(长度无法解析,必须是数组类型)for(int i = 0; i Active

0

问题是当ipaddress的值为空时,代码将创建一个无效的URL。

http:///UE/rci     //Invalid URL if ip address is blank 
http://192.168.150.210/UE/rci //Valid URL 

我假设你正在使用此URL创建连接类似

URL myURL = new URL(url); 
URLConnection myURLConnection = myURL.openConnection(); 
myURLConnection.connect(); 

你需要打开一个连接之前验证URL。

 String url = (new StringBuilder()).append("http://").append(ipaddrs[i]).append("/UE/rci").toString(); 
     String[] schemes = {"http","https"}; // DEFAULT schemes = "http", "https", "ftp" 
     UrlValidator urlValidator = new UrlValidator(schemes); 
     if (urlValidator.isValid(url)) 
     { 
      System.out.println("URL is valid..Continue processing"); 
      try { 
       URL myURL = new URL(url); 
       URLConnection myURLConnection = myURL.openConnection(); 
       myURLConnection.connect(); 
      } 
      catch (MalformedURLException e) { 
       e.printStackTrace(); 
       // new URL() failed 
       // ... 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 

      } 
     } else { 
      System.out.println("URL is invalid"); 
     } 

UrlValidator类是Apache的百科全书验证罐子的一部分,它可以从https://commons.apache.org/proper/commons-validator/download_validator.cgi

有两个UrlValidator类下载。使用org.apache.commons.validator.routines.UrlValidator,因为其他人不推荐使用。

除了UrlValidator,您还可以添加for循环检查。

for(int i=0; i< ipaddrs.length ; i++) 
{ 
    if(ipaddrs[i] !=null && !"".equals(ipaddrs[i].trim())) 
    { 
     art.setOutputs(ipaddrs[i], false); 
    } 
} 
+0

感谢Leozeo,但是我们能不能阻止for循环发送空白,而不必添加验证程序。 – Active

+0

@Active如果ipaddress为空,您可以跳过对setOutputs API的调用。检查更新的代码。 – Maverick

+0

感谢Leozeo,虽然你的for循环在if行的某处有语法错误(插入Statement来完成块语句) – Active