a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 116|回复: 0

[基础知识] JAVA认证考试基础知识笔记19

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
Java如何实现网页程序自动登录我不得不使用好几个系统,都是B/S结构的,每次登录都需要输入用户名和密码,觉得非常麻烦,考虑到其他同事也会有这样的需求,不妨就写个自动登录的程序吧。之前,也考虑过使用单点登录,几经尝试之后还是放弃了。+ Z8 T' P6 x: u/ `# P- L9 n
   
$ z' w6 r  T" V1 E$ T: a    我习惯使用Java,本能地开始寻找Java的解决方法,在Google中输入"Java自动登录"、"Java网页模拟登录"、"JavaPost登录",结果倒是不少,内容也差不多,我尝试很多次终究也没有达到我预期的目标。后来,我都不知道这些代码应该在jsp页面中执行还是在c/s结构的程序中执行。但这些代码确实管用。1 p$ n( M, S9 w* G* o- q
    ( Z- K% r9 O$ U
    我们先分析一下代码:
8 r3 I+ x* }* D2 w    4 |8 ]/ ~5 Y) I
    Stringsurl="http://192.168.0.1:8888/oa/login.jsp";
& {2 s5 u* c0 x" V+ O   
6 \% [) B" J, J  D$ n8 b5 _7 T    URLurl=newURL(surl);9 P* \( p% Z! v+ }. B" H
    5 A# t6 |+ H! x& P2 b
    URLConnectionconn=url.openConnection();2 I9 B+ n( ]! U$ W  ?
    ( s: h' {! B( u; ?% a
    conn.setDoOutput(true);
1 M" @- q/ E9 l+ v' N: @3 W    ( [& ?( n4 d9 Z% I0 X8 t4 ~
    OutputStreamWriterout=newOutputStreamWriter(conn.getOutputStream());/ a2 y; u1 a* K! [( u
   
& U5 t( R- K5 N" \/ n/ f    Stringstr="username=yourname&password=123456";8 f2 U. W# L5 t+ n3 V$ I) c; Z
    # W6 z) ]* p- w
    out.write(str);8 n3 h* |  ~; L7 v/ W7 |
   
1 n1 _/ _- x7 S8 R- p" K. t1 q    out.flush();
) c* X: P8 t2 s* F' b+ o3 p   
: z. i2 U* |7 y: l    out.close();
6 Q; v, h& X' R4 P; K7 c( E   
; z1 B5 ]' m; R8 |2 u4 ]( A* X    到这里,如果在C/S结构中,且参数正确,程序能够成功登录到这个oa系统,要看到结果,你可以通过下面的代码将系统服务器返回的结果System.out.println()出来。( ]0 Y5 @* }) L$ @; Q2 w6 R
   
4 N' ?7 m* n" f2 H    Stringsling="";' q; I1 m2 v4 H: z4 a5 v
    # J. c( L, B  }8 M* N: @
    Stringscontent="";
# E) K* r4 }2 `+ c" g    % S: ]+ C, ~% W- \  g7 w
    BufferedReaderin=newBufferedReader(newInputStreamReader(conn.getInputStream(),"UTF-8"));, \' u& m/ v: s2 o
    ! O3 A! j" t& }" U9 p9 C0 J
    while((sling=in.readLine())!=null)
7 @$ q4 [' r% @1 d% S7 S    + n! s! L) J& C# i
    scontent+=in+"\r\n";
& s: G, Q9 A- ]* X6 X5 v% D' B# b   
9 B* u/ s* y+ H1 X, `8 S, f$ i    System.out.println(scontent);  p# K$ c6 g; x" j; i4 ]
   
. M( `/ n0 ?/ H" Z    在C/S结构下,可以到得到控制台输出了返回值,从返回内容里可以看出程序已经成功登录,但要是把这个网址浏览器打开,还是得重新登录,问题没有得到根本解决。如果只是恶意注册,到这里应该就达到目的了。! ^. Z! N3 |- a3 @6 C- @+ L# F
   
- O; h  y/ {: ^' G$ T4 q    看样子C/S结构下不容易实现网页程序自动登录,除非你在C/S程序中内嵌一个浏览器,直接在这个浏览器中自动访问系统,应该没有别的方法,主要问题在于我们没有办法共享Session.
6 q6 M+ o3 n* I  A1 S    : w, J8 P9 c  H- w* h" D$ G- X" `
    为了便于共享Session,我们只能在浏览器中实现网页自动登录,通过上面的代码在jsp页面中测试,达不到预期目标。
- H* H% |' P7 W) g5 @5 F$ D3 k3 V   
$ t, o' G, W6 H    网页自动登录,就是希望程序自动填充用户名和密码,然后以Post方式提交给登录页面的Form所指向的action页面或方法。我将系统的登录页面的源代码保存成一个网页,然后在username和password文本框中设置默认值,然后通过这网页登录系统,测试后,发现可行。接下来,你可能已经想到了解决方法。
1 N) x% I9 y& [! B  \% B2 b   
. }+ i9 D/ S# r+ r/ M    我们可以通过url.openConnection()建立连接,将返回的scontent打印出来,然后接着打印以下代码:
3 w0 E1 g0 r; y9 }5 R6 v0 Q   
' V9 l/ o/ b# X6 h    out.println("\r\n");5 r9 C; {6 U7 q' G( q4 @
   
! m+ U; Z* L; p/ c% U9 o    out.println("document.getElementsByName(\"username\")[0].value=yourname;\r\n");
& j- Y0 s6 J. q3 q% A   
/ C: O' t9 P9 J' G& P    out.println("document.getElementsByName(\"password\")[0].value=123456;\r\n");* g  B5 b( K1 K0 U0 p
    9 ~' `" W0 v- v7 ?# y: k% \/ ~
    out.println("document.forms[0].submit();\r\n");
8 X* Y$ r7 b' }   
0 o. e$ I$ i% l* U; E: z" S, m    out.println("\r\n");
# d' y0 f4 h- \' l3 g0 h    & e- s8 q4 H: l/ k  ~
    原理很简单,通过login.jsp将登录页面的全部源代码写在当前页面,然后使用javascript脚本将用户名和密码的值填充上,最后提交表单。这样中,终于实现了自动登录的目标。现在我通过一个特殊的网址,就可以自动访问这个oa了。/ s2 m) S4 p* W$ N9 d7 e7 i
    - p# y" @' R8 O! s8 j
    你可能注意到参数url,他的值是经过加密的,内容是用户名和密码。当然,你也可以加上有效期,即在有效期内这个链接才是有效的,才可以实现自动登录。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-8 02:27 , Processed in 0.204985 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表