java - Spring Security 过滤器阻止所有 Hibernate 查询

标签 java spring hibernate spring-security sessionfactory

我有一个 JSF、Spring、Hibernate 和 Spring Security 中的应用程序,Hibernate 层和数据库之间的交互进展顺利,一旦 Spring Security 层,查询就不会呈现任何内容。

有什么解决办法吗?

我正在从 hibernate 配置文件创建 SessionFactory

web.xml 中的过滤器: ......................

!-- Spring Security -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

........................

hibernate session 工厂创建类:

......................

package Util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;


public class HibernateUtil {

    private static SessionFactory sessionFactory;

    static {
        try {

            Configuration configuration = new  AnnotationConfiguration();;
            configuration.configure();
            ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(sr);
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}
<小时/>
@Transactional

public class stufImp implements stufDAO , Serializable {


          private SessionFactory sf = HibernateUtil.getSessionFactory();
          Session session ;

           public stufImp() {

    }


    @Override
    public List<Stuf> getAllstufs() {

                session=sf.getCurrentSession();
        session.beginTransaction();
        List<Stuf> stufs= session.createQuery("from Stuf").list();
        session.getTransaction().commit(); 
        System.out.println("getting All Stufs");

        return stufs;
    }

......................

最佳答案

对于初学者,首先删除用于配置 hibernate 的 HibernateUtil,然后修复您的 dao。您不应该永远Session存储在实例变量中,至少当您的dao是单例时不应该。 (想象一下如果有 2 个并发请求进来会发生什么, session 会发生什么!)。

要配置 hibernate SessionFactory,请使用 spring 中的 LocalSessionFactoryBean。 (更多信息请参见the reference guidejavadoc)。

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
</bean>

您还需要事务管理器并启用注释驱动的事务。

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven /> <!-- By default references 'transactionManager' -->

修改您的 dao(请参阅 reference guide )。

@Transactional
public class stufImp implements stufDAO , Serializable {

    @Autowired
    private SessionFactory sf;

    @Override
    public List<Stuf> getAllstufs() {
        return sf.getCurrentSession().createQuery("from Stuf").list();
    }
}

链接

  1. 在 Spring 设置 SessionFactory reference guide
  2. 实现 daos reference guide

关于java - Spring Security 过滤器阻止所有 Hibernate 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18834852/

相关文章:

hibernate - SpringBoot Hibernate 现有数据库表的实体映射

java - 在 Eclipse 中如何在你的 Android 项目中使用一个 Java 项目?

java - Hadoop项目启动时需要的JAR有哪些?

java - 如何在 Hadoop Mapreduce 中使用 MultithreadedMapper 类?

java - 处理来自 Spring 的 WebServiceTemplate.marshalSendAndReceive 的错误响应

java - Spring MVC + Before Advice 检查安全性

spring - 访问数据库时出现 java.sql.SQLException : No suitable driver,

java - MySql 并发查询速度慢

java - 在 MYSQL 数据库中存储 base64 字符串的最佳方法是什么?

c# - 如何处理长 AJAX 请求 - 发送响应但继续工作