[两年前的博客,各种解决问题啊]
昨天5:30到刚刚,几乎花了一人天的时间。
问题如下,想用Jersey Client登陆一个Tomcat Realm权限管理的网站。
用Chrome访问的过程是[GET 资源]->重定向到登陆页->[POST 登陆信息]->重定向到资源并且有权限。
我用Jersey Client参照了如上步骤,[GET 资源]->获取Set-Cookie头->[POST 登录信息 with Cookie]->访问资源看是否有权限。总之就是照着浏览器的请求一条一条来,但是登陆的总是会返回登陆页面并且有个LOGIN_PAGE为 TRUE的头。
郁闷的奋战一天,最后同事各种帮忙各种不理解的情况下,在浏览器试了一下GET方法登陆,结果可以,于是在Jersey Client中也用了GET方法,然后就ok了……你说,这是为啥啊!
下面是一些关键的代码:
//这段为了把Response给你的cookie全都拷贝到你的下一个request中去,很有用。当然也可以自己写头,但是容易出错 client.addFilter(new ClientFilter() { private ArrayList<Object> cookies; @Override public ClientResponse handle(ClientRequest request) throws ClientHandlerException { if (cookies != null) { request.getHeaders().put("Cookie", cookies); } ClientResponse response = getNext().handle(request); // copy cookies if (response.getCookies() != null) { if (cookies == null) { cookies = new ArrayList<Object>(); } cookies.addAll(response.getCookies()); } return response; } });
//这是一段伤痕累累的登陆代码,从其间凌乱的布局和折翼的注释可以看出来这一天中她经历了什么。 // Login: WebResource webResource = client.resource("http://192.168.0.200:18080/edoc/resources/mgtskdjfklsjklfjdklsj").path("/j_security_check;jsessionid="+jsessionid); Form form = new Form(); form.add("j_username", "admin"); form.add("j_password", "111111"); //form.putSingle("commit", "现在登陆"); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); queryParams.add("j_username", "admin"); queryParams.add("j_password", "111111"); ClientResponse auth_Response = webResource.queryParams(queryParams).type("application/x-www-form-urlencoded") /*.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.8") .header("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3") .header("Accept-Encoding","gzip,deflate,sdch") .header("Accept-Language", "zh-CN,zh;q=0.8") .header("Cache-Control", "max-age=0") .header("Cookie", "JSESSIONID=" + jsessionid) //.cookie(cookies.get(0)) .header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.15 Safari/537.1") .header("Host", "192.168.0.200:18080") .header("Origin", "http://192.168.0.200:18080") .header("Referer", "http://192.168.0.200:18080/edoc/resources/mgt/audit/view") .header("Connection", "keep-alive")*/ //.header("Content-Length", 78) //.post(ClientResponse.class, form) .get(ClientResponse.class);