grails 攔截器

2024-04-16 grails java grails

  1. Interceptor 介面: org.hibernate.Interceptor 介面允許您在 Hibernate 事件的各個階段介入,並提供了一些方法來實現您自己的邏輯。EmptyInterceptor 是 Interceptor 介面的一個簡單實現,它包含了所有方法的空實現。
  2. SessionFactoryObserver 介面: org.hibernate.SessionFactoryObserver 介面允許您觀察 SessionFactory 的生命週期事件,在 SessionFactory 創建、關閉等事件發生時執行自定義邏輯。
  3. EventListeners 介面: org.hibernate.event.service.spi.EventListenerRegistry 介面允許您註冊和管理 Hibernate 事件監聽器。您可以註冊自定義的事件監聽器來處理 Hibernate 事件,例如實體生命週期事件、持久化操作事件等。
  4. EventType 和 EventListener 介面: org.hibernate.event.spi.EventType 定義了 Hibernate 中的各種事件類型,org.hibernate.event.spi.PostInsertEventListener、org.hibernate.event.spi.PreUpdateEventListener 等介面定義了對應事件的監聽器介面。您可以實現這些介面來監聽特定的事件,在事件發生時執行自定義邏輯。
  5. Custom Type 和 User Type: org.hibernate.usertype.UserType 介面允許您定義自定義的數據類型,以便在實體類中使用。您可以實現這個介面來定義自己的數據類型,例如枚舉類型、自定義對象類型等。
  6. Custom Dialect: org.hibernate.dialect.Dialect 類允許您實現自定義的數據庫方言,以適配不同的數據庫。您可以擴展這個類,並實現數據庫相關的行為,例如數據類型映射、SQL 方言等。
  7. EntityInterceptor 介面: org.hibernate.Interceptor 介面的子介面,用於在實體加載、保存、更新等操作時執行自定義邏輯。
  8. AuditInterceptor 介面: 用於實現審計功能,記錄實體的創建、修改、刪除等操作。

範例程式

EntityIntercepto

package work.pollochang.pollo.grails.db.aop;

import org.grails.web.util.WebUtils;
import org.hibernate.EmptyInterceptor;
import org.hibernate.internal.EntityManagerMessageLogger;
import org.hibernate.internal.HEMLogging;
import org.hibernate.type.Type;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.http.HttpServletRequest;
import javax.sql.DataSource;

import java.io.Serializable;

/**
 * 自訂攔截器
 */
public class CustomInterceptor extends EmptyInterceptor {

    private static final EntityManagerMessageLogger log = HEMLogging.messageLogger( CustomInterceptor.class );

    private DataSource dataSource;

    public CustomInterceptor(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {

//        String sessionId = org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes().getSessionId();
//        System.out.println("sessionId = "+sessionId);

        HttpServletRequest request = WebUtils.retrieveGrailsWebRequest().getRequest();
        if (request != null) {
            // 在这里访问 HTTP 请求对象,例如获取请求参数等
            String parameterValue = request.getParameter("parameterName");
            System.out.println("Parameter value from request: " + parameterValue);

            String realIp = request.getRemoteAddr();
            System.out.println("user IP = "+realIp);
        }

        // 获取数据库连接
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
            // 执行Dummy SQL语句
            executeDummySQL(connection);
        } catch (SQLException e) {
            log.error(e.getMessage());
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    log.error(e.getMessage());
                }
            }
        }
        return super.onSave(entity, id, state, propertyNames, types);
    }

    /**
     * 查詢虛擬表
     * @param connection
     * @throws SQLException
     */
    private void executeDummySQL(Connection connection) throws SQLException {
        log.trace("executeDummySQL");
        // 在这里执行Dummy SQL语句
        Statement statement = connection.createStatement();
        statement.execute("insert into test2(col1) values(0)");
        statement.close();
    }
}