xml配置:

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

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

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

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

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

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

UserDetailsDao接口如下:

 package infosky.ckg.sso.dao;

 import infosky.ckg.sso.model.UserAttempts;

 public interface UserDetailsDao {

     void updateFailAttempts(String username);

     void resetFailAttempts(String username);

     UserAttempts getUserAttempts(String username);

 }

对应的实现类:

 package infosky.ckg.sso.dao.impl;

 import infosky.ckg.sso.dao.UserDetailsDao;
import infosky.ckg.sso.model.UserAttempts; import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date; import javax.annotation.PostConstruct;
import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;
import org.springframework.security.authentication.LockedException; @Repository
public class UserDetailsDaoImpl extends JdbcDaoSupport implements
UserDetailsDao { private static final String SQL_USERS_UPDATE_LOCKED = "UPDATE t_users SET d_accountnonlocked = ? WHERE d_username = ?";
private static final String SQL_USERS_COUNT = "SELECT COUNT(*) FROM t_users WHERE d_username = ?"; 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 = ?";
private static final String SQL_USER_ATTEMPTS_INSERT = "INSERT INTO t_user_attempts (d_username, d_attempts, d_lastmodified) VALUES(?,?,?)";
private static final String SQL_USER_ATTEMPTS_UPDATE_ATTEMPTS = "UPDATE t_user_attempts SET d_attempts = d_attempts + 1, d_lastmodified = ? WHERE d_username = ?";
private static final String SQL_USER_ATTEMPTS_RESET_ATTEMPTS = "UPDATE t_user_attempts SET d_attempts = 0, d_lastmodified = null WHERE d_username = ?"; private int maxAttempts = 3; @Autowired
private DataSource dataSource; @PostConstruct
private void initialize() {
setDataSource(dataSource);
} @Override
public void updateFailAttempts(String username) {
UserAttempts user = getUserAttempts(username);
if (user == null) {
if (isUserExists(username)) {
// if no record, insert a new
getJdbcTemplate().update(SQL_USER_ATTEMPTS_INSERT,
new Object[] { username, 1, new Date() });
}
} else { if (isUserExists(username)) {
// update attempts count, +1
getJdbcTemplate().update(SQL_USER_ATTEMPTS_UPDATE_ATTEMPTS,
new Object[] { new Date(), username });
} if (user.getAttempts() + 1 >= maxAttempts) {
// locked user
getJdbcTemplate().update(SQL_USERS_UPDATE_LOCKED,
new Object[] { false, username });
// throw exception
throw new LockedException("登录错误次数太多,该用户已被锁定!");
} }
} @Override
public void resetFailAttempts(String username) {
getJdbcTemplate().update(SQL_USER_ATTEMPTS_RESET_ATTEMPTS,
new Object[] { username }); } @Override
public UserAttempts getUserAttempts(String username) {
try { UserAttempts userAttempts = getJdbcTemplate().queryForObject(
SQL_USER_ATTEMPTS_GET, new Object[] { username },
new RowMapper<UserAttempts>() {
public UserAttempts mapRow(ResultSet rs, int rowNum)
throws SQLException { UserAttempts user = new UserAttempts();
user.setUsername(rs.getString("username"));
user.setAttempts(rs.getInt("attempts"));
user.setLastModified(rs.getDate("lastModified")); return user;
} });
return userAttempts; } catch (EmptyResultDataAccessException e) {
return null;
} } private boolean isUserExists(String username) { boolean result = false; int count = getJdbcTemplate().queryForObject(SQL_USERS_COUNT,
new Object[] { username }, Integer.class);
if (count > 0) {
result = true;
} return result;
} public int getMaxAttempts() {
return maxAttempts;
} public void setMaxAttempts(int maxAttempts) {
this.maxAttempts = maxAttempts;
} }

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

Spring JDBCTemplate使用JNDI数据源的更多相关文章

  1. Spring+Tomcat的JNDI数据源连接池简单配置

    使用Tomcat JNDI数据源与Spring一起使用步骤如下: 1.将数据库驱动复制到Tomcat的lib文件夹下面 2.配置Tomcat的server.xml配置文件,在GlobalNamingR ...

  2. spring中配置jndi数据源

    spring  AplicationContext.xml中的配置 <bean id="dataSource1" class="org.springframewor ...

  3. Spring jndi数据源配置方法

    xml配置: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverMana ...

  4. Spring 配置JNDI数据源

    1.Spring 提供的JNDI调用类. 2.使用weblogic进行部署项目,所以使用WebLogicNativeJdbcExtrator类进行配置. 3.配置完数据源后配置sessionFacto ...

  5. 使用 Spring JdbcTemplate 框架出现 oracle 数据源连接泄露问题的解决方法

    1 问题 应用运行一段时间之后,无法执行写入数据库操作.底层使用的是 druid 连接池. 2 原因 使用 Spring JdbcTemplate 框架执行 oracle sql 语句之后,发现逻辑连 ...

  6. applicationContext中普通数据源不用jndi数据源

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  7. tomcat jndi 数据源

    web.xml <!-- ================================================================================ --& ...

  8. Spring数据访问1 - 数据源配置及数据库连接池的概念

    无论你要选择哪种数据访问方式,首先你都需要配置好数据源引用. Spring中配置数据源的几种方式 通过在JDBC驱动程序定义的数据源: 通过JNDI查找的数据源: 连接池的数据源: 对于即将发布到生产 ...

  9. mysql连接超时与jndi数据源配置

    昨天有运营说添加活动不能用了,我就看了一下后台日志,发现访问数据库是报错: at java.lang.Thread.run(Thread.java:722) Caused by: com.mysql. ...

随机推荐

  1. Android系统性能调优工具介绍

    http://blog.csdn.net/innost/article/details/9008691 经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优 ...

  2. js 百度地图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. spring filter过滤器

    1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...

  4. JBOSS目录结构详细说明

    一.下载与安装. 如何下载以及安装配置,请参考:Windows下JBOSS安装配置图文教程 二.现在主要了解一下JBOSS目录结构. 1. 主目录: E:\jboos\jboss-6.1.0.Fina ...

  5. 使用DBI(perl)实现文本文件的导入导出mysql

    DBI 是perl脚本连接数据库的一个模块.perl脚本相对shell更灵活,功能更强大,跨平台能力强.相对可执行jar包要简单很多. ​1.下载安装包DBI-1.631.tar.gzperl脚本下载 ...

  6. Windows下常用软件工具的命令

    Linux上主要操作是命令,懂一点linux知识的都知道,其实windows下边很多工具也是可以用命令来操作打开的,这样会提高效率,节省很多的时间.下边就记录一下常用的命令. 一.常用命令 1.远程桌 ...

  7. Vim光标定位

    *定位到指定行n: 输入"nG". 或输入"ngg". 或输入":n" 这里,n就是指定的行的行号.注意,有时候G=gg. *跳到屏幕顶部: ...

  8. Linux 解压缩命令

    gzip 文件 压缩文件 gzip -d 文件 解压文件 zcat  查看以结尾为zip 文件 bzip2 压缩文件 bzip2 -d 文件 解压文件 bzcat 查看以结尾为zip2 文件 zip ...

  9. css实现一个写信的格式

    一.目标 目标实现如下效果: 二.完成 1.分析 这个效果看起来很简单,实际上可能并不那么容易实现. 首先是全部东西都居中显示,除了“亲爱的starof”这个称呼的地方.这也是难点,也是本文要重点说的 ...

  10. C#读写app.config中的数据

    C#读写app.config中的数据 读语句: String str = ConfigurationManager.AppSettings["DemoKey"]; 写语句: Con ...