2017-02-23 91 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