Перехватить удаленный гессенский вызов, чтобы добавить информацию

Я полагаю, что это может быть невозможно, но на всякий случай...

У нас есть внешнее Java-приложение, которое взаимодействует с (и нашим) внутренним приложением через Hessian. Для целей ведения журнала и аудита нам нужно передать user_id пользователя, который вошел в систему (во внешнем интерфейсе), в бэкэнд. Очевидным решением, конечно, было бы добавить параметр String ко всем вызовам методов, но это большая работа и не очень чистая.

Будет ли способ перехватить вызов, украсить его user_id (извлечь из сеанса) и на серверной стороне, чтобы получить этот user_id (а затем установить его на ThreadLocal или тому подобное)?

1 ответ

Решение

Это было возможно:

public class CustomHessionProxyFactoryBean extends HessianProxyFactoryBean {

public CustomHessionProxyFactoryBean() {
    setProxyFactory(new CustomHessianProxyFactory());
}

private static class CustomHessianProxyFactory extends HessianProxyFactory {

    @Override
    public Object create(Class<?> api, URL url, ClassLoader loader) {
        return Proxy.newProxyInstance(loader, new Class[] { api, HessianRemoteObject.class }, new CustomHessianProxy(url, this, api));
    }

    private static class CustomHessianProxy extends HessianProxy {

        protected CustomHessianProxy(URL url, HessianProxyFactory factory) {
            super(url, factory);
        }

        public CustomHessianProxy(URL url, HessianProxyFactory factory, Class<?> type) {
            super(url, factory, type);
        }

        @Override
        protected void addRequestHeaders(HessianConnection conn) {
            super.addRequestHeaders(conn);

            if(StringUtils.isNotBlank(SsoIdUtil.getThreadSsoId())){
                conn.addHeader("some_key", "some_value_from_threadlocal");
            }
        }
    }
}

}

Другие вопросы по тегам