欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用JDBC實現(xiàn)Oracle用戶認(rèn)證的方法詳解

 更新時間:2017年08月24日 12:15:50   作者:冷豪  
這篇文章主要介紹了Java使用JDBC實現(xiàn)Oracle用戶認(rèn)證的方法,結(jié)合實例形式分析了java使用jdbc實現(xiàn)數(shù)據(jù)庫連接、建表、添加用戶、用戶認(rèn)證等操作流程與相關(guā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è)計有所幫助。

相關(guān)文章

  • 淺析Java中關(guān)鍵詞volatile底層的實現(xiàn)原理

    淺析Java中關(guān)鍵詞volatile底層的實現(xiàn)原理

    在 Java 并發(fā)編程中,有 3 個最常用的關(guān)鍵字:synchronized、ReentrantLock 和 volatile,這篇文章主要來和大家聊聊volatile底層的實現(xiàn)原理,感興趣的可以了解下
    2024-02-02
  • springboot配置文件中敏感數(shù)據(jù)(賬號密碼)加密方式

    springboot配置文件中敏感數(shù)據(jù)(賬號密碼)加密方式

    這篇文章主要介紹了springboot配置文件中敏感數(shù)據(jù)(賬號密碼)加密方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 深入理解Mybatis一級緩存

    深入理解Mybatis一級緩存

    客戶端向數(shù)據(jù)庫服務(wù)器發(fā)送同樣的sql查詢語句,如果每次都去訪問數(shù)據(jù)庫,會導(dǎo)致性能的降低,那么怎么提高呢?下面小編給大家分享下mybatis為我們提供了一級緩存的策略
    2016-12-12
  • Java大文件上傳詳解及實例代碼

    Java大文件上傳詳解及實例代碼

    這篇文章主要介紹了Java大文件上傳詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 基于mybatis-plus QueryWrapper 排序的坑

    基于mybatis-plus QueryWrapper 排序的坑

    這篇文章主要介紹了mybatis-plus QueryWrapper 排序的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringSecurity頁面授權(quán)與登錄驗證實現(xiàn)(內(nèi)存取值與數(shù)據(jù)庫取值)

    SpringSecurity頁面授權(quán)與登錄驗證實現(xiàn)(內(nèi)存取值與數(shù)據(jù)庫取值)

    Spring Security是一個能夠為基于Spring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架,本文主要介紹了SpringSecurity頁面授權(quán)與登錄驗證實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java中Iterator(迭代器)的用法詳解

    Java中Iterator(迭代器)的用法詳解

    Java迭代器(Iterator)是?Java?集合框架中的一種機(jī)制,它提供了一種在不暴露集合內(nèi)部實現(xiàn)的情況下遍歷集合元素的方法。本文主要介紹了它的使用方法,希望對大家有所幫助
    2023-05-05
  • java開發(fā)中嵌套類的詳解及實例

    java開發(fā)中嵌套類的詳解及實例

    這篇文章主要介紹了 java開發(fā)中嵌套類的詳解及實例的相關(guān)資料,一般把定義內(nèi)部類的外圍類成為包裝類(enclosing class)或者外部類,需要的朋友可以參考下
    2017-07-07
  • Java常用類String的面試題匯總(java面試題)

    Java常用類String的面試題匯總(java面試題)

    這篇文章主要介紹了Java常用類String的面試題匯總,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • Springboot整合RabbitMQ實現(xiàn)發(fā)送驗證碼的示例代碼

    Springboot整合RabbitMQ實現(xiàn)發(fā)送驗證碼的示例代碼

    這篇文章主要介紹了Springboot整合RabbitMQ實現(xiàn)發(fā)送驗證碼的功能,基于AMQP協(xié)議實現(xiàn)的消息隊列,它是一種應(yīng)用程序之間的通信方法,消息隊列在分布式系統(tǒng)開 發(fā)中應(yīng)用非常廣泛,需要的朋友可以參考下
    2022-02-02

最新評論