之前,也考慮過(guò)使用單點(diǎn)登錄,幾經(jīng)嘗試之后還是放棄了。
創(chuàng)新互聯(lián)自成立以來(lái),一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開(kāi)發(fā)等基于互聯(lián)網(wǎng)的全面整合營(yíng)銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開(kāi)發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開(kāi)發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。
我習(xí)慣使用Java,本能地開(kāi)始尋找Java的解決方法,在Google中輸入"Java自動(dòng)登錄"、"Java網(wǎng)頁(yè)模擬登錄"、"JavaPost登錄",結(jié)果倒是不少,內(nèi)容也差不多,我嘗試很多次終究也沒(méi)有達(dá)到我預(yù)期的目標(biāo)。后來(lái),我都不知道這些代碼應(yīng)該在jsp頁(yè)面中執(zhí)行還是在c/s結(jié)構(gòu)的程序中執(zhí)行。但這些代碼確實(shí)管用。 我們先分析一下代碼: URLurl=newURL(surl); URLConnectionconn=url.openConnection(); conn.setDoOutput(true); OutputStreamWriterout=newOutputStreamWriter(conn.getOutputStream()); Stringstr="username=yournamepassword=123456"; out.write(str); out.flush(); out.close(); 到這里,如果在C/S結(jié)構(gòu)中,且參數(shù)正確,程序能夠成功登錄到這個(gè)oa系統(tǒng),要看到結(jié)果,你可以通過(guò)下面的代碼將系統(tǒng)服務(wù)器返回的結(jié)果System.out.println()出來(lái)。 Stringsling=""; Stringscontent=""; BufferedReaderin=newBufferedReader(newInputStreamReader(conn.getInputStream(),"UTF-8")); while((sling=in.readLine())!=null) scontent+=in+"\r\n"; System.out.println(scontent); 在C/S結(jié)構(gòu)下,可以到得到控制臺(tái)輸出了返回值,從返回內(nèi)容里可以看出程序已經(jīng)成功登錄,但要是把這個(gè)網(wǎng)址瀏覽器打開(kāi),還是得重新登錄,問(wèn)題沒(méi)有得到根本解決。如果只是惡意注冊(cè),到這里應(yīng)該就達(dá)到目的了。 看樣子C/S結(jié)構(gòu)下不容易實(shí)現(xiàn)網(wǎng)頁(yè)程序自動(dòng)登錄,除非你在C/S程序中內(nèi)嵌一個(gè)瀏覽器,直接在這個(gè)瀏覽器中自動(dòng)訪問(wèn)系統(tǒng),應(yīng)該沒(méi)有別的方法,主要問(wèn)題在于我們沒(méi)有辦法共享Session. 為了便于共享Session,我們只能在瀏覽器中實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)登錄,通過(guò)上面的代碼在jsp頁(yè)面中測(cè)試,達(dá)不到預(yù)期目標(biāo)。 網(wǎng)頁(yè)自動(dòng)登錄,就是希望程序自動(dòng)填充用戶名和密碼,然后以Post方式提交給登錄頁(yè)面的Form所指向的action頁(yè)面或方法。我將系統(tǒng)的登錄頁(yè)面的源代碼保存成一個(gè)網(wǎng)頁(yè),然后在username和password文本框中設(shè)置默認(rèn)值,然后通過(guò)這網(wǎng)頁(yè)登錄系統(tǒng),測(cè)試后,發(fā)現(xiàn)可行。接下來(lái),你可能已經(jīng)想到了解決方法。 我們可以通過(guò)url.openConnection()建立連接,將返回的scontent打印出來(lái),然后接著打印以下代碼: out.println("\r\n"); out.println("document.getElementsByName(\"username\")[0].value=yourname;\r\n"); out.println("document.getElementsByName(\"password\")[0].value=123456;\r\n"); out.println("document.forms[0].submit();\r\n"); out.println("\r\n"); 原理很簡(jiǎn)單,通過(guò)login.jsp將登錄頁(yè)面的全部源代碼寫(xiě)在當(dāng)前頁(yè)面,然后使用javascript腳本將用戶名和密碼的值填充上,最后提交表單。這樣中,終于實(shí)現(xiàn)了自動(dòng)登錄的目標(biāo)?,F(xiàn)在我通過(guò)一個(gè)特殊的網(wǎng)址,就可以自動(dòng)訪問(wèn)這個(gè)oa了。 你可能注意到參數(shù)url,他的值是經(jīng)過(guò)加密的,內(nèi)容是用戶名和密碼。當(dāng)然,你也可以加上有效期,即在有效期內(nèi)這個(gè)鏈接才是有效的,才可以實(shí)現(xiàn)自動(dòng)登錄。
希望能解決您的問(wèn)題。
性能測(cè)試中示例代碼使用java批量注冊(cè)登錄賬戶。
性能測(cè)試過(guò)程中所需的測(cè)試數(shù)據(jù),以登錄為例,為了更真實(shí)的模 批量讀取注冊(cè)。
Java登錄注冊(cè)功能實(shí)現(xiàn)代碼解析,文中通示例代碼,每個(gè)用戶信息都是唯一的,所以可以借助Set的特性來(lái)操作用戶信息的存放。
//User 用戶的基本信息,也是USERINFO表中的3個(gè)列
package
登陸判斷;
public class User {
private String name;
private String loginname;
private String
loginpsw;
public String getName() {
return name;
}
public
void setName(String name) {
this.name = name;
}
public String
getLoginname() {
return loginname;
}
public void
setLoginname(String loginname) {
this.loginname =
loginname;
}
public String getLoginpsw() {
return
loginpsw;
}
public void setLoginpsw(String loginpsw)
{
this.loginpsw = loginpsw;
}
}
//用于注冊(cè)和登陸的小小代碼塊
package
登陸判斷;
import java.util.Scanner;
public class In {
public static User getUser(){
User u = new User();
Scanner sc =
new
Scanner(System.in);
System.out.println("請(qǐng)輸入登陸名");
u.setLoginname(sc.nextLine());
System.out.println("請(qǐng)輸入密碼");
u.setLoginpsw(sc.nextLine());
return
u;
}
public static User registerUser(){
User u = new
User();
Scanner sc = new
Scanner(System.in);
System.out.println("請(qǐng)注冊(cè)用戶名名");
u.setName(sc.nextLine());
System.out.println("請(qǐng)注冊(cè)登陸名");
u.setLoginname(sc.nextLine());
System.out.println("請(qǐng)注冊(cè)密碼");
u.setLoginpsw(sc.nextLine());
return
u;
}
}
//登陸時(shí)的檢查,判斷登陸名和密碼是否正確,正確則返回 用戶名
package 登陸判斷;
import java.sql.Connection;
import java.sql.DriverManager;
import
java.sql.PreparedStatement;
import java.sql.ResultSet;
import
java.sql.SQLException;
public class Check {
public static void checkUser(User u)
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch
(ClassNotFoundException e) {
e.printStackTrace();
}
String
url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user =
"scott";
String password = "tiger";
Connection conn =
null;
ResultSet rs = null;
PreparedStatement pst =
null;
String sql = "Select name from USERINFO where loginname = ? and
loginpsw = ? ";
try {
conn = DriverManager.getConnection(url, user,
password);
pst = conn.prepareStatement(sql);
pst.setString(1,
u.getLoginname());
pst.setString(2,u.getLoginpsw());
rs =
pst.executeQuery();
while(rs.next()){
u.setName(rs.getString(1));
}
}
catch (SQLException e) {
e.printStackTrace();
}finally{
try
{
rs.close();
pst.close();
conn.close();
} catch
(SQLException e)
{
e.printStackTrace();
}
}
if(u.getName() == null ||
u.getName().isEmpty()){
System.out.println("登陸失敗");
}else{
System.out.println("歡迎"+u.getName()+"登陸");
}
}
}
//注冊(cè)界面,要判斷 登陸名是否有重復(fù),有重復(fù)則注冊(cè)失敗。有點(diǎn)小疑問(wèn),已用注釋標(biāo)出來(lái)
package 登陸判斷;
import java.sql.Connection;
import java.sql.DriverManager;
import
java.sql.PreparedStatement;
import java.sql.ResultSet;
import
java.sql.SQLException;
import java.sql.Statement;
public class Register {
public static void registUser(User u){
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch
(ClassNotFoundException e) {
e.printStackTrace();
}
String
url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user =
"scott";
String password = "tiger";
Connection conn =
null;
String sql = "Insert Into USERINFO
values(?,?,?)";
PreparedStatement pst =
null;
//判斷登陸名是否已經(jīng)存在
Statement s = null;
ResultSet rs =
null;
String sql_ck = "Select LOGINNAME FROM USERINFO";
try
{
conn = DriverManager.getConnection(url, user, password);
pst =
conn.prepareStatement(sql);
pst.setString(1,
u.getName());
pst.setString(2, u.getLoginname());
pst.setString(3,
u.getLoginpsw());
//判斷登陸名是否已經(jīng)存在
s =
conn.createStatement();
rs =
s.executeQuery(sql_ck);
while(rs.next()){//為什么用 rs.getString(2)會(huì)提示
無(wú)效的索引呢
if( rs.getString("LOGINNAME").equals(u.getLoginname())
){
System.out.println("登陸名已經(jīng)存在,注冊(cè)失敗");
break;
}else{
pst.executeUpdate();
System.out.println("注冊(cè)成功");
break;
}
}
}
catch (SQLException e) {
e.printStackTrace();
}finally{
try
{
rs.close();
pst.close();
s.close();
conn.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
//main界面//
//數(shù)據(jù)庫(kù)中表的結(jié)構(gòu)式這樣
//name(用戶名,用于顯示),
//loginname(登錄名,即登陸時(shí)輸入的ID)
//loginpsw(登陸時(shí)輸入的密碼)
package
登陸判斷;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int chos = 0;
Scanner sc = new
Scanner(System.in);
System.out.println("\t\t登陸請(qǐng)按1\t\t注冊(cè)請(qǐng)按2");
chos =
sc.nextInt();
switch(chos){
case 1:
Check.checkUser(In.getUser());break;
case 2:
Register.registUser(In.registerUser());break;
default:
System.out.println("請(qǐng)輸入正確的選擇");break;
}
}
}
import java.util.Scanner;/**
* 采用面向?qū)ο蟮姆绞?寫(xiě)一個(gè)登錄系統(tǒng)
* @author Administrator
*
*///用戶信息class UserInfo{ public static String[] user = new String[10]; public static String[] passwd = new String[10];
public UserInfo() { this.user[0] = "test"; this.passwd[0] ="123456";
}
}//找回密碼class ZhaoHui extends UserInfo{ public static void zhaohui() {
Scanner s = new Scanner(System.in);
System.out.println("請(qǐng)輸入你要找回的用戶名:");
String zname = s.nextLine(); for(int i=0;i2;i++) { if(user[i].equals(zname)) {
Scanner ss = new Scanner(System.in);
System.out.println("恭喜你!成功找回密碼,請(qǐng)輸入:"+"'張哥最帥'"+" 查看密碼");
String zgzs = ss.nextLine();
if("張哥最帥".equals(zgzs)) {
System.out.println(passwd[i]);
}else {
System.out.println("請(qǐng)輸正確!");
}
}else if(user[i]!=zname){
System.out.println("用戶名不存在!"); return;
}
break;
}
}
}//修改密碼 class XiuGai extends UserInfo{ public static void xiugai() {
Scanner s =new Scanner(System.in);
System.out.println("請(qǐng)輸入您要修改的密碼:");
String xpasswd = s.nextLine(); for(int i=0;i2;i++) {
passwd[i] = xpasswd; if(xpasswd.equals(passwd[i])) {
System.out.println("恭喜你,修改成功!"); break;
}else {
System.out.println("修改密碼失敗"); break;
}
}
}
}//查詢用戶class ChaXun extends UserInfo{
public static void select() { for(int i=0;i2;i++) {
System.out.println("當(dāng)前用戶:"+user[i] +"\n"+ "當(dāng)前密碼:"+passwd[i] );
i++; break;
}
}
}//注冊(cè)class ZhuCe extends UserInfo{
public static void regist() {
Scanner ss = new Scanner(System.in);
System.out.println("請(qǐng)輸入用戶名:");
String suser = ss.nextLine();
System.out.println("請(qǐng)輸入密碼:");
String spasswd = ss.nextLine();
for(int i=0;iuser.length;i++) {
user[i] = suser;
passwd[i] = spasswd;
System.out.println("注冊(cè)成功!"); break;
}
}
}//登錄class Loginc extends UserInfo{
public static void login() { int flag = 1;
Scanner scanner = new Scanner(System.in);
System.out.println("請(qǐng)輸入用戶名:");
String users = scanner.nextLine();
System.out.println("請(qǐng)輸入密碼:");
String passwds = scanner.nextLine();
for(int i=0;iUserInfo.user.length;i++) { if(user[i].equals(users) passwd[i].equals(passwds)) {
System.out.println("登陸成功!"); break;
}
System.out.println("登陸失??!"); break;
}
}
}//主界面class ZhuJieMian{ public static void Start() {
Loginc Loginc = new Loginc();
ZhuCe ZhuCe = new ZhuCe();
ChaXun ChaXun = new ChaXun();
XiuGai XiuGai = new XiuGai();
ZhaoHui ZhaoHui = new ZhaoHui();
Scanner s = new Scanner(System.in); while(true) {
System.out.println("|"+ "\t"+ "\t"+ "\t"+ "\t"+ "\t"+ "\t"+ "\t"+"\t"+"|");
System.out.println("|"+"\t" + "測(cè)試用戶名:test 測(cè)試密碼:123456" + "\t"+ "\t"+ "\t"+ "\t"+"|");
System.out.println("|" + "\t"+ "請(qǐng)輸入[1-5]進(jìn)行操作 1.登錄|2.注冊(cè)|3.查詢當(dāng)前用戶|4.修改密碼|5.找回密碼 " + "\t"+"|");
System.out.print("請(qǐng)輸入:"); int temp = s.nextInt();
switch(temp) { case 1:Loginc.login(); break; case 2:ZhuCe.regist();; break; case 3:ChaXun.select();; break; case 4:XiuGai.xiugai();; break; case 5:ZhaoHui.zhaohui();; break; default:System.out.println("錯(cuò)誤!請(qǐng)重寫(xiě)輸入正確的數(shù)字進(jìn)行操作!");
}
}
}
}public class LoginTest { public static void main(String[] args) {
ZhuJieMian zjm = new ZhuJieMian();
zjm.Start();
}
}