使用ApacheHttpClient处理与身份验证相关的中间重定向

时间:2011-06-30 19:14:33

标签: java jsp apache-httpclient-4.x

我正试图打开这个uri

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

如果我尝试粘贴此网址

https://login.xyz.com/9]&AUTHREASON=0&METHOD=GET@Name

回到浏览器然后我得到一个用于身份验证的弹出窗口,如果我在该窗口中写入我的用户名和密码,那么我将获得我正在寻找的实际内容。 在proxi.jsp页面中是否有任何标题需要传递。因为在页面中传递用户名和密码不是最好的方法。或者任何其他方式。任何建议将不胜感激..

3 个答案:

答案 0 :(得分:2)

不确定该网站是否使用基本身份验证 - 您可以尝试以下操作,其中test是用户名,pass是您输入的网站的密码。

https://test:pass@some-host/a/getmeta?id=10

答案 1 :(得分:1)

您必须使用HttpClient 3.1,因为我的测试表明HttpClient 3.0对该URL没问题。但是HttpClient 3.1在到达查询字符串中的[时会引发错误。为什么会这样,我不确定。根据{{​​3}},应允许[]。查看HttpClient 3.1中的RFC 3986源,由于某种原因,它不包含这些字符。这可能是我会说的那个版本的错误。话虽如此,我认为没有任何工作可以进入HttpClient 3.x,因为4.x现在是焦点。

答案 2 :(得分:0)

根据例外情况,可以访问网址https://login.host.com/。 最后写的URL指向不同的位置。

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

两个网址都不相等