Java使用JDBC實現(xiàn)Oracle用戶認(rèn)證的方法詳解
本文實例講述了Java使用JDBC實現(xiàn)Oracle用戶認(rèn)證的方法。分享給大家供大家參考,具體如下:
兩天時間寫的小品,以前的J2EE環(huán)境基本使用框架?,F(xiàn)在使用JDBC配合Oracle存儲過程模擬了一下用戶注冊和用戶認(rèn)證。
一、添加必須的jar包
需要JDBC連接Oracle的包和shiro-core依賴,添加shiro-core主要為了方便使用SHA-256散列算法。
二、編寫JDBC連接
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Oracle { private static final Logger logger = LoggerFactory.getLogger(Oracle.class); public static Connection getConnection() { Connection conn = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); logger.debug("嘗試連接數(shù)據(jù)庫"); String url = "jdbc:oracle:thin:@192.168.0.20:1541:test"; String username = "apps"; String password = "apps"; conn = DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException cnfe) { logger.error(cnfe.getMessage()); } catch (SQLException sqle) { logger.error(sqle.getMessage()); } return conn; } public static void closeConnection(Connection conn) { try { if (conn != null) { conn.close(); conn = null; } } catch (SQLException sqle) { logger.error(sqle.getMessage()); } } }
三、建表
-- Create table create table LH_USER_T ( id INTEGER not null, username VARCHAR2(255), -- 用戶名 password VARCHAR2(255), -- 密碼 roleid INTEGER -- 外鍵鏈接 )
完整的用戶添加和認(rèn)證授權(quán)應(yīng)該至少包含三張表:user_table、role_table和permission_table,本文不展開討論。
四、添加用戶
UserDao類負(fù)責(zé)數(shù)據(jù)庫通信,密碼散列由UserService類實現(xiàn)。
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Types; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class UserDao { private static final Logger logger = LoggerFactory.getLogger(UserDao.class); // 添加用戶 public void saveUser(int userid, String username, String password, int roleid) { String sql = "insert into lh_user_t values (?,?,?,?)"; Connection conn = Oracle.getConnection(); PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); ps.setInt(1, userid); ps.setString(2, username); ps.setString(3, password); ps.setInt(4, roleid); ps.executeUpdate(); } catch (SQLException sqle) { logger.error(sqle.getMessage()); } finally { Oracle.closeConnection(conn); if (ps != null) { try { ps.close(); } catch (SQLException e) { logger.error(e.getMessage()); } ps = null; } } } // 驗證用戶(后面添加) }
UserService類
import org.apache.shiro.crypto.hash.Sha256Hash; public class UserService { private UserDao userDao; private static int userid = 1; public UserService() { userDao = new UserDao(); } public void saveUser(String username, String password, int roleid) { String nPassword = new Sha256Hash(password).toHex(); userDao.saveUser(UserService.userid, username, nPassword, roleid); } //... }
五、用戶驗證(Oracle存儲過程)
create or replace procedure validate_user(in_username in varchar2, in_password in varchar2, out_result out varchar2) as tmp_uid lh_user_t.id%type; begin select count(*) into tmp_uid from lh_user_t t where t.username = in_username and t.password = in_password; out_result := 'S'; exception when NO_DATA_FOUND then out_result := 'E'; end;
六、用戶驗證(JDBC調(diào)用存儲過程)
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Types; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class UserDao { private static final Logger logger = LoggerFactory.getLogger(UserDao.class); // 添加用戶 // {...} // 驗證用戶 public String validateUser(String username, String password) { String sql = "call validate_user(?,?,?)"; String result = null; Connection conn = Oracle.getConnection(); CallableStatement cs = null; try { cs = conn.prepareCall(sql); cs.setString(1, username); cs.setString(2, password); cs.registerOutParameter(3, Types.VARCHAR); cs.execute(); result = cs.getString(3); } catch (SQLException sqle) { logger.error(sqle.getMessage()); } finally { Oracle.closeConnection(conn); if (cs != null) { try { cs.close(); } catch (SQLException e) { logger.error(e.getMessage()); } cs = null; } } return result; } }
下面還需要在UserService類中添加散列算法
public class UserService { private UserDao userDao; private static int userid = 1; public UserService() { userDao = new UserDao(); } // {...} public String validateUser(String username, String password) { String nPassword = new Sha256Hash(password).toHex(); return userDao.validateUser(username, nPassword); } }
七、總結(jié)
應(yīng)用層根據(jù)service類返回的字符串判斷用戶是否認(rèn)證成功,'E' 代表失敗,'S' 代表成功。使用任何驗證框架都需要從數(shù)據(jù)庫中讀取用戶密碼并在Java的框架中完成對比,個人更喜歡把這些工作交給數(shù)據(jù)庫去完成,可以節(jié)省資源。
更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java+MySQL數(shù)據(jù)庫程序設(shè)計總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java文件與目錄操作技巧匯總》、《Java操作DOM節(jié)點技巧總結(jié)》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
- Java開發(fā)Oracle數(shù)據(jù)庫連接JDBC Thin Driver 的三種方法
- Java使用Jdbc連接Oracle執(zhí)行簡單查詢操作示例
- Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)
- Java使用JDBC連接Oracle_MSSQL實例代碼
- Java與Oracle實現(xiàn)事務(wù)(JDBC事務(wù))實例詳解
- java使用jdbc鏈接Oracle示例類分享
- java基于JDBC連接Oracle 11g Release2實例分析
- Java如果通過jdbc操作連接oracle數(shù)據(jù)庫
- JAVA使用JDBC連接oracle數(shù)據(jù)庫的詳細(xì)過程
相關(guān)文章
淺析Java中關(guān)鍵詞volatile底層的實現(xiàn)原理
在 Java 并發(fā)編程中,有 3 個最常用的關(guān)鍵字:synchronized、ReentrantLock 和 volatile,這篇文章主要來和大家聊聊volatile底層的實現(xiàn)原理,感興趣的可以了解下2024-02-02springboot配置文件中敏感數(shù)據(jù)(賬號密碼)加密方式
這篇文章主要介紹了springboot配置文件中敏感數(shù)據(jù)(賬號密碼)加密方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04基于mybatis-plus QueryWrapper 排序的坑
這篇文章主要介紹了mybatis-plus QueryWrapper 排序的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01SpringSecurity頁面授權(quán)與登錄驗證實現(xiàn)(內(nèi)存取值與數(shù)據(jù)庫取值)
Spring Security是一個能夠為基于Spring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架,本文主要介紹了SpringSecurity頁面授權(quán)與登錄驗證實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06Springboot整合RabbitMQ實現(xiàn)發(fā)送驗證碼的示例代碼
這篇文章主要介紹了Springboot整合RabbitMQ實現(xiàn)發(fā)送驗證碼的功能,基于AMQP協(xié)議實現(xiàn)的消息隊列,它是一種應(yīng)用程序之間的通信方法,消息隊列在分布式系統(tǒng)開 發(fā)中應(yīng)用非常廣泛,需要的朋友可以參考下2022-02-02