import java.awt.BorderLayout;
成都創(chuàng)新互聯(lián)專注于鶴山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供鶴山營銷型網(wǎng)站建設(shè),鶴山網(wǎng)站制作、鶴山網(wǎng)頁設(shè)計(jì)、鶴山網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造鶴山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鶴山網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Login {
private JFrame frame = new JFrame("登錄");
private Container c = frame.getContentPane();
private JTextField username = new JTextField();
private JPasswordField password = new JPasswordField();
private JButton ok = new JButton("確定");
private JButton cancel = new JButton("取消");
public Login(){
frame.setSize(300,200);
c.setLayout(new BorderLayout());
initFrame();
frame.setVisible(true);
}
private void initFrame() {
//頂部
JPanel titlePanel = new JPanel();
titlePanel.setLayout(new FlowLayout());
titlePanel.add(new JLabel("系統(tǒng)管理員登錄"));
c.add(titlePanel,"North");
//中部表單
JPanel fieldPanel = new JPanel();
fieldPanel.setLayout(null);
JLabel l1 = new JLabel("用戶名:");
l1.setBounds(50, 20, 50, 20);
JLabel l2 = new JLabel("密 碼:");
l2.setBounds(50, 60, 50, 20);
fieldPanel.add(l1);
fieldPanel.add(l2);
username.setBounds(110,20,120,20);
password.setBounds(110,60,120,20);
fieldPanel.add(username);
fieldPanel.add(password);
c.add(fieldPanel,"Center");
//底部按鈕
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(ok);
buttonPanel.add(cancel);
c.add(buttonPanel,"South");
}
public static void main(String[] args){
new Login();
}
}
程序如下:
mport java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
@SuppressWarnings("serial")
public class MainFrame extends JFrame {
JLabel lbl1 = new JLabel("用戶名:");
JLabel lbl2 = new JLabel("密 ? ? 碼:");
JTextField txt = new JTextField("admin",20);
JPasswordField pwd = new JPasswordField(20);
JButton btn = new JButton("登錄");
JPanel pnl = new JPanel();
private int error = 0;
public MainFrame(String title) throws HeadlessException {
super(title);
init();
}
private void init() {
this.setResizable(false);
pwd.setEchoChar('*');
pnl.add(lbl1);
pnl.add(txt);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ("admin".equal花憨羔窖薏忌割媳公顱s(new String(pwd.getPassword()))){
pnl.removeAll();
JLabel lbl3 = new JLabel();
ImageIcon icon = new ImageIcon(this.getClass().getResource("pic.jpg"));
lbl3.setIcon(icon);
pnl.add(lbl3);
}
else{
if(error 3){
JOptionPane.showMessageDialog(null,"密碼輸入錯(cuò)誤,請(qǐng)?jiān)僭囈淮?);
error++;
}
else{
JOptionPane.showMessageDialog(null,"對(duì)不起,您不是合法用戶");
txt.setEnabled(false);
pwd.setEnabled(false);
btn.setEnabled(false);
}
}
}
});
}
public static void main(String[] args) {
MainFrame frm = new MainFrame("測試");
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setBounds(100, 100, 300, 120);
frm.setVisible(true);
}
}
編程的注意事項(xiàng):
1、Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了C++語言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強(qiáng)大和簡單易用兩個(gè)特征。Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。
2、 Java具有簡單性、面向?qū)ο蟆⒎植际健⒔研浴踩浴⑵脚_(tái)獨(dú)立與可移植性、多線程、動(dòng)態(tài)性等特點(diǎn)。Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。
3、2006年11月13日,Java技術(shù)的發(fā)明者Sun公司宣布,將Java技術(shù)作為免費(fèi)軟件對(duì)外發(fā)布。Sun公司正式發(fā)布的有關(guān)Java平臺(tái)標(biāo)準(zhǔn)版的第一批源代碼,以及Java迷你版的可執(zhí)行源代碼。從2007年3月起,全世界所有的開發(fā)人員均可對(duì)Java源代碼進(jìn)行修改。
你要先學(xué)會(huì)截圖哦,你發(fā)的看不清楚,重新寫了一個(gè)你參考參考!
import java.awt.GridLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
public class Day30A extends JFrame {
private static final long serialVersionUID = 1L;
private JLabel labelName,labelId,labelPass,labelMoney,labelSelect,labelCar;
private JComboBoxString jcb;
private JPanel jp1,jp2,jp3,jp4,jp5,jp6,jp7;
private ButtonGroup btg;
private JRadioButton jr1,jr2;
Day30A(){
this.setTitle("注冊(cè)賬戶");
this.setLayout(new GridLayout(7,1));
this.setSize(300,280);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
init();
this.setVisible(true);
}
private void init() {
String str="卡片類型1,卡片類型2,卡片類型3,卡片類型4,卡片類型5";
jcb=new JComboBox(str.split(","));
labelId=new JLabel("賬號(hào): ");
labelName=new JLabel("姓名: ");
labelPass=new JLabel("密碼: ");
labelMoney=new JLabel("開戶金額:");
labelSelect=new JLabel("存款類型:");
labelCar=new JLabel("卡片類型:");
addFun1();
addFun2();
}
private void addFun2() {
this.add(jp1);
this.add(jp2);
this.add(jp3);
this.add(jp4);
this.add(jp5);
this.add(jp6);
this.add(jp7);
}
private void addFun1() {
jp1=new JPanel();
jp1.add(labelId);
jp1.add(new JTextField(15));
jp2=new JPanel();
jp2.add(labelName);
jp2.add(new JTextField(15));
jp3=new JPanel();
jp3.add(labelPass);
jp3.add(new JTextField(15));
jp4=new JPanel();
jp4.add(labelMoney);
jp4.add(new JTextField(13));
jp5=new JPanel();
jp5.add(labelSelect);
btg=new ButtonGroup();
jr1=new JRadioButton("定期");
jr2=new JRadioButton("活期",true);
btg.add(jr1);
btg.add(jr2);
jp5.add(jr1);
jp5.add(jr2);
jp6=new JPanel();
jp6.add(labelCar);
jp6.add(jcb);
jp7=new JPanel();
jp7.add(new JButton("確定"));
jp7.add(new JButton("取消"));
}
public static void main(String[] args) {
new Day30A();
}
}
/* Main.java
*
* Created on __DATE__, __TIME__
*/
import javax.swing.JOptionPane;
/**
*
* @author __USER__
*/
public class Main extends javax.swing.JFrame {
/** Creates new form Main */
public Main() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
//GEN-BEGIN:initComponents
// editor-fold defaultstate="collapsed" desc="Generated Code"
private void initComponents() {
jPanel1 = new javax.swing.JPanel(); //標(biāo)簽
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton(); //登錄按鈕
jButton2 = new javax.swing.JButton(); //
jTextField1 = new javax.swing.JTextField(); //文本框
jTextField2 = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); //關(guān)閉時(shí)的操作,即退出程序
setTitle("登錄界面"); //設(shè)置標(biāo)題:歡迎使用股票管理系統(tǒng)
setResizable(false); //設(shè)置窗口不可調(diào)節(jié)大小
jLabel1.setFont(new java.awt.Font("微軟雅黑", 0, 18)); //設(shè)置標(biāo)簽的字體
jLabel1
.setText("您好,請(qǐng)輸入信息");
jLabel2.setText("用戶名");
jLabel3.setText("用戶密碼");
jButton1.setText("登錄");
jButton1.addActionListener(new java.awt.event.ActionListener() { //采用匿名內(nèi)部類來實(shí)現(xiàn)按鈕監(jiān)聽功能
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jButton2.setText("退出");
jButton2.addActionListener(new java.awt.event.ActionListener() { //同上
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout( //層次布局管理器,下面n長的代碼,就是設(shè)置位置,自己看吧,呵呵,這個(gè)必須的,就不多寫了
jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout
.setHorizontalGroup(jPanel1Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
jPanel1Layout.createSequentialGroup()
.addContainerGap(159, Short.MAX_VALUE)
.addComponent(jLabel1).addGap(140, 140,
140))
.addGroup(
jPanel1Layout
.createSequentialGroup()
.addGap(110, 110, 110)
.addGroup(
jPanel1Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addGap(54, 54, 54)
.addGroup(
jPanel1Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
jPanel1Layout
.createSequentialGroup()
.addComponent(
jTextField2,
javax.swing.GroupLayout.DEFAULT_SIZE,
191,
Short.MAX_VALUE)
.addGap(
112,
112,
112))
.addGroup(
jPanel1Layout
.createSequentialGroup()
.addComponent(
jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE,
191,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())))
.addGroup(
jPanel1Layout
.createSequentialGroup()
.addGap(141, 141, 141)
.addComponent(
jButton1,
javax.swing.GroupLayout.PREFERRED_SIZE,
68,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(89, 89, 89)
.addComponent(
jButton2,
javax.swing.GroupLayout.PREFERRED_SIZE,
72,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(145, Short.MAX_VALUE)));
jPanel1Layout
.setVerticalGroup(jPanel1Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
jPanel1Layout
.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addGap(55, 55, 55)
.addGroup(
jPanel1Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(
jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(41, 41, 41)
.addGroup(
jPanel1Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(
jTextField2,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(43, 43, 43)
.addGroup(
jPanel1Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
jButton1,
javax.swing.GroupLayout.PREFERRED_SIZE,
33,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
jButton2,
javax.swing.GroupLayout.PREFERRED_SIZE,
33,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(48, Short.MAX_VALUE)));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addGroup(
layout.createSequentialGroup().addContainerGap().addComponent(
jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap()));
layout.setVerticalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addGroup(
layout.createSequentialGroup().addContainerGap().addComponent(
jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)));
pack();
setLocationRelativeTo(null); //居中
}// /editor-fold
//GEN-END:initComponents
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //事件處理,不建議這樣做
// TODO add your handling code here:
String name = this.jTextField1.getText().trim(); //獲得用戶名,去空格
String password = this.jTextField2.getText().trim(); //獲得密碼,去空格
if (name.equals("admin") password.equals("123456")) { //如果符合條件.....其實(shí)這里應(yīng)該去和數(shù)據(jù)庫關(guān)聯(lián),這是死代碼
// Showinformation sf=new Showinformation(); //我估計(jì)是另外一個(gè)框架,就是登錄成功之后的框架
// sf.setVisible(true);
// sf.show(); //這個(gè)方法就直接秒殺,不用了,因?yàn)閟f.setVisible(true)已經(jīng)被調(diào)用了,這里就多次一舉了
} else { //用戶名或者密碼驗(yàn)證失敗
JOptionPane.showMessageDialog(this, "用戶名或者密碼錯(cuò)誤啦~", "提示", //提示框
JOptionPane.INFORMATION_MESSAGE);
this.jTextField1.setText(""); //清空輸入框
this.jTextField2.setText("");
}
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { //事件處理,其實(shí)可以將jButton1ActionPerformed放在一起處理,只要獲得按鈕的標(biāo)簽內(nèi)容 (JButton)(evt.getSuorse()).getText()就做對(duì)比就ko了
// TODO add your handling code here:
System.exit(0);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() { //好方法,呵呵使用該方式的原因是:awt是單線程模式的,所有awt的組件只能在(推薦方式)事件處理線程中訪問,從而保證組件狀態(tài)的可確定性。java核心編程技術(shù)中每個(gè)實(shí)例基本都用到了
public void run() {
new Main().setVisible(true);
}
});
}
//GEN-BEGIN:variables
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;}
// End of variables declaration//GEN-END:variables
你修改一下吧,從記事本獲得用戶名判斷一下就行了
本系統(tǒng)分為兩個(gè)功能:
注冊(cè)和登錄,
當(dāng)用戶注冊(cè)一個(gè)新用戶時(shí)
(可以使用英
文和中文用戶名)
,就是向數(shù)據(jù)庫的
user
表中添加一條記錄。
當(dāng)用戶輸入注冊(cè)信息時(shí),
本系統(tǒng)提供了基本的客戶端驗(yàn)證,
來判斷用戶輸入
的合法性,
只有當(dāng)用戶的輸入滿足系統(tǒng)的要求時(shí),
才會(huì)將用戶輸入的數(shù)據(jù)提交到
服務(wù)器端負(fù)責(zé)處理注冊(cè)信息的
Action
。
在注冊(cè)
Action
成功處理完用戶提交的注
冊(cè)信息后,
客戶端仍然會(huì)回到注冊(cè)頁面。
如果用戶想使用已經(jīng)注冊(cè)的用戶名來登
錄,可以通過單擊“登錄”超鏈接轉(zhuǎn)到登錄頁面進(jìn)行登錄。
當(dāng)用戶在登錄頁面正確輸入在數(shù)據(jù)庫中已經(jīng)存在的用戶名和密碼時(shí),
就可以
成功登錄了。
在用戶登錄頁面也擁有和用戶注冊(cè)頁面類似的客戶端驗(yàn)證機(jī)制。
也
就是說,
只有當(dāng)用戶名和密碼都輸入時(shí),
系統(tǒng)才會(huì)向服務(wù)器端負(fù)責(zé)登錄的
Action
提交信息。通過驗(yàn)證用戶名和密碼都正確,系統(tǒng)才允許登錄。
系統(tǒng)總體結(jié)構(gòu)
本系統(tǒng)的注冊(cè)系統(tǒng)和登錄系統(tǒng)是相互獨(dú)立的,
但可以通過使用注冊(cè)和登錄系
統(tǒng)的相應(yīng)超鏈接導(dǎo)航到另一個(gè)系統(tǒng)中。每一個(gè)系統(tǒng)分別由一個(gè)處理業(yè)務(wù)邏輯的
Action
、
DAO
層代碼和若干個(gè)
JSP
頁面組成。其中注冊(cè)系統(tǒng)的
Action
是
RegisterAction
類,
另外還有一個(gè)用于顯示用戶注冊(cè)頁面的
register.jsp
文件
和
一
個(gè)
負(fù)
責(zé)
顯
示
處
理
結(jié)
果
的
result.jsp
文
件
。
登
錄
系
統(tǒng)
的
Action
是
LoginAction
類,
另外還有一個(gè)
login.jsp
文件和一個(gè)表示用戶已經(jīng)成功登錄的
success.jsp
文件
3
、
實(shí)
現(xiàn)系統(tǒng)的基礎(chǔ)類
在這一部分內(nèi)容中將實(shí)現(xiàn)在注冊(cè)登錄系統(tǒng)中使用的一些重要的類,
如用于操
作數(shù)據(jù)庫的
UserDAO
接口及其實(shí)現(xiàn)類。
這些類在整個(gè)系統(tǒng)中都起著舉足輕重的作
用。
3.1
實(shí)現(xiàn)訪問數(shù)據(jù)庫的
UserDAO
類
UserDAO
實(shí)際上是一個(gè)接口,
由于注冊(cè)系統(tǒng)和登錄系統(tǒng)都需要訪問和操作數(shù)
據(jù)庫,
因此,
將這些功能都封裝在
UserDAO
接口中,
然后
UserDAOImpl
類對(duì)該接
口進(jìn)行實(shí)現(xiàn),這樣,在
LoginAction
類和
RegisterAction
類的類體中添加
UserDAO
類型的屬性,這兩個(gè)
Action
就都可以訪問和操作數(shù)據(jù)庫了。
UserDAO
接口及其實(shí)現(xiàn)類有以下功能:
通過
HibernateTemplate
對(duì)數(shù)據(jù)庫進(jìn)行連接和操作
對(duì)數(shù)據(jù)庫進(jìn)行增刪查改操作。
執(zhí)行
hql
。
UserDAO接口和UserDAOImpl
類的實(shí)現(xiàn)代碼請(qǐng)查看UserDAO.java和UserDAOImpl.java文件。
實(shí)現(xiàn)MD5加密(選做)
本系統(tǒng)保存在數(shù)據(jù)庫中的密碼是通過
MD5
算法加密的。
在
JDK
中提供了實(shí)現(xiàn)
MD5
算法的類。
通過
java.security.MessageDigest
類的
getInstance
方法可以
獲得支持
MD5
算法的
MessageDigest
對(duì)象實(shí)例。關(guān)于
MD5
加密,詳見關(guān)于
MD5
加密
.doc
文檔。
由于被
MD5
算法加密后的字符串中可能含有非可視的字符,
這些字符可能無
法保存在數(shù)據(jù)庫中,因此,需要將被加密后的字符串再次使用
Base64
格式進(jìn)行
編碼。實(shí)現(xiàn)
MD5
加密的完整代碼見
Encrypter.java
6
4
、
實(shí)現(xiàn)注冊(cè)系統(tǒng)
在這個(gè)系統(tǒng)中,有一個(gè)處理用戶提交的注冊(cè)信息的
RegisterAction
類,除
此之外,還有一個(gè)
register.jsp
,這個(gè)頁面負(fù)責(zé)顯示注冊(cè)頁面。當(dāng)
Register
類
處理完注冊(cè)信息后,
如果注冊(cè)成功,
會(huì)轉(zhuǎn)向
result.jsp
頁面,
如果注冊(cè)不成功,
則直接返回
register.jsp,
可以重新注冊(cè)。
1.
實(shí)現(xiàn)注冊(cè)
RegisterAction
類
RegisterAction
類負(fù)責(zé)處理用戶提交的注冊(cè)信息。如果注冊(cè)信息正確,就
向
user
表中添加一條記錄,否則,會(huì)通過消息對(duì)話框顯示出現(xiàn)消息。
在開始處理用戶注冊(cè)信息之前,
需要先在
RegisterAction
類中添加
userDAO
屬性,這樣通過該屬性就可以對(duì)數(shù)據(jù)庫進(jìn)行操作。然后向
user
表中插入記錄之
前,
需要先判斷一下用戶輸入的用戶名或者密碼是否有效,
如果用戶名和密碼輸
入都合法,
就調(diào)用
userDAO
屬性的
save
方法向
user
表中根據(jù)用戶輸入的信息插
入一條記錄。如果無法成功插入記錄,說明該用戶名在
user
表中已經(jīng)存在了。
為了更穩(wěn)妥,
我們可以先使用
select
語句來查詢用戶名是否存在,
然后再向
user
表中插入記錄。
RegisterAction
類的完整代碼見
RegisterAction.java
。
2.
實(shí)現(xiàn)注冊(cè)系統(tǒng)的主頁面
Register.jsp
頁面是顯示了用戶輸入注冊(cè)信息的頁面。
在
register.jsp
中
使用
form
向Register類提交注冊(cè)信息。
register.jsp頁面的代碼見
register.jsp
。
3.
實(shí)現(xiàn)結(jié)果
JSP頁面
在Register類處理完注冊(cè)信息后,如果注冊(cè)成功,就會(huì)轉(zhuǎn)向到result.jsp頁面。
這個(gè)頁面顯示了注冊(cè)成功的結(jié)果,并且可以直接通過超鏈,轉(zhuǎn)向到登錄頁面login.jsp
首先是Token主類。類很簡單\x0d\x0a\x0d\x0apackage com.company.util;\x0d\x0a\x0d\x0aimport java.util.ArrayList;\x0d\x0a\x0d\x0aimport javax.servlet.http.HttpSession;\x0d\x0a\x0d\x0apublic class Token {\x0d\x0a\x0d\x0aprivate static final String TOKEN_LIST_NAME = "tokenList";\x0d\x0a\x0d\x0apublic static final String TOKEN_STRING_NAME = "token";\x0d\x0a\x0d\x0aprivate static ArrayList getTokenList(HttpSession session) {\x0d\x0a\x0d\x0a Object obj = session.getAttribute(TOKEN_LIST_NAME);\x0d\x0a\x0d\x0a if (obj != null) {\x0d\x0a\x0d\x0a return (ArrayList) obj;\x0d\x0a\x0d\x0a } else {\x0d\x0a\x0d\x0a ArrayList tokenList = new ArrayList();\x0d\x0a\x0d\x0a session.setAttribute(TOKEN_LIST_NAME, tokenList);\x0d\x0a\x0d\x0a return tokenList;\x0d\x0a\x0d\x0a }\x0d\x0a\x0d\x0a }\x0d\x0a\x0d\x0aprivate static void saveTokenString(String tokenStr, HttpSession session) {\x0d\x0a\x0d\x0a ArrayList tokenList = getTokenList(session);\x0d\x0a\x0d\x0a tokenList.add(tokenStr);\x0d\x0a\x0d\x0a session.setAttribute(TOKEN_LIST_NAME, tokenList);\x0d\x0a\x0d\x0a }\x0d\x0a\x0d\x0aprivate static String generateTokenString(){\x0d\x0a\x0d\x0a return new Long(System.currentTimeMillis()).toString();\x0d\x0a\x0d\x0a }\x0d\x0a\x0d\x0a/** *//**\x0d\x0a\x0d\x0a * Generate a token string, and save the string in session, then return the token string.\x0d\x0a\x0d\x0a * \x0d\x0a\x0d\x0a * @param HttpSession\x0d\x0a\x0d\x0a * session\x0d\x0a\x0d\x0a * @return a token string used for enforcing a single request for a particular transaction.\x0d\x0a\x0d\x0a */\x0d\x0a\x0d\x0a public static String getTokenString(HttpSession session) {\x0d\x0a\x0d\x0a String tokenStr = generateTokenString();\x0d\x0a\x0d\x0a saveTokenString(tokenStr, session);\x0d\x0a\x0d\x0a return tokenStr;\x0d\x0a\x0d\x0a }\x0d\x0a\x0d\x0a/** *//**\x0d\x0a\x0d\x0a * check whether token string is valid. if session contains the token string, return true. \x0d\x0a\x0d\x0a * otherwise, return false.\x0d\x0a\x0d\x0a * \x0d\x0a\x0d\x0a * @param String\x0d\x0a\x0d\x0a * tokenStr\x0d\x0a\x0d\x0a * @param HttpSession\x0d\x0a\x0d\x0a * session\x0d\x0a\x0d\x0a * @return true: session contains tokenStr; false: session is null or tokenStr is id not in session\x0d\x0a\x0d\x0a */\x0d\x0a\x0d\x0a public static boolean isTokenStringValid(String tokenStr, HttpSession session) {\x0d\x0a\x0d\x0a boolean valid = false;\x0d\x0a\x0d\x0a if(session != null){\x0d\x0a\x0d\x0a ArrayList tokenList = getTokenList(session);\x0d\x0a\x0d\x0a if (tokenList.contains(tokenStr)) {\x0d\x0a\x0d\x0a valid = true;\x0d\x0a\x0d\x0a tokenList.remove(tokenStr);\x0d\x0a\x0d\x0a }\x0d\x0a\x0d\x0a }\x0d\x0a\x0d\x0a return valid;\x0d\x0a\x0d\x0a }\x0d\x0a\x0d\x0a}\x0d\x0a\x0d\x0a在jsp頁面端。\x0d\x0a\x0d\x0a首先import該類:\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0a表單包含隱藏的token字符串:\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0a在Servlet中添加如下代碼。\x0d\x0a\x0d\x0aif(Token.isTokenStringValid(request.getParameter(Token.TOKEN_STRING_NAME), request.getSession())){\x0d\x0a\x0d\x0a//進(jìn)行正常業(yè)務(wù)流程
網(wǎng)站欄目:java登錄系統(tǒng)代碼設(shè)計(jì) Java登錄代碼
網(wǎng)頁路徑:http://chinadenli.net/article40/hihjho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、用戶體驗(yàn)、微信小程序、網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)