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程序设计有所帮助。

(0)

相关推荐

  • JDBC中resutset接口操作实例详解

    本文主要向大家展示JDBC接口中resutset接口的用法实例,下面我们看看具体内容. 1. ResultSet细节1 功能:封锁结果集数据 操作:如何获得(取出)结果 package com.sjx.a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test; //1. next方

  • JDBC常用接口总结

    本文主要向大家介绍JDBC常用的接口都有哪些,下面来看看具体内容. 1.Driver接口 对于每一个数据库驱动程序都必须实现Driver接口,在编写程序时,当需要连接数据库的时候就需要装载由数据库厂商提供的数据库驱动程序,装载的方式如下: Class.forname("jdbc.driver_class_name"); 同时要注意的就是在使用Class.forname时首先需要引入java.sql包.下面这段代码就是装载SQL Server数据库驱动程序的一段代码: import ja

  • spring对JDBC和orm的支持实例详解

    简介 Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术,如JDBC,Hibernate或者JDO等.它不仅可以让你方便地在这些持久化技术间切换, 而且让你在编码的时候不用考虑处理各种技术中特定的异常. 一致的异常层次 Spring提供了一种方便的方法,把特定于某种技术的异常,如SQLException, 转化为自己的异常,这种异常属于以 DataAccessException 为根的异常层次.这些异常封装了原始异常对象,这样就不会有丢失任何错误信息的

  • BaseJDBC和CRUDDAO的写法实例代码

    我们首先看下BASEJDBC的写法实例: package com.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mysql.jdbc.Driver; public class BaseJDBC { // 表示你要操作的是哪种类型

  • java使用JDBC动态创建数据表及SQL预处理的方法

    本文实例讲述了java使用JDBC动态创建数据表及SQL预处理的方法.分享给大家供大家参考,具体如下: 这两天由于公司的需求,客户需要自定义数据表的字段,导致每张表的字段都不是固定的而且很难有一个通用的模板去维护,所以就使用JDBC动态去创建数据表,然后通过表的字段动态添加数据,数据的来源主要是用户提供的Excel直接导入到数据库中. 如果考虑到字段的类型,可以通过反射的机制去获取,现在主要用户需求就是将数据导入到数据库提供查询功能,不能修改,所以就直接都使用String类型来处理数据更加便捷.

  • 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.DriverMan

  • Nginx用户认证配置方法详解(域名/目录)

    Nginx可以为某一个域名单独加用户认证,具体做法如下: 1. 生成用户认证的用户名和密码: 复制代码 代码如下: #wget -c soft.vpser.net/lnmp/ext/htpasswd.sh;bash htpasswd.sh 根据提示输入: 用户名:密码:文件名: 脚本会自动生成认证文件,auth.conf内容如下: 复制代码 代码如下: /usr/local/nginx/conf/auth.conf 2. 为Nginx添加auth认证配置 下面以某域名下面的auth目录为例,在域

  • java执行SQL语句实现查询的通用方法详解

    完成SQL查询 并将查询结果放入Vector容器,以便其他程序使用 /* * 执行sql查询语句 */ public static <T> Vector<T> executeQuery(Class<T> clazz, String sql, Object... args) { Connection conn = null; PreparedStatement preparedstatement = null; ResultSet rs = null; Vector<

  • Linux环境下Oracle安装参数设置方法详解

    前面讲了虚拟机的设置和OracleLinux的安装,接下来我们来说下Oracle安装前的准备工作. 1.系统信息查看 系统信息查看 首先服务器ip:192.168.8.120 服务器系统:Oracle Linux Server release 6.5 服务器主机名:oracle-learn 查看磁盘空间情况: [root@oracle-learn ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 32G 4.8G 26G

  • Java实现文件上传和下载的方法详解

    目录 1.文件上传 1.1 介绍 1.2 代码实现 2.下载 2.1 介绍 2.2 代码实现 1.文件上传 1.1 介绍 文件上传,也称为upload,是指将本地图片.视频.音频等文件上传到服务器上,可以供其他用户浏览或下载的过程.文件上传在项目中应用非常广泛,我们经常发微博.发微信朋友圈都用到了文件上传功能. 文件上传时,对页面的form表单有如下要求: 表单属性 取值 说明 method post 必须选择post方式提交 enctype multipart/form-data 采用mult

  • java 三种将list转换为map的方法详解

    java 三种将list转换为map的方法详解 在本文中,介绍三种将list转换为map的方法: 1) 传统方法 假设有某个类如下 class Movie { private Integer rank; private String description; public Movie(Integer rank, String description) { super(); this.rank = rank; this.description = description; } public Int

  • java并发编程_线程池的使用方法(详解)

    一.任务和执行策略之间的隐性耦合 Executor可以将任务的提交和任务的执行策略解耦 只有任务是同类型的且执行时间差别不大,才能发挥最大性能,否则,如将一些耗时长的任务和耗时短的任务放在一个线程池,除非线程池很大,否则会造成死锁等问题 1.线程饥饿死锁 类似于:将两个任务提交给一个单线程池,且两个任务之间相互依赖,一个任务等待另一个任务,则会发生死锁:表现为池不够 定义:某个任务必须等待池中其他任务的运行结果,有可能发生饥饿死锁 2.线程池大小 注意:线程池的大小还受其他的限制,如其他资源池:

  • Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写出,也可以使用flush方法将缓冲区中的数据强制写出或使用close()方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出.flash()和close()都使数据强制写出,所以两种结果是一样的,如果都不写的话,会发现不能成功写出 针对上述回答,给出了精准的回答 FileOutPutStream

  • oracle数据库的删除方法详解

    1.图形界面删除 练习之前记得创建快照 执行命令之前要保证数据库属于open状态 SQL> alter database open; [oracle@localhost ~]$ dbca 2.静默删除 使用DBCA进行删除的数据库必须处于OPEN状态,否则不能删除. SQL> alter database open; [oracle@localhost ~]$ dbca -silent -deleteDatabase -sourceDB OCPLHR1 3.SQL窗口 startup ##启动

  • Java实现Excel转PDF的两种方法详解

    目录 一.使用spire转化PDF 1.使用spire将整个Excel文件转为PDF 2.指定单个的sheet页转为PDF 二.使用jacob实现Excel转PDF(推荐使用) 1.环境准备 2.执行导出PDF 使用具将Excel转为PDF的方法有很多,在这里我给大家介绍两种常用的方法,分别应对两种不一样的使用场景,接下来我在springboot环境下给大家做一下演示! 一.使用spire转化PDF 首先介绍一种比较简单的方法,这种方法可以使用短短的几行代码就可以将我们的Excel文件中的某一个

随机推荐