最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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?ArrayList實現(xiàn)班級信息管理系統(tǒng)

    Java?ArrayList實現(xiàn)班級信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java?ArrayList實現(xiàn)班級信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java基礎(chǔ)之ArrayList的擴(kuò)容機(jī)制

    Java基礎(chǔ)之ArrayList的擴(kuò)容機(jī)制

    這篇文章主要介紹了Java基礎(chǔ)之ArrayList的擴(kuò)容機(jī)制,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java 二維碼,QR碼,J4L-QRCode 的資料整理

    Java 二維碼,QR碼,J4L-QRCode 的資料整理

    本文主要介紹Java 中二維碼,QR碼,J4L-QRCode,這里整理了詳細(xì)的資料供大家學(xué)習(xí)參考關(guān)于二維碼的知識,有需要的小伙伴可以參考下
    2016-08-08
  • Mybatis中foreach標(biāo)簽帶來的空格\換行\(zhòng)回車問題及解決方案

    Mybatis中foreach標(biāo)簽帶來的空格\換行\(zhòng)回車問題及解決方案

    這篇文章主要介紹了解決Mybatis中foreach標(biāo)簽帶來的空格,換行,回車問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 繼承JpaRepository后,找不到findOne()方法的解決

    繼承JpaRepository后,找不到findOne()方法的解決

    這篇文章主要介紹了繼承JpaRepository后,找不到findOne()方法的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringCloud全局過慮器GlobalFilter的用法小結(jié)

    SpringCloud全局過慮器GlobalFilter的用法小結(jié)

    這篇文章主要介紹了SpringCloud全局過慮器GlobalFilter的使用,全局過慮器使用非常廣泛,比如驗證是否登錄,全局性的處理,黑名單或白名單的校驗等,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 深入淺出理解Java泛型的使用

    深入淺出理解Java泛型的使用

    這篇文章主要介紹了深入淺出理解Java泛型的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Java中Agent的使用詳解

    Java中Agent的使用詳解

    Java Agent是一種特殊類型的軟件組件,它允許在Java虛擬機(jī)(JVM)運(yùn)行時修改應(yīng)用程序的字節(jié)碼,下面我們就來一起深入了解一下Agent的具體使用吧
    2023-12-12
  • SpringCloud 如何提取公共配置

    SpringCloud 如何提取公共配置

    這篇文章主要介紹了SpringCloud 提取公共配置的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼

    IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼

    這篇文章主要介紹了IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼,本文通過代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08

最新評論

宿州市| 兴隆县| 育儿| 疏附县| 曲沃县| 大石桥市| 腾冲县| 漳浦县| 安新县| 汽车| 仪陇县| 长阳| 桃江县| 黄山市| 遵化市| 南安市| 南安市| 林周县| 西峡县| 潞西市| 宝丰县| 安康市| 奉化市| 安宁市| 汝州市| 宜昌市| 武胜县| 迁安市| 乌兰浩特市| 米易县| 临潭县| 龙南县| 日喀则市| 台山市| 乌兰县| 五常市| 吉安市| 沧源| 大荔县| 曲麻莱县| 北流市|