Java使用JDBC实现Oracle用户认证的方法详解
程序员文章站
2024-02-22 12:11:59
本文实例讲述了java使用jdbc实现oracle用户认证的方法。分享给大家供大家参考,具体如下:
两天时间写的小品,以前的j2ee环境基本使用框架。现在使用jdbc配合...
本文实例讲述了java使用jdbc实现oracle用户认证的方法。分享给大家供大家参考,具体如下:
两天时间写的小品,以前的j2ee环境基本使用框架。现在使用jdbc配合oracle存储过程模拟了一下用户注册和用户认证。
一、添加必须的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("尝试连接数据库"); 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 -- 外键链接 )
完整的用户添加和认证授权应该至少包含三张表:user_table、role_table和permission_table,本文不展开讨论。
四、添加用户
userdao类负责数据库通信,密码散列由userservice类实现。
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调用存储过程)
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); } }
七、总结
应用层根据service类返回的字符串判断用户是否认证成功,'e' 代表失败,'s' 代表成功。使用任何验证框架都需要从数据库中读取用户密码并在java的框架中完成对比,个人更喜欢把这些工作交给数据库去完成,可以节省资源。
更多关于java相关内容感兴趣的读者可查看本站专题:《java+mysql数据库程序设计总结》、《java数据结构与算法教程》、《java文件与目录操作技巧汇总》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
推荐阅读
-
Java使用JDBC实现Oracle用户认证的方法详解
-
基于ubuntu中使用mysql实现opensips用户认证的解决方法
-
基于ubuntu中使用mysql实现opensips用户认证的解决方法
-
详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)
-
详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)
-
Java实现私有构造器的使用方法详解
-
Java实现私有构造器的使用方法详解
-
详解Java中使用泛型实现快速排序算法的方法
-
基于ubuntu中使用mysql实现opensips用户认证的解决方法_MySQL
-
详解Java中使用泛型实现快速排序算法的方法