0

我不确定atm的一个问题,我已经通过用户表休眠处理我的登录。如果在应用程序运行时操作此表,则登录端不会发生任何更改(但是它们在表上进行,我为此使用 ZK 并且可以正确查看更改)。因此,如果我使用以下方式登录:管理员密码

然后把密码改成newpassword

我必须清理并构建应用程序,然后在登录发生更改之前运行它。所以换句话说我认为它只检查用户表数据一次,把它保存在某个地方?

无论如何,我认为代码可能会有所帮助:

applicationContext-security.xml 的片段

<beans:bean id="sesFactory"
  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <beans:property name="configLocation">
        <beans:value>classpath:\hibernate.cfg.xml</beans:value>
    </beans:property>
</beans:bean>

<beans:bean id="userDAO" class="login.UserLoginDAOImpl">
            <beans:property name="sessionFactory" ref="sesFactory"></beans:property>
</beans:bean>

<beans:bean id="userService" class="login.UserLoginService">
    <beans:property name="userDAO" ref="userDAO"></beans:property>
</beans:bean> 

<authentication-manager>
     <authentication-provider user-service-ref="userService">
        <!--<password-encoder hash="sha" />-->
     </authentication-provider>      
</authentication-manager>

休眠.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">admin</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>


     <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>


    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>



    <mapping class="contacts.Contacts" />
    <mapping class="login.Users" />
</session-factory>
</hibernate-configuration>

UserLoginDaoImpl:

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
  package login;


import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;

/**
 * The Class UserLoginDAOImpl
 */
public class UserLoginDAOImpl implements UserLoginDAO {

/** The hibernate template. */
private HibernateTemplate hibernateTemplate;

/**
 * Sets the session factory.
 * 
 * @param sessionFactory
 *            the new session factory
 */
public void setSessionFactory(SessionFactory sessionFactory) {
    this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}

@Override
public Users loadUserByName(String name) {
    if (name != null && !name.equals("")) {

        List<Users> usr = hibernateTemplate
                .find("from Users where username ='" + name + "'");
                        System.out.println(usr.get(0));
        if (usr.size() == 1) {
            return usr.get(0);
        } else {
                        System.out.println("USER SIZE IS INCORRECT");
            return null;

        }
    } else {
        return null;
    }
}
}
4

1 回答 1

0

我绝不是 Hibernate 方面的专家,但我认为

<property name="current_session_context_class">thread</property>

行是不必要的,会影响事务管理器的行为:参见spring、hibernate 和声明性事务实现:没有活动事务

PS Spring 通过 AnnotationSessionFactoryBean 管理事务,并且可能在您的 UserLoginDAOImpl 和 UserLoginService 类中发生一些有趣的事情。

于 2012-08-12T20:05:50.107 回答