Posts Tagged ‘java’

Spring custom web argument resolver

Posted on: September 7th, 2012 by Spade No Comments »

Одна из любимых всеми и крайне удобных возможностей Spring MVC – это механизм data binding. Мы можем выполнить привязку наших объектов к параметрам запроса, хэдерам, кукам и т.д. Иногда, однако, может возникнуть потребность создать собственную привязку, которой по умолчанию в спринге нет. Мы можем с легкостью расширить функциональность data binding своей собственной логикой. (more…)

Spring MVC interceptors

Posted on: August 3rd, 2012 by Spade No Comments »

Иногда нужно добавить некоторую общую логику для всех обработчиков запросов. Например, проверка авторизован ли пользователь, какой он имеет набор прав, есть ли у него доступ к этой странице. Можно так же пускать пользователей на определенные ресурсы только в определенные часы. Для подобного рода задач spring framework предоставляет возможность написания своих «плагинов» – interceptor-ов. Каждый раз, когда начинается процесс разбора УРЛ, выбора обработчика (класса контроллера), вызова его функций и т.д. фреймворк смотрит не определен ли пользователем дополнительный обработчик для текущей стадии, если да – он будет вызван.

(more…)

Spring security 3 custom password encoder

Posted on: July 19th, 2012 by Spade No Comments »

Популярный фреймворк Spring security 3 всем хорош, и прежде всего с двух сторон: там есть почти все что нужно, причем по умолчанию. А если нет – можно очень легко добавить или расширить.

Для случая аутентификации, например есть много вариантов работы с паролями. Это реализуется с помощью тэга password-encoder:

    <authentication-manager>
        <authentication-provider user-service-ref="userDetailsServiceImpl">
            <password-encoder hash="md5"/>
        </authentication-provider>
    </authentication-manager>

Там можно указать тип хэша, который хранится в базе. На выбор есть md5, sha, plaintext и др. (если вы храните пароли в базе в плейн тексте, просим вас оставаться на месте – служба зачистки уже выехала за вами). В последнее время участились случаи «увода» базы хэшей и их расшифровки (даже среди крупных игроков ИТ-рынка), и потому заказчики стали обращать больше внимания на то, как хранятся данные пользователей, и насколько легко получить вход в аккаунт, если хэш пароля стал известен. Алгоритмы предлагаемые Spring security 3 по умолчанию нельзя назвать особо защищенными, но сам фреймворк нам как-бы говорит – «Не нравится? Пиши своё». Воспользуемся его предложением.
(more…)

Custom Ant Task

Posted on: February 29th, 2012 by Spade No Comments »

А что если при сборке приложения вам нужно дождаться выполнения определенного условия – например некоторого флага из базы данных или ответа REST-сервиса? Для этих случаев сборщик Apache Ant предлагает специальный тэг waitfor – он дает возможность приостановить выполнения скрипта до момента наличия некоторого условия. Есть возможность установить сколько ждать, и как часть проверять это условие. Внутри него можно поместить дочерний тэг, который возвращает булево значение. Класс такого тэга должен реализовывать интерфейс org.apache.tools.ant.taskdefs.condition.Condition, главная функция которого – public boolean eval().
(more…)

ASM in Java

Posted on: February 20th, 2012 by Spade No Comments »

Довольно часто бывает, что нам нужно изменить/расширить существующую функциональность, но прибегнуть к традиционным подходам (наследование, перегрузка) мы не можем – то ли классы объявлены финальными, то ли из соображений чистоты архитектуры приложения. В таких случаях мы можем прибегнуть к AOP, который справляется с этой проблемой посредством прокси-объектов. Они «заворачивают» в себя оригинальные объекты, и перехватывая вызовы методов меняют функционал в требуемую сторону. Изменять поведение программы таки способом можно на трех этапах:

  1. Compile-time – с помощью специальной настройки IDE (плагин и т.п.) или использования DSL (domain specific language) разработанного специально для этого мы можем на этапе сборки кода внедрять туда нужные нам инструкции – конечно в случае, когда у нас есть доступ к исходникам.
  2. Class load time – можно написать свой класс лоадер, который будет загружать измененные классы вместо запрашиваемых.
  3. Runtime  – во время создания объекта класса, вместо него создается прокси, которые меняет функционал – с этим подходом работают большинство AOP-framework-ов.

(more…)