JDCB学习笔记 -- day05 实现一个用户的登录功能及解决SQL注入问题
2016-10-18 13:16
1171 查看
一、用JDBC实现简单的登录功能
1.创建java项目,导入jar包,创建jdbc.properties配置文件
2.编写DBUtil工具类
package com.jdcb.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ResourceBundle; public class DBUtil { /** * 定义参数变量 */ public static String driverClass; public static String url; public static String user; public static String password; /** * 使用静态代码块加载properties文件获取信息并注册驱动 */ static { try { ResourceBundle bundle = ResourceBundle.getBundle("jdbc");// 获取根目录下的jdbc.properties文件流 driverClass = bundle.getString("driverClass"); url = bundle.getString("url"); user = bundle.getString("user"); password = bundle.getString("password"); } catch (Exception e) { e.printStackTrace(); } } /** * 获取Connection连接 * * @return * @throws Exception */ public static Connection getConnection() throws Exception { // 注册驱动 Class.forName(driverClass); return DriverManager.getConnection(url, user, password); } /** * 释放资源 * * @param conn * 连接 * @param stat * 执行sql的对象 * @param rest * 结果集 */ public static void closeRes(Connection conn, Statement stat, ResultSet rest) { if (rest != null) { try { rest.close(); } catch (SQLException e) { e.printStackTrace(); } rest = null; } if (stat != null) { try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } stat = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } }
3.编写User实体类
package com.jdcb.entity; import java.util.Date; public class User { private int id; private String name; private String password; private String email; private Date birthday; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } 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; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + ", email=" + email + ", birthday=" + birthday + "]"; } }
4.编写数据访问层
package com.jdcb.dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import com.jdcb.entity.User; import com.jdcb.utils.DBUtil; public class DoLogin { public static User loign(String username, String password) { // 注册驱动,获取连接 Connection connection = null; // 获取操作sql的Statement对象 Statement statement = null; ResultSet resultSet = null; try { connection = DBUtil.getConnection(); statement = connection.createStatement(); // 操作sql语句,并获取结果集 String sql = "SELECT * FROM users WHERE name='" + username + "' AND password='" + password + "'"; resultSet = statement.executeQuery(sql); // 处理结果集 User user = new User(); if (resultSet.next()) { user = new User(); user.setId(resultSet.getInt("id")); user.setName(resultSet.getString("name")); user.setPassword(resultSet.getString("password")); user.setEmail(resultSet.getString("email")); user.setBirthday(resultSet.getDate("birthday")); } return user; } catch (Exception e) { e.printStackTrace(); return null; } finally { // 释放资源 DBUtil.closeRes(connection, statement, resultSet); } } }
5.编写登录的方法,进行测试
package com.jdcb.login; import java.util.Scanner; import com.jdcb.dao.DoLogin; import com.jdcb.entity.User; /** * 登录的方法 * @author Administrator * */ public class LoginMethod { public static void main(String[] args) { Scanner input = new Scanner(System.in);//使用控制台键盘输入法测试登录 System.out.println("请输入用户名"); String username = input.nextLine(); System.out.println("请输入密码"); String password = input.nextLine(); User user = DoLogin.loign(username, password); if(user != null){ System.out.println("登录成功"); } } }
二、SQL注入问题:使用preparedStatement解决
1. preparedStatement :预编译对象,是Statement 的子类
☞ 特点:a、执行效率要比Statement要高。
b、设置语句中的参数要方便。
c、设置参数后已经发生了变化,已经不是原来的字符串语句。可以防止SQL注入。
2.具体编码
package com.jdcb.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.jdcb.entity.User; import com.jdcb.utils.DBUtil; public class DoLogin { public static User loign(String username, String password) { // 注册驱动,获取连接 Connection connection = null; // 获取操作sql的Statement对象 PreparedStatement ps = null; ResultSet resultSet = null; try { connection = DBUtil.getConnection(); // 操作sql语句,并获取结果集 String sql = "SELECT * FROM users WHERE name=? AND password=?"; ps = connection.prepareStatement(sql); //给关键字赋值 ps.setString(1, username);//参数1标识第一个问号,参数2标识给第一个?号赋值 ps.setString(2, password); resultSet = ps.executeQuery(); // 处理结果集 User user = new User(); if (resultSet.next()) { user = new User(); user.setId(resultSet.getInt("id")); user.setName(resultSet.getString("name")); user.setPassword(resultSet.getString("password")); user.setEmail(resultSet.getString("email")); user.setBirthday(resultSet.getDate("birthday")); } return user; } catch (Exception e) { e.printStackTrace(); return null; } finally { // 释放资源 DBUtil.closeRes(connection, ps, resultSet); } } }
相关文章推荐
- Java学习笔记--解决一个类实现多个接口的问题
- 【JAVAWEB学习笔记】24_filter实现自动登录和解决全局的编码问题
- Silverlight学习笔记一(理解一下机制,使用一下布局,实现一个简单的用户登录)
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- Java 学习笔记--解决一个类实现多个接口的问题
- JFinal学习笔记(二) 实现简单的用户登录
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题
- SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(2)--示例篇:创建一个登录控件(原创)(转载本文请注明出处)
- node.js学习笔记(3)-node.js结合mysql数据库实现的web项目中常见功能--登录验证、session传值、拦截器、ajax传值等
- Spring学习之SpringMVC框架快速搭建实现用户登录功能
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
- 用servlet实现登录注册功能时遇到的问题和解决方法
- 在用户注册时提示密码过短的功能的实现(alpha版时未解决的问题)
- JavaWeb学习记录(六)——用户登录功能之Session与验证码验证功能的实现
- Spring MVC 学习笔记8 —— 实现简单的用户管理(4)用户登录
- 基本上,把switch,用设计模式代替,肯定是bug和过度设计。想想,本来修改一个文件几行代码可以解决的问题,变成修改3-6个类才能实现一样的功能。不是傻是什么?
- 创建并部署一个Servlet,要求在实现用户登录功能,当用户名和密码正确时跳转到欢迎页面,否则提示出错信息
- 算法导论学习笔记(1)——快排中hoarePartition的实现(问题已解决)
- [Silverlight学习笔记]关于用户注册之后不能直接登录的问题
- java学习笔记---第一个applet程序以及一个小问题的解决