2011-06-30 49 views
3

我試圖打開這個URI處理認證相關的中間重定向與ApacheHttpClient

https://some-host/a/meta? (this url is passed to proxi.jsp page) 

..但它重定向到身份驗證服務(上HTTPS)的彈出式菜單的用戶名和密碼箱...如果上瀏覽器..然後它需要你鍵入證書..然後它返回到我試圖打開並顯示內容的第一個鏈接...所以我想知道,當這個中間重定向到身份驗證服務發生..我如何通過代碼輸入我的用戶名和密碼到該彈出窗口..我試圖使用Apache HttpClient做到這一點...

這是正在請求我proxi.jsp代碼..

<%@ page language="java" import=" 
java.util.Collection, 
org.apache.commons.httpclient.HttpClient, 
org.apache.commons.httpclient.UsernamePasswordCredentials, 
org.apache.commons.httpclient.auth.AuthScope, 
org.apache.commons.httpclient.methods.GetMethod" 
contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 

<% 
try { 
String a_Url = request.getParameter("url") ; 

HttpClient client = new HttpClient(); 
client.getState().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, "realm"), 
    new UsernamePasswordCredentials("test", "pass") 
); 

GetMethod get = new GetMethod(a_Url); 
get.setDoAuthentication(true); 
try { 
    int status = client.executeMethod(get); 
    out.println(status + "\n" + get.getResponseBodyAsString()); 
} finally { 
    get.releaseConnection(); 
} 
} catch (Throwable t) { 
    t.printStackTrace(); 
} 

%> 

這是我收到的錯誤: -

org.apache.commons.httpclient.InvalidRedirectLocationException: Invalid redirect 
location: https://login.xyz.com/13/smt 
d.scc?TYPE=16&REALM=-SM-Documentum%20 
uGVx6wOk1daI3&TARGET=-http%3A%2F%2Fsome-hid%3D10 
     at org.apache.commons.httpclient.HttpMethodDirector.processRedirectRespo 
nse(HttpMethodDirector.java:619) 
     at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMe 
thodDirector.java:179) 
     at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.jav 
a:397) 
     at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.jav 
a:323) 
     at org.apache.jsp.proxi_jsp._jspService(org.apache.jsp.proxi_jsp:64) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper 
.java:389) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:4 
86) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511 
) 
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:3 
90) 
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.jav 
a:216) 
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:1 
82) 
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:7 
65) 
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 

     at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327) 
     at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126) 
     at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(Normal 
RewrittenUrl.java:213) 
     at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.j 
ava:171) 
     at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:14 
5) 
     at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewri 
ter.java:92) 
     at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewrit 
eFilter.java:381) 
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(Servlet 
Handler.java:1157) 
     at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainI 
nvocation.java:67) 
     at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilte 
rPipeline.java:122) 
     at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:110) 
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(Servlet 
Handler.java:1157) 
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:3 
88) 
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.jav 
a:216) 
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:1 
82) 
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:7 
65) 
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 

     at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHand 
lerCollection.java:230) 
     at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection. 
java:114) 
     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:1 
52) 
     at org.mortbay.jetty.Server.handle(Server.java:326) 
     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:53 
6) 
     at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpCo 
nnection.java:915) 
     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:539) 
     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:405) 
     at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.ja 
va:409) 
     at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.j 
ava:582) 
Caused by: org.apache.commons.httpclient.URIException: Invalid query 
     at org.apache.commons.httpclient.URI.parseUriReference(URI.java:2049) 
     at org.apache.commons.httpclient.URI.<init>(URI.java:147) 
     at org.apache.commons.httpclient.HttpMethodDirector.processRedirectRespo 
nse(HttpMethodDirector.java:601) 
     ... 44 more 

,如果我嘗試這個URL粘貼

https://login.xyz.com/9]&AUTHREASON=0&[email protected] 

回到瀏覽器,然後我得到一個彈出窗口進行身份驗證,如果我在該窗口中輸入用戶名和密碼,那麼我將獲得我正在查找的實際內容。 是否有任何標題需要在proxi.jsp頁面中傳遞。因爲在頁面中傳遞用戶名和密碼不是實現它的最好方法..或者其他任何方式。任何建議將不勝感激..

+0

您是否知道它是否正在使用Basic Auth? – Sai

+0

@Sai,這是什麼意思? – ferhan

+0

看看http://en.wikipedia.org/wiki/Basic_access_authentication – Sai

回答

1

您必須使用的HttpClient 3.1,因爲我的測試表明的HttpClient 3.0是罰款與URL。但是,HttpClient 3.1在查詢字符串中出現[時會引發錯誤。爲什麼這是我不確定的情況。根據RFC 3986應該允許[]。查看HttpClient 3.1中的URI源代碼,由於某些原因,它不包含這些字符。這可能是該版本中的一個錯誤,我會說。話雖如此,我不認爲有任何工作進入HttpClient 3.x,因爲4.x現在是焦點。

+0

@laz,我使用的是HttpClient 4.1.1而不是HttpClient 3.1。那麼爲什麼它會發生HttpClient 4.1.1 – ferhan

+0

@laz,在我的maven依賴項中,我有'commons-httpclient-3.1.jar,httpclient-4.1.1.jar,httpcore-4.1.jar'所以這很好? ?或者什麼是錯誤的..和commons-httpclient-3.1.jar干擾4.1.1或那是好的.. ?? – ferhan

+0

來自'org.apache.commons.httpclient'的那些類來自舊的3.x庫。對於4.1.1,你可以從'org.apache.http'中導入項目,比如'org.apache.http.client.HttpClient'。 – laz

2

不知道該網站是否使用基本身份驗證 - 您可以嘗試以下測試是用戶名和pass是您輸入網站的密碼。

https://test:[email protected]/a/getmeta?id=10 
+0

,但這不是最好的方式來做到這一點..正確..還是得到相同的錯誤回來..任何其他建議? – ferhan

+0

好的。我猜它不是基本的認證。對不起, – Sai

+0

沒有問題..任何其他建議? – ferhan

0

根據例外情況,URL位置https://login.host.com/是可到達的。 最後寫的URL指向不同的位置。

https://login.host.com/ --> Unreachable 
https://login.somehost.com/ --> Reachable 

這兩個網址不等於

+0

所以結果如何。你有沒有得到你想要的輸出? –

+0

是的,現在他們是一樣的。但我的答案仍然是一樣的。代碼運行的地方,該位置無效。 –