25 октября 2011 г.

Декларативные транзакции в Hibernate

Сущесвтует два способа управления траназкциями в enterprise-приложениях: контейнером и приложением. Первый вид предпологает автоматическое начало, сопровождение и завершение транзакции, обеспечиваемое контейнером. В этом случае процесс управления транзакциями осуществляется прозрачно через аннотации, т.е. мы заранее декларируем поведение системы, а контейнер обеспечивает это поведние нам. В противном случае, мы можем сами говорить приложению когда начинать и когда заканчивать транзакции. Это и называется управлением транзакциями на уровне приложения.

10 октября 2011 г.

Основы EJB: часть 1

Сервер приложений j2ee состоит из двух основных элементов: контейнер web-приложения (JSP, JSF и т.д.) и EJB-контейнер. Первый служит для создания пользовательского интерфейса и слабо подходит для описания бизнес-логики приложения. Для этого используется вторая часть J2EE - EJB.

Технологию EJB (Enterprise Java Beans) можно рассматривать с двух точек зрения: как фреймворк, и как компонент.
С точки зрения компонента EJB - это всего-лишь надстройка над POJO-классом, описываемая с помощью аннотации. Существует три типа компонентов EJB:
  1. session beans - используется для описания бизнесс-логики приложения
  2. message-driven beans - так же используется для бизнесс-логики
  3. entities - используется для хранения данных
С точки зрения фреймворка EJB - это технология, предоставляющая множество готовых решений (управление транзакциями, безопасность, хранение информации и т.п.) для вашего приложения.

Перед тем, как продолжить обзор основ EJB остановимся на основе любого приложения - архитектуре.

4 октября 2011 г.

Удаление всех таблиц из БД

Иногда возникает необходимость удалить все таблицы. Конечно, проще удалить пользователя базы и создать его заново. Это самый надёжный вариант, который точно удалит весь мусор, который может остаться в базе, однако не всегда на это есть пермиссии. Но можно воспользоваться этим скриптом:
BEGIN
  FOR i IN (SELECT table_name FROM user_tables)
    LOOP
      EXECUTE IMMEDIATE('DROP TABLE ' || user || '.' || i.table_name || ' CASCADE CONSTRAINTS');
    END LOOP;
END;
А тут еще 2 полезных скрипта:

3 октября 2011 г.

Фильтры в web-приложениях

С помощью фильтров обеспечивается дополнительная прослойка между сервлетом и клиентом. Фильтры могут использоваться как в сторону от клиента к сервлету (фильтры запроса), так и в обратную сторону (фильтры ответа).

Фильры запроса могут использоваться для: проведения дополнительных проверок безопасности, форматирования заголовка или тела запроса, ведения логов и т.д.
Фильтры ответа могут использоваться для: сжатия выходного потока, дополнять или подменять выходной поток и т.д.
И фильтр запроса, и фильтр ответа используют при реализации  один интерфейс – Filter.

Пример декларации фильтра в дескрипторе развертывания:

    MyAppRequest
    com.example.myapp.myappRequest
    
        LogFileName
        UserLog.txt
    


    MyAppRequest
    *.do

Вместо <url-pattern> можно было указать <servlet-name> и использовать фильтр к какому-то конкретному сервлету.

Реализация фильтра для данного примера может быть такой:
public class myappRequest implements Filter {
    private FilterConfig fc;
    private void init(FilterConfig config) throws ServletException {
        this.fc = config;
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest httpReq = (HttpServletRequest) req;
        String name= httpReq.getRemoteUser();
        if( name!= null )
            fc.getServletContext().log(“User: “ +name);
        chain.doFilter(req,resp);
    }
    public void destroy() {}
}

Безопасность web-приложения

Безопасность приложения обеспечивается: аутентификацией, авторизацией, конфеденциальностью и целостностью данных.
Не следует путать аутентификацию и авторизацию: на этапе аутентификации приложение запрашивает логин и пароль, в то время как на этапе авторизации приложение определяет имеет ли уже залогиненый пользователь доступ к информации.

Аутентификация
Настройка листа пользователей, имеющих доступ к работе с приложением, зависит от контейнера, который вы используете. К примеру, для Apache Tomcat нужно модифицировать файл tomcat-users.xml, который расположен по адресу $TOMCAT/conf. Например, он может выглядеть так:
<tomcat-users>
    <role rolename=”Admin”/>
    <role rolename=”User”/>
    <user username=”root” password=”toor” roles=”Admin, User” />
    <user username=”user” password=”resu” roles=”User” />
</tomcat-users>
Имена ролей чувствительны к регистру.
Для того чтобы аутентификация работала, нужно в дескрипторе развёртывания написать:
<login-config>
    <auth-method>BASIC</auth-method>
</login-config>
И указать какие роли мы хотим использовать в приложении:
<security-role><role-name>Admin</role-name></security-role>
<security-role><role-name>User</role-name></security-role>