Spring JDBCTemplate使用JNDI数据源-阿里云开发者社区

开发者社区> 杨俊明> 正文

Spring JDBCTemplate使用JNDI数据源

简介: xml配置: 1 3 4 5 6 7 在weblogic/jboss中配置好JNDI数据源后,上述节点改为: 1 2 3 j...
+关注继续查看

xml配置:

1     <bean id="dataSource"
2         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
3         <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
4         <property name="url" value="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:orcl" />
5         <property name="username" value="cba" />
6         <property name="password" value="***" />
7     </bean>

在weblogic/jboss中配置好JNDI数据源后,上述节点改为:

1     <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
2         <property name="jndiName">
3             <value>java:/ssoDS</value>
4         </property>
5     </bean>

其中:第3行的java:/ssoDS即为web容器中配置好的jndi数据源名称

 

其它地方不用任何修改,使用示例如下:

1     <beans:bean id="userDetailsDao" class="infosky.ckg.sso.dao.impl.UserDetailsDaoImpl">
2         <beans:property name="dataSource" ref="dataSource" />
3         <!-- 登录错误尝试次数 -->
4         <beans:property name="maxAttempts" value="5" />
5     </beans:bean>

UserDetailsDao接口如下:

 1 package infosky.ckg.sso.dao;
 2 
 3 import infosky.ckg.sso.model.UserAttempts;
 4 
 5 public interface UserDetailsDao {
 6 
 7     void updateFailAttempts(String username);
 8 
 9     void resetFailAttempts(String username);
10 
11     UserAttempts getUserAttempts(String username);
12 
13 }

对应的实现类:

  1 package infosky.ckg.sso.dao.impl;
  2 
  3 import infosky.ckg.sso.dao.UserDetailsDao;
  4 import infosky.ckg.sso.model.UserAttempts;
  5 
  6 import java.sql.ResultSet;
  7 import java.sql.SQLException;
  8 import java.util.Date;
  9 
 10 import javax.annotation.PostConstruct;
 11 import javax.sql.DataSource;
 12 
 13 import org.springframework.beans.factory.annotation.Autowired;
 14 import org.springframework.dao.EmptyResultDataAccessException;
 15 import org.springframework.jdbc.core.RowMapper;
 16 import org.springframework.jdbc.core.support.JdbcDaoSupport;
 17 import org.springframework.stereotype.Repository;
 18 import org.springframework.security.authentication.LockedException;
 19 
 20 @Repository
 21 public class UserDetailsDaoImpl extends JdbcDaoSupport implements
 22         UserDetailsDao {
 23 
 24     private static final String SQL_USERS_UPDATE_LOCKED = "UPDATE t_users SET d_accountnonlocked = ? WHERE d_username = ?";
 25     private static final String SQL_USERS_COUNT = "SELECT COUNT(*) FROM t_users WHERE d_username = ?";
 26 
 27     private static final String SQL_USER_ATTEMPTS_GET = "SELECT d_username username,d_attempts attempts,d_lastmodified lastmodified FROM t_user_attempts WHERE d_username = ?";
 28     private static final String SQL_USER_ATTEMPTS_INSERT = "INSERT INTO t_user_attempts (d_username, d_attempts, d_lastmodified) VALUES(?,?,?)";
 29     private static final String SQL_USER_ATTEMPTS_UPDATE_ATTEMPTS = "UPDATE t_user_attempts SET d_attempts = d_attempts + 1, d_lastmodified = ? WHERE d_username = ?";
 30     private static final String SQL_USER_ATTEMPTS_RESET_ATTEMPTS = "UPDATE t_user_attempts SET d_attempts = 0, d_lastmodified = null WHERE d_username = ?";
 31 
 32     private int maxAttempts = 3;
 33 
 34     @Autowired
 35     private DataSource dataSource;
 36 
 37     @PostConstruct
 38     private void initialize() {
 39         setDataSource(dataSource);
 40     }
 41 
 42     @Override
 43     public void updateFailAttempts(String username) {
 44         UserAttempts user = getUserAttempts(username);
 45         if (user == null) {
 46             if (isUserExists(username)) {
 47                 // if no record, insert a new
 48                 getJdbcTemplate().update(SQL_USER_ATTEMPTS_INSERT,
 49                         new Object[] { username, 1, new Date() });
 50             }
 51         } else {
 52 
 53             if (isUserExists(username)) {
 54                 // update attempts count, +1
 55                 getJdbcTemplate().update(SQL_USER_ATTEMPTS_UPDATE_ATTEMPTS,
 56                         new Object[] { new Date(), username });
 57             }
 58 
 59             if (user.getAttempts() + 1 >= maxAttempts) {
 60                 // locked user
 61                 getJdbcTemplate().update(SQL_USERS_UPDATE_LOCKED,
 62                         new Object[] { false, username });
 63                 // throw exception
 64                 throw new LockedException("登录错误次数太多,该用户已被锁定!");
 65             }
 66 
 67         }
 68     }
 69 
 70     @Override
 71     public void resetFailAttempts(String username) {
 72         getJdbcTemplate().update(SQL_USER_ATTEMPTS_RESET_ATTEMPTS,
 73                 new Object[] { username });
 74 
 75     }
 76 
 77     @Override
 78     public UserAttempts getUserAttempts(String username) {
 79         try {
 80 
 81             UserAttempts userAttempts = getJdbcTemplate().queryForObject(
 82                     SQL_USER_ATTEMPTS_GET, new Object[] { username },
 83                     new RowMapper<UserAttempts>() {
 84                         public UserAttempts mapRow(ResultSet rs, int rowNum)
 85                                 throws SQLException {
 86 
 87                             UserAttempts user = new UserAttempts();
 88                             user.setUsername(rs.getString("username"));
 89                             user.setAttempts(rs.getInt("attempts"));
 90                             user.setLastModified(rs.getDate("lastModified"));
 91 
 92                             return user;
 93                         }
 94 
 95                     });
 96             return userAttempts;
 97 
 98         } catch (EmptyResultDataAccessException e) {
 99             return null;
100         }
101 
102     }
103 
104     private boolean isUserExists(String username) {
105 
106         boolean result = false;
107 
108         int count = getJdbcTemplate().queryForObject(SQL_USERS_COUNT,
109                 new Object[] { username }, Integer.class);
110         if (count > 0) {
111             result = true;
112         }
113 
114         return result;
115     }
116 
117     public int getMaxAttempts() {
118         return maxAttempts;
119     }
120 
121     public void setMaxAttempts(int maxAttempts) {
122         this.maxAttempts = maxAttempts;
123     }
124 
125 }

注意:34,35行在运行时,系统会自动注入dataSource对象

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
42 0
【Spring Boot】使用JDBC 获取相关的数据
【Spring Boot】使用JDBC 获取相关的数据 使用JDBC 获取相关的数据 什么是JDBC Java Database Connectivity 是一种用于执行SQL语句的Java API,与数据库建立连接、发送 操作数据库的语句并处理结果。
4752 0
spring 之jdbcTemplate使用
1 方法 queryForObject() 与queryForList() 方法queryForObject(),当在数据表查找的记录不存在时,将抛异常,使用时需要添加异常处理,根据异常类型确定返回结果,建议使用queryForList()替代. 2 方法 update(sql,new Object[]{} ) 与 jdbcTemplate.update(sql,
1138 0
Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库
Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库
13 0
AGS无服务化分析基因数据 - mutect2 肿瘤样本分析
通过调用AGS的远程任务,可以完成一序列的基因数据的二级分析,不需要申请和持有云计算资源,就可以完成对海量数据的批量处理,目前可以支持人类全基因组,外显子,基因比对,宏基因组比对,Somatic胚系变异发现等业务场景的加速和低成本处理。 通过AGS调用mutect2任务来检测体细胞短突变, 短突变包括单核苷酸(SNV)以及插入和缺失(Indel)的改变。本文介绍如何通过AGS分析肿瘤样本。
392 0
Function Compute构建高弹性大数据采集系统
解决问题: 1.利用服务器自建数据采集系统成本高,弹性不足。 2.利用服务器自建数据采集系统运维复杂,成本高。
95 0
SpringBoot实战(四)之使用JDBC和Spring访问数据库
这里演示的是h2databse示例,所以简单的介绍普及下h2database相关知识 H2数据库是一个开源的关系型数据库。 H2是一个嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容。
2223 0
call,apply,方法的使用
//apply和call的使用方法 /* * apply的使用语法 * 函数名字.apply(对象,[参数1,参数2,...]); * 方法名字.apply(对象,[参数1,参数2,.
749 0
+关注
杨俊明
菩提树下的杨过 http://yjmyzz.cnblogs.com/
1105
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载