Spring JDBCTemplate使用JNDI数据源
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对象
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。