我有一个网站,其网址以“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)
答案 0 :(得分:13)
您是否注意到异常消息中的不匹配撇号?
java.net.ProtocolException: Unsupported protocol: https'
^
更新:看起来这个撇号只是WebLogic HttpClient如何打印此异常的一个怪癖。
确定了Asker的根问题in a chat session:他正在访问一个http:// URL,将他重定向到https:// 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.
这是Asker在直接访问https:// URL时看到的消息(而不是通过重定向链)。
默认情况下,Java的Http [s] URLConnection会自动且安静地跟踪重定向。如果您对重定向到的位置感到好奇,请尝试以下代码:
connection.setInstanceFollowRedirects(false);
String location = connection.getHeaderField("Location");
System.out.println("Redirected to: " + location);
请注意,您重定向到的网址也可能会将您重定向到其他地方以及其他地方,最多http.maxRedirects次。重定向可能以这种方式“链接”。如果他们确实链接,您将需要继续关注重定向,直到您找到不发出重定向的网址。这就是在setInstanceFollowRedirects(true)
时最终确定URL连接的位置。
另外,我在sun.net.www.protocol.http.HttpURLConnection中找到了一些代码,似乎表明 HttpURLConnection可能不支持切换协议(HTTP - &gt; HTTPS)作为其逻辑自动重定向的一部分强>:
private boolean followRedirect() throws IOException {
// ... [snip] ...
if (!url.getProtocol().equalsIgnoreCase(locUrl.getProtocol())) {
return false;
// ... [snip] ...
WebLogic有自己的(不同的)HttpURLConnection实现,但它可能包含类似的逻辑以防止协议切换。因此,即使Asker解决了他的证书信任问题,他仍然可能无法使用HttpURLConnection自动遵循从HTTP到HTTPS的重定向链。解决方法是使用setInstanceFollowRedirects(false)
并手动关注重定向。或直接访问HTTPS站点。
答案 1 :(得分:5)
HTTP是一种在TCP / IP上运行的协议。 HTTPS是安全套接字上的HTTP(SSL或更新的TLS)。现在,什么是URL?它是一个标识资源的字符串,看起来大致如下:
scheme://host:port/path/to/resource
请注意,有时我们不指定端口号,因为某些protcols具有关联的众所周知的端口号。对于HTTP是80,对于HTTPS是443,因此这些数字是隐含的。但是,请注意,您可以在任何端口上绑定服务器套接字:如果您告诉HTTP服务器程序将其套接字绑定到localhost上的端口8273,它将很乐意这样做。
说,在您的情况下,消息显示“不支持的协议: https ”。我们可以在这里猜测,但是我认为您传递给URL的字符串不是您想要的字符串。
答案 2 :(得分:0)
另一种可能性是HTTP地址响应对HTTPS URL的3xx重定向响应,客户端试图遵循该URL,但不支持。 您可以通过tcpdump或wireshark捕获网络流量。
有很多Java HTTP客户端库支持HTTPS,为什么不切换到其中一个?