Java 检查URL是HTTPS还是HTTP协议?

Java 检查URL是HTTPS还是HTTP协议?,java,android,http,https,Java,Android,Http,Https,我目前正在使用以下命令从android文档和应用程序中读取一个文件。用户选择(在设置屏幕中)其站点是否使用HTTP或HTTPS协议。如果他们的网站使用HTTP协议,那么它适用于HttpURLConnection和HttpsURLConnection,但是如果他们的网站使用HTTPS协议,那么它不适用于HttpURLConnection协议,最糟糕的是,它不会给我一个异常错误。下面是我正在使用的示例代码 因此,本质上,我如何检查web url是否为HTTPS协议,从而检查用户是否选择了正确的协议

我目前正在使用以下命令从android文档和应用程序中读取一个文件。用户选择(在设置屏幕中)其站点是否使用HTTP或HTTPS协议。如果他们的网站使用HTTP协议,那么它适用于
HttpURLConnection
HttpsURLConnection
,但是如果他们的网站使用HTTPS协议,那么它不适用于
HttpURLConnection
协议,最糟糕的是,它不会给我一个异常错误。下面是我正在使用的示例代码

因此,本质上,我如何检查web url是否为HTTPS协议,从而检查用户是否选择了正确的协议

InputStream inputStream;
HttpURLConnection urlConnection;
HttpsURLConnection urlHttpsConnection;
boolean httpYes, httpsYes; 
try {
if (httpSelection.equals("http://")) {
  URL url = new URL(weburi);
  urlConnection = (HttpURLConnection) url.openConnection();
  inputStream = new BufferedInputStream((urlConnection.getInputStream()));
httpYes = True;
}
if (httpSelection.equals("https://")) {
  URL url = new URL(weburi);
  urlHttpsConnection = (HttpsURLConnection) url.openConnection();
  urlHttpsConnection.setSSLSocketFactory(context.getSocketFactory());
  inputStream = urlHttpsConnection.getInputStream();
  https=True;
}

catch (Exception e) {
//Toast Message displays and settings intent re-starts
}
finally {
  readFile(in);
if(httpYes){ 
    urlConnection.disconnect();
    httpYes = False;
 }
if(httpsYes){ 
    urlHttpsConnection.disconnect();
    httpsYes = False;
 } 
}
}
编辑:

再详细说明一下。我需要看看它是否从一个网站返回一个有效的响应?因此,如果用户选择http而不是https,我如何检查http是否是错误的前缀/协议

如何检查网站是否使用HTTPS或HTTP协议?如果用户只输入saywww.google.com,而我在其上附加https://http://前缀,我如何知道哪个是正确的使用方式?

您可以使用android来检查url是http还是https:

public static boolean isHttpUrl (String url)
Returns True iff the url is an http: url.

public static boolean isHttpsUrl (String url) 
Returns True iff the url is an https: url.
编辑:


这可以通过使用进行检查

  • 如果url是http:url,则返回True
  • 如果url是https:url,则返回True
    • 你可以试试这个

          boolean httpYes, httpsYes;
           try {
      
            URL url = new URL(weburi);
            urlConnection = (HttpURLConnection) url.openConnection();
            inputStream = new BufferedInputStream((urlConnection.getInputStream()));
          httpYes = True;
          }
      
      
          catch (Exception e) {
          //Toast Message displays and settings intent re-starts
                URL url = new URL(weburi);
                urlHttpsConnection = (HttpsURLConnection) url.openConnection();
                urlHttpsConnection.setSSLSocketFactory(context.getSocketFactory());
                inputStream = urlHttpsConnection.getInputStream();
                https=True;
          }
      

      我认为这是可行的,至少看起来是可行的,你们觉得呢?我将这个if语句放在
      httpsYes=True
      httpYes=True
      之前

      当选择HTTPS协议时,它似乎希望使用响应代码302重定向,但对于所有其他实例,它都使用响应代码200连接。我抛出一个新的
      ConnectionException()
      错误,因为它会将用户带回设置屏幕以更正URL错误

      对于HTTPS协议:

      if (httpsURLConnection.getResponseCode() != 200) {
           throw new ConnectException();
      }
      
      if (urlConnection.getResponseCode() != 200) {
           throw new ConnectException();
      }
      
      对于HTTP协议:

      if (httpsURLConnection.getResponseCode() != 200) {
           throw new ConnectException();
      }
      
      if (urlConnection.getResponseCode() != 200) {
           throw new ConnectException();
      }
      

      评论?我应该使用
      urlConnection.getResponseCode()>199&<300
      ?要覆盖所有成功的连接?

      我的建议是创建正则函数表达式。 例如:

      public void testUrl(Object urlHttp){
      
          String url = "https://www.google.com";
      
          if(url.matches("^(https?)://.*$")){
           Object o = (HttpsURLConnection) urlHttp;
          }else{
           Object o = (HttpURLConnection) urlHttp;
          }
      }
      
      关于

      我已经检查了类,并检查了它是否包含这么多用于此类内容的方法,但我只是扩展了答案,您也可以简单地执行以下操作:-

      public static boolean isHttpOrHttpsUrl(String url) {
              String patter = "^(http|https|ftp)://.*$";
              if (url.matches(patter)){
                  return true;
              }else{
                  return false;
              }
          }
      
      请尝试以下代码:

      mConnexion = (URLUtil.isHttpsUrl(mStringUrl)) ? (HttpsURLConnection) url.openConnection() : (HttpURLConnection) url.openConnection();
      

      也许我错过了什么。您不能检查URL字符串是否以
      https://
      http//
      开头吗?是的,我可以@Karim,但是如果用户选择了错误的字符串会发生什么?这就是我遇到的问题。在所有情况下都使用
      HttpsURLConnection
      ,或者不要检查
      httpSelection.equals(…)
      ,立即检查URL是否以
      https://
      http://
      开头,不要要求用户选择任何内容。@Karim我认为这可能是目前为止最好的解决方案。无论用户选择了什么
      https://
      http://
      ,它都将始终工作。虽然我不确定这是否是正确的方法。@Karim我刚刚意识到它仍然不能正常工作,因为当URL是https,而用户在http中键入时,它将提供与以前相同的结果。@Kartheek这与我的答案不同吗?我没有检查您的答案@DhavalPatel@Tony为什么要添加额外的try-catch开销?如果我们可以通过简单的If-else条件来检查它,我100%同意你的看法,但它可以作为一个额外的场景添加。顺便说一下,在这两种情况下为http连接添加的try-catch语句已经尝试了上述所有方法。即使它是正确的并且可以工作,但是如果用户使用http而不是https,也不能解决问题,它仍然返回一个有效的响应。这是否真的尝试传输任何数据,或者如果连接以https://@Dino开头,它只返回true不确定,但可能是您的HTTP URL正在重定向到https。@DhavalPatel我不确定它是否正在尝试重定向,但如果用户键入的前缀不正确,我不会收到exeption错误。这是真的。我在HTTP和HTTPS前缀上都试过。@DhavalPatel,我只是使用了
      getResponseCode()
      ,它确实返回302(这意味着重新定向),因为HTTPSIt不能处理URL中没有指定协议的情况。无论如何,使用这个正则表达式,它会将对象强制转换为HTTPS,即使它没有