是否有可能有网址开头的站点“http://”使用HTTPS协议(Is it possible for

2019-07-17 20:19发布

我有一个网站,其网址以“http://”,但是是给我一个例外,与消息 - 不支持的协议:HTTPS。 有没有可能是该网站是否使用HTTPS协议还是它的URL开始以“http://”,而不是“https://开头”。

public ActionForward executeAction(ActionMapping mapping, ActionForm form,
              HttpServletRequest request, HttpServletResponse response)
      throws Exception {

    ActionForward forward = mapping.findForward(Constants.SUCCESS);
    String link = "http://abc.fgh.jkl.mno";
    URL thisURL;
    HttpURLConnection conn = null;
    try {
        thisURL = new URL(link);
        conn = (HttpURLConnection) thisURL.openConnection();
        System.out.println(conn.getResponseCode());
        System.out.println(conn.getResponseMessage());
        } catch (Exception ex) {
        ex.printStackTrace();
    }
    return forward;
}       

堆栈跟踪

java.net.ProtocolException: Unsupported protocol: https'
    at weblogic.net.http.HttpClient.openServer(HttpClient.java:342)
    at weblogic.net.http.HttpClient.New(HttpClient.java:238)
    at weblogic.net.http.HttpURLConnection.connect(HttpURLConnection.java:172)
    at weblogic.net.http.HttpURLConnection.followRedirect(HttpURLConnection.java:643)
    at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:422)
    at           weblogic.net.http.SOAPHttpURLConnection.getInputStream(SOAPHttpURLConnection.java:36)
    at weblogic.net.http.HttpURLConnection.getResponseCode(HttpURLConnection.java:947)
    at com.cingular.cscape.da.struts.action.thisAction.executeAction(thisAction.java:56)
    at com.cingular.cscape.da.struts.action.BaseAction.execute(BaseAction.java:300)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at org.extremecomponents.table.filter.AbstractExportFilter.doFilter(AbstractExportFilter.java:53)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3496)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)                  

Answer 1:

你有没有注意到异常消息不匹配的单引号?

java.net.ProtocolException: Unsupported protocol: https'
                                                       ^

更新:看起来是这样的撇号只是一个在WebLogic HttpClient的如何打印此异常怪癖。

提问者的根本问题是确定在聊天会话 :他访问的http:他重定向到HTTPS // URL:// URL。 在那个HTTPS地址的Web服务器是服务了一份证明书,证明他的JRE / HttpClient的不信任。

实际的异常应该是一个SSLKeyException。 我认为在WebLogic HttpClient的是误报这个问题作为不支持的协议的问题。 我觉得最核心的问题是:

<Warning> <Security> <BEA-090477> javax.net.ssl.SSLKeyException: [Security:090477] Certificate chain received from www.X.com - nnn.nnn.nnn.nnn was not trusted causing SSL handshake failure.

这是阿斯卡访问HTTPS时看到的消息:// URL直接(而不是通过重定向链)。

默认情况下的Java的HTTP [S]的URLConnection如下自动重定向静静。 如果你好奇,你将被重定向到哪里,试试这个代码:

connection.setInstanceFollowRedirects(false);
String location = connection.getHeaderField("Location");
System.out.println("Redirected to: " + location);

请注意,您重定向到URL也可能会重定向你到别的地方和和,达到http.maxRedirects倍。 重定向可能“链”,在这种方式。 如果他们这样做连锁,您将需要保持,直到你达到不发出重定向的URL后的重定向。 这就是URL连接最终定型时setInstanceFollowRedirects(true)

另外,我发现在sun.net.www.protocol.http.HttpURLConnection一些代码,似乎表明HttpURLConnection类可能不支持交换协议(HTTP - > HTTPS)作为它的自动重定向以下逻辑的一部分

private boolean followRedirect() throws IOException {
    // ... [snip] ...
    if (!url.getProtocol().equalsIgnoreCase(locUrl.getProtocol())) {
        return false;
    // ... [snip] ...

的WebLogic有它自己的(不同的)实施HttpURLConnection类的,但它可以包含类似的逻辑,以防止协议切换。 所以,即使提问者解决了他的证书信任问题,他仍可能无法使用HttpURLConnection的自动跟随,从HTTP变为HTTPS重定向链。 一种解决方法是使用setInstanceFollowRedirects(false) ,并按照手动重定向。 或直接访问HTTPS站点。



Answer 2:

HTTP是基于TCP / IP运行的协议。 HTTPS是在HTTP安全套接字(SSL或TLS更新)。 现在,什么是网址? 这是标识资源的字符串,看起来大致是:

scheme://host:port/path/to/resource

请注意,有时我们不指定端口号,因为有些protcols有关联的众所周知的端口号。 对于HTTP是80,而对于HTTPS是443,所以这些数字暗示。 但是,请注意,您可以绑定服务器套接字上要什么端口:如果你告诉它的套接字绑定到本地主机端口8273的HTTP服务器程序,它会很乐意这样做。

说,你的情况有消息称“不支持的协议:https”开头 。 我们便可猜出这里,但是我觉得你传递给URL字符串不是你认为的一个。



Answer 3:

另一种可能性是HTTP地址与3XX重定向响应HTTPS URL,你的客户端试图跟随,但不支持响应。 你可以很通过捕获使用tcpdump或者Wireshark的网络流量。

有迹象表明,做支持HTTPS,为什么不切换到这些之一,所以许多Java HTTP客户端库?



文章来源: Is it possible for a site having URL starting with “http://” using HTTPS protocol
标签: java http https