全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java使用JDBC实现Oracle用户认证的方法详解

本文实例讲述了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  # 用户认证  # Java开发Oracle数据库连接JDBC Thin Driver 的三种方法  # Java使用Jdbc连接Oracle执行简单查询操作示例  # Java使用JDBC或MyBatis框架向Oracle中插入XMLType数据  # Java使用JDBC连接Oracle_MSSQL实例代码  # Java与Oracle实现事务(JDBC事务)实例详解  # java使用jdbc链接Oracle示例类分享  # java基于JDBC连接Oracle 11g Release2实例分析  # Java如果通过jdbc操作连接oracle数据库  # JAVA使用JDBC连接oracle数据库的详细过程  # 存储过程  # 程序设计  # 操作技巧  # 相关内容  # 并在  # 要在  # 感兴趣  # 两天  # 数据结构  # 给大家  # 更多关于  # 还需  # 数据库中  # 所述  # 用户注册  # 三张  # 类中  # 应用层  # 连接数据库  # 讲述了 


相关文章: 制作电商网页,电商供应链怎么做?  如何快速生成凡客建站的专业级图册?  如何高效利用亚马逊云主机搭建企业网站?  建站主机选哪家性价比最高?  如何高效配置香港服务器实现快速建站?  建站ABC备案流程中有哪些关键注意事项?  如何制作算命网站,怎么注册算命网站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  广平建站公司哪家专业可靠?如何选择?  电商网站制作公司有哪些,1688网是什么意思?  Swift中swift中的switch 语句  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  北京网站制作公司哪家好一点,北京租房网站有哪些?  详解jQuery中基本的动画方法  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  C#怎么使用委托和事件 C# delegate与event编程方法  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  黑客如何通过漏洞一步步攻陷网站服务器?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  如何在Windows服务器上快速搭建网站?  如何在景安服务器上快速搭建个人网站?  如何用西部建站助手快速创建专业网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  存储型VPS适合搭建中小型网站吗?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  常州企业建站如何选择最佳模板?  广德云建站网站建设方案与建站流程优化指南  建站之星展会模版如何一键下载生成?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何彻底删除建站之星生成的Banner?  如何用搬瓦工VPS快速搭建个人网站?  如何通过VPS建站实现广告与增值服务盈利?  Python lxml的etree和ElementTree有什么区别  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  北京网站制作网页,网站升级改版需要多久?  如何在香港服务器上快速搭建免备案网站?  太原网站制作公司有哪些,网约车营运证查询官网?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何在橙子建站上传落地页?操作指南详解  网站制作大概多少钱一个,做一个平台网站大概多少钱?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  公司网站设计制作厂家,怎么创建自己的一个网站?  如何通过多用户协作模板快速搭建高效企业网站?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  三星网站视频制作教程下载,三星w23网页如何全屏?  建站之星2.7模板快速切换与批量管理功能操作指南  c++ stringstream用法详解_c++字符串与数字转换利器  建站为何优先选择香港服务器?  如何通过IIS搭建网站并配置访问权限? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。