首页 新闻 会员 周边 捐助

java模拟登陆 怎么并保持状态访问下一个页面

0
[已解决问题] 解决于 2016-04-17 20:48

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    

请问我怎么保持这个登陆成功的状态去访问别的页面啊?

还请讲一下思路 谢谢各位

小严的主页 小严 | 初学一级 | 园豆:2
提问于:2015-05-05 21:12
< >
分享
最佳答案
0

根据我自己的爬虫经验,登录后获取到cookie以后 ,下次访问 经cookie设置进去,应该就能保持登录状态。

代码里又不是浏览器,没有会话这一说,所以想要 “保持”,就是 自己手动,cookie不行,就自己反复登录

 

还有就是 使用 其他开源包,然后 是模拟浏览器的,使用同一请求,不释放资源,或许算是 浏览器的会话吧。

奖励园豆:5
Inszt | 初学一级 |园豆:151 | 2015-06-15 10:11
其他回答(5)
0

用HttpUnit

爱吃皮皮虾 | 园豆:54 (初学一级) | 2015-05-10 05:31
0

保存cookie

dint | 园豆:211 (菜鸟二级) | 2015-05-20 16:30
0

将会话保存到session中不就行了。

我爱天宫 | 园豆:208 (菜鸟二级) | 2015-06-06 02:51
0

首先要理解http是怎么保持状态的,

简单来说http是通过一个sessionid来保持的。第一次访问,服务器生成一个sessionid(随机不重复),标识这个是哪个用户。然后存储sessionid,维持一定时间以后销毁。

下次访问会带着这个sessionid过来。(cookie开启用cookie携带,未开启我们一般用get参数携带),然后服务器查一下,只要session没有销毁而且是服务器生成的,就查到了,就知道这个用户是那个用户了。

你可以定义自己的比如Map<String,Session> string就是sessionid,Session自己定义,比如直接用Map也可以。Map<String,Map<String,String> >里面的map可以存储一些用户信息,string唯一不重复标识用户。

洛城秋色 | 园豆:324 (菜鸟二级) | 2015-07-06 11:37

刚看了下代码,为什么你不用httpclient,这个没用过,要是用socket的话,响应的头信息里有Set-Cookie,记录里面的sessionid(也可能有其他的cookie信息),在下次请求的时候加上Cookie的头信息。打开F12看看就知道了。

支持(0) 反对(0) 洛城秋色 | 园豆:324 (菜鸟二级) | 2015-07-06 20:30
0

这个打印出登陆后的页面是在哪一步啊

杹錵铧的菜鸟 | 园豆:202 (菜鸟二级) | 2018-04-16 15:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册