非法论证http主机

时间:2017-02-23 16:48:24

标签: java jsp

挣扎着应该是一段简单的代码(但后来我是新手)

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地址,也是一个null,导致java IllegalArgumentException = http host = null。我无法弄清楚如何将for循环打印到控制台,所以我可以看到究竟是什么发送。

如果我替换for循环并只使用一个固定的IP地址,则没有例外。

我不想设置代理等,如果我可以避免它,并且捕获异常似乎不起作用。

ReaderDriver的前2行(但我不想在可能的情况下改变此代码,问题似乎是在真实IP地址之后发送null的for循环)

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

我想停止for循环发送IP addreeses以外的任何东西(即空白)。

赞赏的想法。

3 个答案:

答案 0 :(得分: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 commons验证器jar的一部分,可以从https://commons.apache.org/proper/commons-validator/download_validator.cgi下载

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

您也可以添加check for for循环,而不是UrlValidator。

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

答案 1 :(得分:-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);
}

然后继续使用常规代码。

答案 2 :(得分:-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);
}