java模拟登陆 怎么并保持状态访问下一个页面
问的不是java web 而是客户端 想做个小程序的实验一下
1 /* 2 urlString:访问的地址 3 nameValuePair:一个文件 包含登陆名密码 4 */ 5 private static String doPost(String urlString, Map<Object, Object> nameValuePairs) throws IOException { 6 //发送请求 7 URL url=new URL(urlString); 8 URLConnection connection=url.openConnection(); 9 connection.setDoInput(true); 10 connection.setDoOutput(true); 11 connection.setRequestProperty("Host","eol.siit.edu.cn:85"); 12 connection.setRequestProperty("Connection","keep-alive"); 13 connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 14 connection.connect(); 15 //connection.setRequestProperty("Content-Length", "52"); 16 try(PrintWriter out=new PrintWriter(connection.getOutputStream())){ 17 boolean first=true; 18 for(Map.Entry<Object, Object> pair:nameValuePairs.entrySet()){ 19 if(first)first=false; 20 else{ 21 out.print("&"); 22 } 23 24 String name=pair.getKey().toString(); 25 String value=pair.getValue().toString(); 26 27 out.print(name); 28 out.print('='); 29 out.print(value); 30 } 31 } 32 //获取请求成功后的JSESSIONID 33 String repex="\\;"; 34 Pattern pattern=Pattern.compile(repex,Pattern.CASE_INSENSITIVE); 35 Map<String, List<String>> map=connection.getHeaderFields(); 36 for(Map.Entry<String, List<String>> air:map.entrySet()){ 37 System.out.println(air.getKey()+":"+air.getValue().toString()); 38 String s=":"+air.getKey(); 39 System.out.println(s); 40 if(s.equals(":Set-Cookie")){ 41 s=air.getValue().toString(); 42 Matcher matcher=pattern.matcher(s); 43 matcher.find(); 44 int stat=matcher.start(); 45 int end=matcher.end(); 46 String match=s.substring(1,end-1); 47 JSESSIONID=match; 48 } 49 } 50 //接受返回的信息 51 StringBuilder response=new StringBuilder(); 52 try(Scanner in=new Scanner(connection.getInputStream())){ 53 while(in.hasNextLine()){ 54 response.append(in.nextLine()); 55 response.append("\n"); 56 } 57 }catch (IOException e) { 58 // TODO: handle exception 59 if(!(connection instanceof HttpURLConnection)){ 60 InputStream err=((HttpURLConnection)connection).getErrorStream(); 61 if(err==null)throw e; 62 Scanner in=new Scanner(err); 63 response.append(in.nextLine()); 64 response.append("\n"); 65 } 66 } 67 return response.toString(); 68 }
我现在已经实现登陆,并且获取到了,回应头,JESSIONID
请问我怎么保持这个登陆成功的状态去访问别的页面啊?
还请讲一下思路 谢谢各位
根据我自己的爬虫经验,登录后获取到cookie以后 ,下次访问 经cookie设置进去,应该就能保持登录状态。
代码里又不是浏览器,没有会话这一说,所以想要 “保持”,就是 自己手动,cookie不行,就自己反复登录
还有就是 使用 其他开源包,然后 是模拟浏览器的,使用同一请求,不释放资源,或许算是 浏览器的会话吧。
用HttpUnit
保存cookie
将会话保存到session中不就行了。
首先要理解http是怎么保持状态的,
简单来说http是通过一个sessionid来保持的。第一次访问,服务器生成一个sessionid(随机不重复),标识这个是哪个用户。然后存储sessionid,维持一定时间以后销毁。
下次访问会带着这个sessionid过来。(cookie开启用cookie携带,未开启我们一般用get参数携带),然后服务器查一下,只要session没有销毁而且是服务器生成的,就查到了,就知道这个用户是那个用户了。
你可以定义自己的比如Map<String,Session> string就是sessionid,Session自己定义,比如直接用Map也可以。Map<String,Map<String,String> >里面的map可以存储一些用户信息,string唯一不重复标识用户。
刚看了下代码,为什么你不用httpclient,这个没用过,要是用socket的话,响应的头信息里有Set-Cookie,记录里面的sessionid(也可能有其他的cookie信息),在下次请求的时候加上Cookie的头信息。打开F12看看就知道了。
这个打印出登陆后的页面是在哪一步啊