本文目录一览:
- 1、java 登陆时的验证码怎么做?
- 2、java登陆界面验证
- 3、java登录模块验证出现问题求解答
- 4、Java (for循环)编程 实现用户登录时的信息验证
- 5、java 如何实现同一账户登录验证
- 6、JAva登录验证窗口
java 登陆时的验证码怎么做?
后台写一个生成图片随机的代码,生成图片给前台。切换图片的时候,使用ajax获取图片数据就行。
附上生成图片的代码
public class ValidateCode {
private int width=180;
private int height=60;
private int codeCount = 4;
private int x = 0;
private int codeY;
private String Code;
private BufferedImage buffImg;
static char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', 'o', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
private int fontHeight;
public ValidateCode() {
x = width / (codeCount + 2);
fontHeight = height - 2;
codeY = height - 4;
CreateCode();
}
public void CreateCode(){
// 定义图像buffer
BufferedImage buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
// 创建一个随机数生成器类
Random random = new Random();
// 将图像填充为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
// 创建字体,字体的大小应该根据图片的高度来定。
Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
// 设置字体。
g.setFont(font);
// 画边框。
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0;
// 随机产生codeCount数字的验证码。
for (int i = 0; i codeCount; i++) {
// 得到随机产生的验证码数字。
String strRand = String.valueOf(codeSequence[random.nextInt(62)]);
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
// 用随机产生的颜色将验证码绘制到图像中。
g.setColor(new Color(red, green, blue));
g.drawString(strRand, (i ) * x+20, codeY);
// 将产生的四个随机数组合在一起。
randomCode.append(strRand);
}
this.Code=randomCode.toString().toUpperCase();
this.buffImg=buffImg;
}
public String getCode() {
return Code;
}
public void setCode(String code) {
Code = code;
}
public BufferedImage getBuffImg() {
return buffImg;
}
public void setBuffImg(BufferedImage buffImg) {
this.buffImg = buffImg;
}
}
java登陆界面验证
以下代码就是了。
详细参照附件
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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 LoginJFrame extends JFrame implements ActionListener {
private JTextField text_username;
private JPasswordField password_pwd;
private JButton button_lg, button_close;
private JLabel msgArea;
public LoginJFrame() {
super("登录");
this.setBounds(500, 240, 320, 260);
setResizable(false);
setBackground(java.awt.Color.lightGray);
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setLayout(new GridLayout(4, 1, 20, 10));
getContentPane().add(new JLabel("在线考试系统用户登录", JLabel.CENTER));
JPanel panel_1 = new JPanel(new GridLayout(2, 2, 0, 5));
getContentPane().add(panel_1);
panel_1.add(new JLabel("用户名:", JLabel.CENTER));
text_username = new JTextField(20);
panel_1.add(text_username);
panel_1.add(new JLabel("密 码:", JLabel.CENTER));
password_pwd = new JPasswordField(20);
panel_1.add(password_pwd);
JPanel panel_2 = new JPanel(new GridLayout(1, 2, 30, 0));
getContentPane().add(panel_2);
button_lg = new JButton("登陆");
panel_2.add(button_lg);
button_lg.addActionListener(this);
button_close = new JButton("注册");
panel_2.add(button_close);
setVisible(true);
// 添加一个控件用于显示提示信息
JPanel panel_3 = new JPanel();
msgArea = new JLabel();
getContentPane().add(panel_3.add(msgArea));
setVisible(true);
}
public static void main(String arg[]) {
new LoginJFrame();
}
public void actionPerformed(ActionEvent e) {
// 登录按钮
if (e.getSource() == button_lg) {
if (text_username.getText().isEmpty() password_pwd.getText().isEmpty()) {
msgArea.setText("请输入用户名和密码!");
return;
}
if (text_username.getText().isEmpty()) {
msgArea.setText("用户名不能为空!");
return;
}
if (password_pwd.getText().isEmpty()) {
msgArea.setText("密码不能为空!");
return;
}
// TODO 连接数据库验证用户
}
}
}
java登录模块验证出现问题求解答
前期准备
首先要先明确有个大体的思路,要实现什么样的功能,了解完成整个模块要运用到哪些方面的知识,以及从做的过程中去发现自己的不足。技术方面的进步大都都需要从实践中出来的。
功能:用户注册功能+系统登录功能+生成验证码
知识:窗体设计、数据库设计、JavaBean封装属性、JDBC实现对数据库的连接、验证码(包括彩色验证码)生成技术,还有就些比如像使用正则表达式校验用户注册信息、随机获得字符串、对文本可用字符数的控制等
设计的模块预览图:
彩色验证码预览图:
所用数据库:MySQL
数据库设计
创建一个数据库db_database01,其中包含一个表格tb_user,用来保存用户的注册的数据。
其中包含4个字段
id int(11)
username varchar(15)
password varchar(20)
email varchar(45)
MySQL语句可以这样设计:
create schema db_database01;
use db_database01;
create table tb_user(
id int(11) not null auto_increment primary key,
username varchar(15) not null,
password varchar(20) not null,
email varchar(45) not null
);
insert into tb_user values(1,"lixiyu","lixiyu",lixiyu419@gmail.com);
这样把lixiyu作为用户名。
select语句检查一下所建立的表格:
编写JavaBean封装用户属性
package com.lixiyu.model;
public class User {
private int id;// 编号
private String username;// 用户名
private String password;// 密码
private String email;// 电子邮箱
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
编写JDBC工具类
将与数据库操作相关的代码放置在DBConfig接口和DBHelper类中
DBConfig接口用于保存数据库、用户名和密码信息
代码:
package com.lixiyu.util;
public interface DBConfig {
String databaseName = "db_database01";// 数据库名称
String username = "root";// 数据库用户名
String password = "lixiyu";// 数据库密码
}
为简化JDBC开发,DBHelper使用了了Commons DbUtil组合。
DBHelper类继承了DBConfig接口,该类中包含4种方法:
(1)getConnection()方法:获得数据库连接,使用MySQL数据源来简化编程,避免因加载数据库驱动而发生异常。
(2)exists()方法:判断输入的用户名是否存在。
(3)check()方法:当用户输入用户名和密码,查询使用check()方法是否正确。
(4)save()方法:用户输入合法注册信息后,,将信息进行保存。
详细代码:
package com.lixiyu.util;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.apache.commons.lang.StringEscapeUtils;
import com.lixiyu.model.User;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public class DBHelper implements DBConfig {
/*
* 使用MySQL数据源获得数据库连接对象
*
* @return:MySQL连接对象,如果获得失败返回null
*/
public static Connection getConnection() {
MysqlDataSource mds = new MysqlDataSource();// 创建MySQL数据源
mds.setDatabaseName(databaseName);// 设置数据库名称
mds.setUser(username);// 设置数据库用户名
mds.setPassword(password);// 设置数据库密码
try {
return mds.getConnection();// 获得连接
} catch (SQLException e) {
e.printStackTrace();
}
return null;// 如果获取失败就返回null
}
/*
* 判断指定用户名的用户是否存在
*
* @return:如果存在返回true,不存在或者查询失败返回false
*/
public static boolean exists(String username) {
QueryRunner runner = new QueryRunner();// 创建QueryRunner对象
String sql = "select id from tb_user where username = '" + username + "';";// 定义查询语句
Connection conn = getConnection();// 获得连接
ResultSetHandlerListObject rsh = new ColumnListHandler();// 创建结果集处理类
try {
ListObject result = runner.query(conn, sql, rsh);// 获得查询结果
if (result.size() 0) {// 如果列表中存在数据
return true;// 返回true
} else {// 如果列表中没有数据
return false;// 返回false
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);// 关闭连接
}
return false;// 如果发生异常返回false
}
/*
* 验证用户名和密码是否正确 使用Commons Lang组件转义字符串避免SQL注入
*
* @return:如果正确返回true,错误返回false
*/
public static boolean check(String username, char[] password) {
username = StringEscapeUtils.escapeSql(username);// 将用户输入的用户名转义
QueryRunner runner = new QueryRunner();// 创建QueryRunner对象
String sql = "select password from tb_user where username = '" + username + "';";// 定义查询语句
Connection conn = getConnection();// 获得连接
ResultSetHandlerObject rsh = new ScalarHandler();// 创建结果集处理类
try {
String result = (String) runner.query(conn, sql, rsh);// 获得查询结果
char[] queryPassword = result.toCharArray();// 将查询到得密码转换成字符数组
if (Arrays.equals(password, queryPassword)) {// 如果密码相同则返回true
Arrays.fill(password, '0');// 清空传入的密码
Arrays.fill(queryPassword, '0');// 清空查询的密码
return true;
} else {// 如果密码不同则返回false
Arrays.fill(password, '0');// 清空传入的密码
Arrays.fill(queryPassword, '0');// 清空查询的密码
return false;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);// 关闭连接
}
return false;// 如果发生异常返回false
}
/*
* 保存用户输入的注册信息
*
* @return:如果保存成功返回true,保存失败返回false
*/
public static boolean save(User user) {
QueryRunner runner = new QueryRunner();// 创建QueryRunner对象
String sql = "insert into tb_user (username, password, email) values (?, ?, ?);";// 定义查询语句
Connection conn = getConnection();// 获得连接
Object[] params = { user.getUsername(), user.getPassword(), user.getEmail() };// 获得传递的参数
try {
int result = runner.update(conn, sql, params);// 保存用户
if (result 0) {// 如果保存成功返回true
return true;
} else {// 如果保存失败返回false
return false;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);// 关闭连接
}
return false;// 如果发生异常返回false
}
}
系统登录
1.1窗体设计
使用BoxLayout布局,将控件排列方式设置从上至下:
复制代码代码如下:
contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.PAGE_AXIS));
窗体使用了标签、文本域、密码域和按钮等控件
实现代码:
public class login extends JFrame{
private static final long serialVersionUID = -4655235896173916415L;
private JPanel contentPane;
private JTextField usernameTextField;
private JPasswordField passwordField;
private JTextField validateTextField;
private String randomText;
public static void main(String args[]){
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Throwable e) {
e.printStackTrace();
}
EventQueue.invokeLater(new Runnable(){
public void run(){
try{
login frame=new login();
frame.setVisible(true);
}catch(Exception e){
e.printStackTrace();
}
}
});
}
public login(){
setTitle("系统登录");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane=new JPanel();
setContentPane(contentPane);
contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.PAGE_AXIS));
JPanel usernamePanel=new JPanel();
contentPane.add(usernamePanel);
JLabel usernameLable=new JLabel("\u7528\u6237\u540D\uFF1A");
usernameLable.setFont(new Font("微软雅黑", Font.PLAIN, 15));
usernamePanel.add(usernameLable);
usernameTextField=new JTextField();
usernameTextField.setFont(new Font("微软雅黑", Font.PLAIN, 15));
usernamePanel.add(usernameTextField);
usernameTextField.setColumns(10);
JPanel passwordPanel = new JPanel();
contentPane.add(passwordPanel);
JLabel passwordLabel = new JLabel("\u5BC6 \u7801\uFF1A");
passwordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 15));
passwordPanel.add(passwordLabel);
passwordField = new JPasswordField();
passwordField.setColumns(10);
passwordField.setFont(new Font("微软雅黑", Font.PLAIN, 15));
passwordPanel.add(passwordField);
JPanel validatePanel = new JPanel();
contentPane.add(validatePanel);
JLabel validateLabel = new JLabel("\u9A8C\u8BC1\u7801\uFF1A");
validateLabel.setFont(new Font("微软雅黑", Font.PLAIN, 15));
validatePanel.add(validateLabel);
validateTextField = new JTextField();
validateTextField.setFont(new Font("微软雅黑", Font.PLAIN, 15));
validatePanel.add(validateTextField);
validateTextField.setColumns(5);
randomText = RandomStringUtils.randomAlphanumeric(4);
CAPTCHALabel label = new CAPTCHALabel(randomText);//随机验证码
label.setFont(new Font("微软雅黑", Font.PLAIN, 15));
validatePanel.add(label);
JPanel buttonPanel=new JPanel();
contentPane.add(buttonPanel);
JButton submitButton=new JButton("登录");
submitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
do_submitButton_actionPerformed(e);
}
});
submitButton.setFont(new Font("微软雅黑", Font.PLAIN, 15));
buttonPanel.add(submitButton);
JButton cancelButton=new JButton("退出");
cancelButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
do_cancelButton_actionPerformed(e);
}
});
cancelButton.setFont(new Font("微软雅黑",Font.PLAIN,15));
buttonPanel.add(cancelButton);
pack();// 自动调整窗体大小
setLocation(com.lixiyu.util.SwingUtil.centreContainer(getSize()));// 让窗体居中显示
}
窗体居中显示:
public class SwingUtil {
/*
* 根据容器的大小,计算居中显示时左上角坐标
*
* @return 容器左上角坐标
*/
public static Point centreContainer(Dimension size) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();// 获得屏幕大小
int x = (screenSize.width - size.width) / 2;// 计算左上角的x坐标
int y = (screenSize.height - size.height) / 2;// 计算左上角的y坐标
return new Point(x, y);// 返回左上角坐标
}
}
1.2获取及绘制验证码
public class CAPTCHALabel extends JLabel {
private static final long serialVersionUID = -963570191302793615L;
private String text;// 用于保存生成验证图片的字符串
public CAPTCHALabel(String text) {
this.text = text;
setPreferredSize(new Dimension(60, 36));// 设置标签的大小
}
@Override
public void paint(Graphics g) {
super.paint(g);// 调用父类的构造方法
g.setFont(new Font("微软雅黑", Font.PLAIN, 16));// 设置字体
g.drawString(text, 5, 25);// 绘制字符串
}
}
*彩色验证码:
public class ColorfulCAPTCHALabel extends JLabel {
private static final long serialVersionUID = -963570191302793615L;
private String text;// 用于保存生成验证图片的字符串
private Color[] colors = { Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
Color.PINK, Color.RED, Color.WHITE, Color.YELLOW };// 定义画笔颜色数组
public ColorfulCAPTCHALabel(String text) {
this.text = text;
setPreferredSize(new Dimension(60, 36));// 设置标签的大小
}
@Override
public void paint(Graphics g) {
super.paint(g);// 调用父类的构造方法
g.setFont(new Font("微软雅黑", Font.PLAIN, 16));// 设置字体
for (int i = 0; i text.length(); i++) {
g.setColor(colors[RandomUtils.nextInt(colors.length)]);
g.drawString("" + text.charAt(i), 5 + i * 13, 25);// 绘制字符串
}
}
}
1
Java (for循环)编程 实现用户登录时的信息验证
import java.util.*;
public class PswVerify { /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
Scanner input =new Scanner(System.in);
String username ="manage";
int password = 0000;
for(int i =3;i=1;i--)
{
System.out.println("请输入用户名:");
String name =input.next();
System.out.println("请输入密码:");
int pw =input.nextInt();
if(name.equals(username)pw==password)
{
System.out.println("欢迎进入我行我素购物管理系统");
break;
}
else if(i!=1)
{
System.out.println("用户名和密码不匹配!");
System.out.println("你还有"+(i-1)+"次机会,请重新输入:");
}
else
{
System.out.println("您没有权限进入系统!");
} }}
}
java 如何实现同一账户登录验证
今天继续讨论?-0-#这个只需要session和application就好了,用户登录时,这样写:User
user
=
dao.login(userName,
password);//
数据库中判断用户名和密码if
(null
!=
user)
{//
表示用户存在
session.setAttribute("user",
user);//
把用户放进session中
application.setAttribute(userName,
session.getId());/*
把用户所在的sessionId放进application中,首先要明白一点,一个session对应一个浏览器,其次要注意一点,userName必须是唯一的*/}当用户访问到其他url的时候,可以在过滤器或你的拦截器中这样写:User
user
=
(User)
session.getAttribute("user");//
从session中取出用户if
(null
==
user)
{//
未登录或者登录已经过期
response.sendRedirect(request.getContextPath());//
跳转到首页或登录页面}String
sessionId
=
(String)
application.getAttribute(user.getUserName());if
(null
==
sessionId
||
!sessionId.equals(session.getId()))
{/*这说明用户已经在其他电脑或其它浏览器登录了,那么之前登录的session就无效了,自动被后面的登录给踢掉*/
response.sendRedirect(request.getContextPath());//
跳转到首页或登录页面}chain.doFilter(request,
response);//
通过验证,放行用户进入目标url这种方式是我的一个前辈想到的,我们公司的所有项目都采纳了这种方式,确保一个账号只能在一个浏览器中使用
JAva登录验证窗口
我帮你改了一下,你那个登录和重置按钮的监听器里的代码书上估计是省略了,运行效果:
代码在这里:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JOptionPane;
import java.awt.Font;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.sql.*;
public class UserLogIn extends JFrame{
public JPanel pnluser;
public JLabel lbl用户登录,lbl用户名,lbl密码;
public JTextField txt用户名;
public JPasswordField pwd密码;
public JButton btn登录,btn重置;
String dburl="jdbc:odbc:driver={Microsoft Access Driver(*.mdb,*.accdb)};DBQ=D://stdub.mdb";
Connection conn=null;
Statement stmt=null;
int 查询记录=0;
public static void main(String[] args){
new TestClass();
}
public UserLogIn(){
pnluser=new JPanel();
lbl用户登录=new JLabel();
lbl用户名=new JLabel();
lbl密码=new JLabel();
txt用户名=new JTextField();
pwd密码=new JPasswordField();
btn登录=new JButton();
btn重置=new JButton();
userInit();
}
public void userInit(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400,300);
this.setResizable(false);
this.setTitle("登录");
this.pnluser.setLayout(null);
this.pnluser.setBackground(Color.white);
this.lbl用户登录.setText("用户登录");
this.lbl用户登录.setFont(new Font("宋体",Font.BOLD,18));
this.lbl用户登录.setForeground(Color.blue);
this.lbl用户名.setText("用户名");
this.lbl用户名.setText("密码");
this.lbl用户名.setText("登录");
this.lbl用户名.setText("重置");
this.lbl用户登录.setBounds(160,15,80,30);
this.lbl用户名.setBounds(90,70,80,30);
this.lbl密码.setBounds(90,120,80,30);
this.txt用户名.setBounds(160,70,150,30);
this.pwd密码.setBounds(160,120,150,30);
this.btn登录.setBounds(100,200,80,30);
this.btn登录.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e){
//这里写按登录按钮后执行的代码,书上估计是省略了。
System.out.println("登录");
}
}
);
this.btn重置.setBounds(220,200,80,30);
this.btn重置.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e){
//这里写按重置按钮后执行的代码,书上估计是省略了。
System.out.println("重置");
}
}
);
this.pnluser.add(lbl用户登录);
this.pnluser.add(lbl用户名);
this.pnluser.add(lbl密码);
this.pnluser.add(txt用户名);
this.pnluser.add(pwd密码);
this.pnluser.add(btn登录);
this.pnluser.add(btn重置);
this.add(pnluser);
this.setVisible(true);
}
}