本专栏将从基础开始,循序渐进,由浅入深讲解Java的基本使用,希望大家都能够从中有所收获,也请大家多多支持。
专栏地址:26天高效学习Java编程
相关软件地址:软件地址
所有代码地址:代码地址
如果文章知识点有错误的地方,请指正!大家一起学习,一起进步。

文章目录

  • 项目结构及结果展示
  • 代码展示
    • MainFrame模块
    • RegisterUI模块
    • RegisterUI模块
    • JDBC模块

大家好,今天用Java的awt组件、swing组件以及数据库JDBC写了一个仿QQ登录的界面,具体演示如下图所示,包括三个页面,分别是登录窗口(MainFrame)注册窗口(RegisterUI)和忘记密码窗口(ForgetUI)。本文主要应用的技术有:JAVA-GUI、JAVA的awt组件、swing组件、事件处理、JDBC等,是初学者学习和练手的好项目。准备好了吗,let’s get it!

项目结构及结果展示

该项目的结构如下图所示:

主要有三个类:

  • MainFrame是登录窗口的GUI类,效果图如下:

  • RegisterUI是注册窗口的GUI类,效果图如下:

  • ForgetUI是忘记密码窗口的GUI类,效果图如下:

代码展示

在进行代码展示前,先对Swing组件常见的控件类进行介绍,Swing组件常见的控件类有以下几种:

JLabel 标签主要用于展示 文本 或 图片,也可以 同时显示文本和图片
JButton 点击事件
JTextArea 编辑单行的文本框
JPasswordArea 一个只能输入数字的密码框 把输入的内容用其他字符回显
JTabledPlan 选项卡面板。它允许用户通过点击给定标题或图标的选项卡,在一组组件之间进行切换显示
JCheckBox 复选框,是否被选中
JPanel相当于将整个窗体划分成几个面板,然后在面板中使用布局管理器(管理按钮的布局)一个窗口只能有一个JFrame,能有多个JPlanel
Imagin.SCALE_DEFAULT 自适应JLabel的大小
getScaledInstance 创建此图像的缩放版本。返回一个新的 image 对象,默认情况下,该对象按指定的 width 和 height 呈现图像。即使已经完全加载了初始源图像,新的 image 对象也可以被异步加载
SetIcon图标将会被自动地放到按钮的上面,缺省时居中放置
setborderpainted 如果进度条应该绘制边框,则为 true;否则为 false

MainFrame模块

MainFrame的布局如下图所示:

MainFrame的代码如下:

package Frame;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;public class MainFrame extends JFrame implements ActionListener, FocusListener {private static final long serialVersionUID = 1L;private static final String _txt_account = "QQ密码/手机/邮箱";private static final String _txt_pwd = "密码";private static final String _txt_title = "QQ登录";private static final String _txt_registe = "注册";private static final String _txt_forget = "忘记密码";private static final String _txt_blank = "";private JTextField account;private JPasswordField pwd;private JLabel upper_frame;private JPanel lower_frame, center_frame;private JButton login, register, forget;MainFrame() {//控件的初始化init();add(upper_frame, BorderLayout.NORTH);add(center_frame, BorderLayout.CENTER);add(lower_frame, BorderLayout.SOUTH);ImageIcon logo = new ImageIcon("D:/image/logo.jpg"); //左上方小图标setIconImage(logo.getImage());setBounds(500, 230, 430, 360); //设定大小及位置setResizable(false); //登录框大小固定,不允许通过拖、拉改变大小setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); //设置窗口右上角的叉号,点击叉号窗口关闭 注意不能EXIT_ON_CLOSE做参数的,用它时候使用的是System.exit方法退出应用程序。故会关闭所有窗口。setTitle(_txt_title);setVisible(true); //说明数据模型已经构造好了,允许JVM可以根据数据模型执行paint方法开始画图并显示到屏幕上,一般放在最后一句}public void init() {//账号输入块account = new JTextField(_txt_account);account.setName("account");account.setForeground(Color.gray);account.addFocusListener(this); //产生事件响应用户行为//密码输入块pwd = new JPasswordField(_txt_pwd);pwd.setName("pwd");pwd.setForeground(Color.gray);pwd.setEchoChar('\0'); //启动后密码框内一定为 “密码”pwd.addFocusListener(this);//注册模块register = new JButton(_txt_registe);register.setBorderPainted(false);register.setBorder(BorderFactory.createRaisedBevelBorder()); //斜面边框(凸)register.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); register.addActionListener(this);//忘记密码模块forget = new JButton(_txt_forget);forget.setBorderPainted(false);forget.setBorder(BorderFactory.createRaisedBevelBorder());forget.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); forget.addActionListener(this);//login按钮模块login = new JButton();ImageIcon login_image = new ImageIcon("D:/image/login_image.png");login_image.setImage(login_image.getImage().getScaledInstance(430, 35, Image.SCALE_DEFAULT));login.setIcon(login_image);login.setBackground(Color.white);login.setBorderPainted(false); //如果进度条应该绘制边框,则为 true;否则为 falselogin.setBorder(null); //设置此组件的边框 无login.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); //将光标设为 “小手”形状login.addActionListener(this);//qq登录框架上半部分(无按钮之类的内容,只有一张图片)ImageIcon upper_image = new ImageIcon("D:/image/upper_image.png");upper_image.setImage(upper_image.getImage().getScaledInstance(430, 160, Image.SCALE_DEFAULT));upper_frame = new JLabel(upper_image);//qq登录中间部分 (账号、密码、 注册、forget)center_frame = new JPanel();center_frame.setName("center_frame");center_frame.setLayout(null);center_frame.setLayout(new GridLayout(3, 3, 3, 15)); //这里用到3行3列的空间, 用空格填充center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(account);center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(pwd);center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(register);center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(forget);center_frame.setBackground(Color.white);//qq登录框架的下半部分loginlower_frame = new JPanel();lower_frame.setName("lower_frame");lower_frame.setLayout(null);//lower_frame.setLayout(new GridLayout(1, 3, 3, 15));lower_frame.setLayout(new GridLayout(0, 1)); lower_frame.add(login);}//按钮的点击事件用actionPerformed@Overridepublic void actionPerformed(ActionEvent e){/** 1:如果点击了登录按钮 首先判断帐号或者密码是否为空 * 2:如果点击了注册账号就弹出注册页面* 3:如果点击了忘记密码弹出找回密码页面*///处理登录(login)页面if(e.getSource() == login){String user_name = account.getText().trim();String user_pwd = new String(pwd.getPassword()).trim();if("".equals(user_name)) {JOptionPane.showMessageDialog(null, "请输入帐号!!");return;}if("".equals(user_pwd)) {JOptionPane.showMessageDialog(null, "请输入密码!!");return;}}//处理注册(register)页面if(e.getSource() == register){RegisterUI registerUI = new RegisterUI(this);}//处理找回密码(forget)页面if(e.getSource() == forget){ForgetUI forgetUI = new ForgetUI(this);}}//鼠标的点击或移动之类的用focuslistener@Overridepublic void focusGained(FocusEvent e) {//处理账号输入框if(e.getSource() == account){if(_txt_account.equals(account.getText())){account.setText("");account.setForeground(Color.BLACK);}}//处理密码输入框if(e.getSource() == pwd){if(_txt_pwd.equals(pwd.getText())){pwd.setText("");pwd.setEchoChar('*');pwd.setForeground(Color.BLACK);}}}@Overridepublic void focusLost(FocusEvent e) {//处理账号输入框if(e.getSource() == account){if("".equals(account.getText())){account.setForeground(Color.gray);account.setText(_txt_account);}}//处理密码输入框if(e.getSource() == pwd){if("".equals(pwd.getText())){pwd.setForeground(Color.gray);pwd.setText(_txt_pwd);pwd.setEchoChar('\0');}}}public static void main(String[] args) {MainFrame mainframe = new MainFrame();}}

RegisterUI模块

RegisterUI的布局和MainFrame的类似,如下图所示:

RegisterUI的代码如下:

package Frame;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;public class RegisterUI extends JFrame implements ActionListener, FocusListener {private static final long serialVersionUID = 1L;private JLabel upper_N, user_name_txt, user_pwd_txt, user_ques_txt, user_ans_txt; //显示文字用private JButton register_button_S;private JTextField user_name, user_pwd, user_ques, user_ans; //在这里面获取用户输入private JPanel tmp_South, center_Center;private MainFrame mainFrame; //用于关闭登录页面 如果注册成功则将刚开始的注册页面关闭public RegisterUI(MainFrame mainFrame) {this.mainFrame = mainFrame;//初始化界面init();//合成整体add(center_Center, BorderLayout.CENTER);add(upper_N, BorderLayout.NORTH);add(tmp_South, BorderLayout.SOUTH);//位置、页面大小设置setSize(250, 400);setLocation(550, 300);ImageIcon logo = new ImageIcon("D:/image/register_image.png"); //左上方小图标setIconImage(logo.getImage());setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);setResizable(false);setVisible(true);}public void init() {//上方图片部分构造 上 即为 北ImageIcon upper_image = new ImageIcon("D:/image/register_background_image.jpg");upper_image.setImage(upper_image.getImage().getScaledInstance(250, 139,Image.SCALE_DEFAULT));upper_N = new JLabel(upper_image);//下方注册图片构造 下 即为 南tmp_South = new JPanel(); //作为一个容器来放确认注册按钮register_button_S = new JButton();ImageIcon conform_register_image = new ImageIcon("D:/image/conform_register_image.png");conform_register_image.setImage(conform_register_image.getImage().getScaledInstance(220, 40, Image.SCALE_DEFAULT));register_button_S.setIcon(conform_register_image);// 不绘制边框register_button_S.setBorderPainted(false);// 设置边框为空register_button_S.setBorder(null);register_button_S.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));register_button_S.addActionListener(this); //产生事件响应用户行为tmp_South.add(register_button_S);//中间部分内容center_Center = new JPanel();user_name_txt = new JLabel("用户账号", JLabel.CENTER);user_pwd_txt = new JLabel("用户密码", JLabel.CENTER);user_ques_txt = new JLabel("提示问题", JLabel.CENTER);user_ans_txt = new JLabel("问题答案", JLabel.CENTER);user_name = new JTextField();user_pwd = new JTextField();user_ques = new JTextField();user_ans = new JTextField();user_name.addFocusListener(this);user_pwd.addFocusListener(this);user_ans.addFocusListener(this);user_ques.addFocusListener(this);center_Center.setLayout(new GridLayout(4, 2));center_Center.add(user_name_txt);center_Center.add(user_name);center_Center.add(user_pwd_txt);center_Center.add(user_pwd);center_Center.add(user_ques_txt);center_Center.add(user_ques);center_Center.add(user_ans_txt);center_Center.add(user_ans);}public void actionPerformed(ActionEvent e) {/** 如果点击了登录按钮 首先判断帐号或者密码是否为空*/if (e.getSource() == register_button_S) {String username = user_name.getText().trim();String password =  user_pwd.getText().trim();String userques = user_ques.getText().trim();String userans = user_ans.getText().trim();if ("".equals(username) || username == null) {JOptionPane.showMessageDialog(null, "请输入帐号!!");return;}if ("".equals(password) || password == null) {JOptionPane.showMessageDialog(null, "请输入密码!!");return;}if ("".equals(userques) || userques == null) {JOptionPane.showMessageDialog(null, "请输入问题!!");return;}if ("".equals(userans) || userans == null) {JOptionPane.showMessageDialog(null, "请输入答案!!");return;}}}//鼠标的点击或移动之类的用focuslistener@Overridepublic void focusGained(FocusEvent e) {//处理账号输入框if(e.getSource() == user_name){user_name.setForeground(Color.BLACK);}//处理密码输入框if(e.getSource() == user_pwd){user_pwd.setForeground(Color.BLACK);}//处理问题输入框if(e.getSource() == user_ques){user_ques.setForeground(Color.BLACK);}//处理答案输入框if(e.getSource() == user_ans){user_ans.setForeground(Color.BLACK);}}@Overridepublic void focusLost(FocusEvent e) {//处理账号输入框if(e.getSource() == user_name){user_name.setForeground(Color.gray);}//处理密码输入框if(e.getSource() == user_pwd){user_pwd.setForeground(Color.gray);}//处理问题输入框if(e.getSource() == user_ques){user_ques.setForeground(Color.gray);}//处理答案输入框if(e.getSource() == user_ans){user_ans.setForeground(Color.gray);}}}

RegisterUI模块

为了掌握多种布局方式,这里RegisterUI采用的是绝对布局,相关代码如下:

package Frame;import java.awt.Color;
import java.awt.Cursor;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;public class ForgetUI extends JFrame implements ActionListener, FocusListener{private static final long serialVersionUID = 1L;private JLabel upper_N, user_name_txt, user_pwd_txt, user_ques_txt, user_ans_txt, user_ques; //显示文字用private JButton forget_button_S, submit_button;private JTextField user_name, user_pwd, user_ans; //在这里面获取用户输入private MainFrame mainFrame; //用于关闭登录页面 如果修改密码成功则将刚开始的注册页面关闭public ForgetUI(MainFrame mainFrame) {this.mainFrame = mainFrame;//页面构造init();//合成整体add(upper_N);add(user_name_txt);add(user_name);add(submit_button);add(user_ques_txt);add(user_ques);add(user_ans_txt);add(user_ans);add(user_pwd_txt);add(user_pwd);add(forget_button_S);//位置、页面大小设置setSize(270, 430);setLocation(550, 300);setLayout(null); //手工布局 与其他页面不同 ImageIcon logo = new ImageIcon("D:/image/register_image.jpg"); //左上方小图标setIconImage(logo.getImage());setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);setResizable(false);setVisible(true);     }public void init() {//上方图片部分构造 上 即为 北ImageIcon upper_image = new ImageIcon("D:/image/forget_background_image.png");upper_image.setImage(upper_image.getImage().getScaledInstance(270, 170,Image.SCALE_DEFAULT));upper_N = new JLabel(upper_image);upper_N.setLocation(0,0); //确定位置upper_N.setSize(270, 170); //设置大小//中间部分内容 绝对位置user_name_txt = new JLabel("用户账号", JLabel.CENTER);user_name_txt.setSize(60, 20);user_name_txt.setLocation(10, 185);submit_button = new JButton();submit_button.setText("查询");submit_button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));submit_button.setSize(60, 20);submit_button.setLocation(190, 185);submit_button.addActionListener(this); //产生事件响应用户行为user_ques_txt = new JLabel("提示问题", JLabel.CENTER);user_ques_txt.setSize(60, 20);user_ques_txt.setLocation(10, 220);user_ans_txt = new JLabel("问题答案", JLabel.CENTER);user_ans_txt.setSize(60, 20);user_ans_txt.setLocation(10, 255);user_pwd_txt = new JLabel("重置密码", JLabel.CENTER);user_pwd_txt.setSize(60, 20);user_pwd_txt.setLocation(10, 290);user_name = new JTextField();user_name.setSize(100, 30);user_name.setLocation(80, 185);user_ques = new JLabel("点击查询后显示", JLabel.CENTER);user_ques.setSize(100, 30);user_ques.setLocation(80, 220);user_ans = new JTextField();user_ans.setSize(100, 30);user_ans.setLocation(80, 255);user_pwd = new JTextField();user_pwd.setSize(100, 30);user_pwd.setLocation(80, 290);user_name.addFocusListener(this);user_pwd.addFocusListener(this);user_ans.addFocusListener(this);//下方注册图片构造 下 即为 南forget_button_S = new JButton();ImageIcon conform_register_image = new ImageIcon("D:/image/conform_forget_image.png");conform_register_image.setImage(conform_register_image.getImage().getScaledInstance(220, 32, Image.SCALE_DEFAULT));forget_button_S.setIcon(conform_register_image);forget_button_S.setBorderPainted(false);forget_button_S.setBorder(null);forget_button_S.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));forget_button_S.setSize(220, 32);forget_button_S.setLocation(15, 330);forget_button_S.addActionListener(this); //产生事件响应用户行为}public void actionPerformed(ActionEvent e) {if(e.getSource() == submit_button) {String username = user_name.getText().trim();if("".equals(username) || username == null) {JOptionPane.showMessageDialog(null, "请输入帐号!!");return;} else {}}if (e.getSource() == forget_button_S) {if(user_name == null ) {JOptionPane.showMessageDialog(null, "请输入正确账号并点击查询"); return;} String newpwd = user_pwd.getText();if(newpwd == null || "".equals(newpwd)) {JOptionPane.showMessageDialog(null, "请输入新密码"); return;}String userans = user_ans.getText();if(userans == null || "".equals(userans)) {JOptionPane.showMessageDialog(null, "请输入答案");return;}}}//鼠标的点击或移动之类的用focuslistener 这里不知道为啥没变色 (哭@Overridepublic void focusGained(FocusEvent e) {//处理账号输入框if(e.getSource() == user_name){user_name.setForeground(Color.BLACK);}//处理密码输入框if(e.getSource() == user_pwd){user_pwd.setForeground(Color.BLACK);}//处理问题输入框if(e.getSource() == user_ques){//user_ques.setForeground(Color.BLACK);}//处理答案输入框if(e.getSource() == user_ans){user_ans.setForeground(Color.BLACK);}}@Overridepublic void focusLost(FocusEvent e) {//处理账号输入框if(e.getSource() == user_name){user_name.setForeground(Color.gray);}//处理密码输入框if(e.getSource() == user_pwd){user_pwd.setForeground(Color.gray);}//处理问题输入框if(e.getSource() == user_ques){//user_ques.setForeground(Color.gray);}//处理答案输入框if(e.getSource() == user_ans){user_ans.setForeground(Color.gray);}}}

JDBC模块

以上仿QQ实现了QQ的登录功能,但是对于登录只做了简单的是否为空的校验,并没有使用数据库进行查询,可以通过以下方式创建并使用数据库进行增删查改:

创建数据库,并创建User表

create database MyQQ;use MyQQ;create table user(id int primary key auto_increment,username varchar(20),password varchar(20),question varchar(100),answer varchar(100)
);INSERT INTO `USER` VALUES(null,'10001','123456','csdnJava哪家强','每天都要努力的小颓废');

将驱动jar包导入项目(jar包地址在软件地址 的mysql目录):



JDBC操作代码如下:

import com.mysql.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class Test {public static void main(String[] args) throws Exception{//     需求:查询所有的用户, 输出到控制台// 分析:// 1.创建项目,拷贝驱动jar包到模块下,并添加到classpath路径中// 2.注册驱动DriverManager.registerDriver(new Driver());// 3.获得连接String url = "jdbc:mysql://localhost:3306/db_mybatis";String username = "root";String password = "root";Connection connection = DriverManager.getConnection(url,username,password);// 4.创建执行sql的对象Statement statement = connection.createStatement();// 5.执行sql语句,处理结果String sql = "select * from user";ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()) {// 取出来//System.out.print(resultSet.getObject("id")+" ");//System.out.print(resultSet.getObject("username")+" ");//System.out.print(resultSet.getObject("password")+" ");//System.out.println(resultSet.getObject("question")+" ");//System.out.println(resultSet.getObject("answer"));System.out.print(resultSet.getObject(1)+"  ");System.out.print(resultSet.getObject(2)+"  ");System.out.print(resultSet.getObject(3)+"  ");System.out.println(resultSet.getObject(4)+"  ");System.out.println(resultSet.getObject(5));System.out.println("------------------------------------------------");}username = "10001";password = "1234567";// 5.2 判断用户名密码是否正确sql = "select * from user where username = " + username + " and password =" + password;resultSet = statement.executeQuery(sql);//查询到了说明不为空,此时登录成功if(resultSet.next()){System.out.println("登录成功");}else{System.out.println("登录失败");}// 6.释放资源if (resultSet != null){resultSet.close();}if (statement != null){statement.close();}if (connection != null){connection.close();}}
}

以上仅演示了简单的JDBC操作,由于篇幅有限,这里暂不介绍如何防登录注入、JDBC工具类的提取以及数据库连接池,后续再进行介绍。

需要注意以上代码中的图片路径使用的是绝对路径,大家可以根据自己需要进行替换,代码已上传至Gitee,如果文章知识点有错误的地方,请指正!大家一起学习,一起进步,谢谢!

JAVA实现QQ登录、注册、修改密码等功能(美化版)相关推荐

  1. IDEA版最新SMM整合,根据手机号实现登录/注册/修改密码

    IDEA版最新SMM整合,根据手机号实现登录/注册/修改密码 最近一直在进行springboot的项目,前一阵子项目组接手了一个SSM项目,需要实现手机短信验证的相关功能.于是自己进行了重操,整合了网 ...

  2. java对mysql的简单操作的综合运用——登录+注册+修改密码

    本篇博客是java对mysql的简单操作的综合运用--登录系统.java对mysql的简单操作的综合运用--注册系统.java对mysql的简单操作的综合运用--修改密码系统的整合. 因为使用的是数据 ...

  3. AndroidStudio实现简易android登录注册修改密码页面。

    利用sqlite实现简易登录注册以及修改密码功能. 页面设计 登录页面activity_login.xml <?xml version="1.0" encoding=&quo ...

  4. Email接收验证码,以实现登录/注册/修改密码

    要求 1)实现Email形式的注册功能和相应的登录功能: 2)实现忘记密码时的密码找回功能: 3)存在数据库中的密码不能以明文形式存放,即建议在浏览器端发送请求前,调用js代码对用户的密码做md5加密 ...

  5. 仿QQ登录、记住密码等功能实现

    功能:实现账登录.检查账号密码.记住密码.清除记录功能. 设备:电脑一台.Android Studio软件一个. 技术:xml布局.SharedPreferences的使用. 开始: 1.看效果: 2 ...

  6. 【php】基于php+mysql 简单的登录注册修改密码系统

    对于php和mysql的连接在许多blog上都有说明,为了将mysql中的查询,修改,插入等操作掌握,本文介绍了一下如何采用mysql做一个登录注册修改密码的网页. 其中, 1.登录-即为对数据库中的 ...

  7. 简单注册、登录、修改密码、忘记密码程序

    简单注册.登录.修改密码.忘记密码程序 来自一枚大二通信工程渣渣写的代码 #include<stdio.h> #include<stdlib.h> #include<st ...

  8. 基于Java实现QQ登录和微博登录

    1 基于Java实现QQ登录和微博登录 1. 前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了 QQ 和微博这 2 大常用软件的一键登录,总的来说其实都挺简单的,可能会有一点小 ...

  9. 【Openfire】网页版的用户注册、登录、修改密码

    Openfire客户端的开发是借助Smack提供的方法.Smack可以从官网下载.如果是Openfire3.7.1的版本,建议使用Smack3.2.2与其匹配.官网地址:http://www.igni ...

  10. c#web窗体登录界面登录注册以及密码找回发送邮箱功能

    c#web窗体登录界面登录注册以及密码找回发送邮箱功能 效果图如下: 1.登录界面aspx代码 <%@ Page Language="C#" AutoEventWireup= ...

最新文章

  1. 安全套接层Secure Sockets Layer,SSL
  2. 用Python+Django在Eclipse环境下开发web网站【转】
  3. 30屏幕参数_顶级屏幕加持,一加8系列核心配置、屏幕参数官方公布
  4. 测试机器大小端的方法
  5. OpenCV--模板匹配与滑动窗口(单匹配或多匹配)
  6. pymavlink 源码剖析(二)之生成代码
  7. 哪些数据类型能使用切片操作python_Python学习之路「16」非数字数据类型-切片-slice...
  8. CSS动画效果构成分析
  9. win11的drivers文件可以删除吗 windows11drivers文件是否可以删除的详细介绍
  10. 强化学习_Deep Q Learning(DQN)_代码解析
  11. paip.操作DATATABLE增加列及内容
  12. php代码审计实战(一)
  13. 《码出高效-JAVA开发手册》
  14. 2015 年度新增开源软件排名 TOP100
  15. python全局变量
  16. 从零开始搭建Elasticsearch集群遇到的问题
  17. 微信应用(小程序)开发最全整理
  18. linux shell获取当前脚本所在目录
  19. 科林明伦杯”哈尔滨理工大学第十届程序设计竞赛B(减成1)
  20. 百度浏览器的隐私安全问题分析

热门文章

  1. 微信计步器怎么不计步_微信运动不计步,如何解决
  2. 常用的Java微服务开源框架有哪些呢
  3. mysql同步 触发器_MySQL触发器运用于迁移和同步数据的实例教程
  4. TCP/UDP测试工具大全
  5. 推荐几款国产快速启动工具软件 总有一款适合你的
  6. java ioutils 写入文件_IOUtils和FileUtils的学习笔记
  7. 教你成为质量管理高手GJB
  8. [kuangbin带你飞] 专题一 简单搜索 题解(超详细注释,史上最强题解)
  9. iOS手势UIGestureRecognizer的使用及手势冲突的解决办法【转】
  10. 程矢Axure夜话:Axure手机原型视频教程之图形解锁