Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация с помощью Spring AOP 
:(
    Опции темы
danik
Дата 13.9.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.2.2007

Репутация: нет
Всего: нет



Вообщем есть некое приложение на Struts. Необходимо выполнить авторизацию пользователя при помощи Spring AOP. При корректных входных данных пользователь видит некий список чего-то, иначе попадает на страницу логина вновь. 
Вот собсно и вопрос: каким образом это можно реализовать?
PM MAIL   Вверх
danik
Дата 13.9.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.2.2007

Репутация: нет
Всего: нет



Решение было найдено тут:
http://www.jroller.com/HagbardCeline/entry...r_using_spring1
PM MAIL   Вверх
danik
Дата 18.9.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.2.2007

Репутация: нет
Всего: нет



Вот, пожалуй, продолжу досаждать вам (: Надеюсь, мой монолог кто-нить да прервёт. 
Проблема, как я писал выше, была решена. Нет вопросов, если нам нужно нацепить 1 из 4 advice на стратсовский экшн. Но мне не удаётся повесить его на метод, вызываемый из экшена. Звучит как-то странно, но так оно и есть, убил уже пару часов.
Вот мой простенький тестовый (но нерабочий) пример:

есть 2 jsp: one.jsp, two.jsp. Есть экшн для перехода от первой ко второй. struts-config.xml:
Код

<struts-config>
    <action-mappings>
        <action input="/one.jsp" path="/one2two"
            type="action.One2twoAction" validate="false">
            <forward name="go" path="/two.jsp" />
            </action>
    </action-mappings>

    <message-resources parameter="ApplicationResources" />

    <plug-in
        className="org.springframework.web.struts.ContextLoaderPlugIn">
        <set-property property="contextConfigLocation"
            value="/WEB-INF/classes/applicationContext.xml" />
    </plug-in>
    
</struts-config>

Реализация экшена проста: вызываю метод say() класс logic.Logic (на этот метод я и пытаюсь повесить interceptor). Там просто создаю объект Logic и заодно создаю с помощью BeanFactory 
Код

package action;
import ...

public class One2twoAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        Logic logic1 = new Logic();
        BeanFactory    bf = new ClassPathXmlApplicationContext("applicationContext.xml");
        Logic logic2 = (Logic) bf.getBean("oldLogic");            
        logic1.say();
        logic2.say();
        return mapping.findForward("go");
    }
}

Ниже код класса Logic и его интерфейса ILogic:
Код

//interface
package logic;

public interface ILogic{
    public void say();
}

//class
package logic;

public class Logic implements ILogic{
    public void say(){
        System.out.println("Logic.say");
    }              
}

Ниже код applicationContext.xml, где конфигурируются advice'ы. Пытаюсь повесить before, after и arround advice как и использованием точек входа (pointcut), так и без них
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="oldLogic" class="logic.Logic" />
    <bean id="adviceAround" class="logic.Advice" />
    <bean id="adviceBefore" class="logic.AdviceBefore" />
    <bean id="adviceAfter" class="logic.AdviceAfter" />

    <bean id="adviceBeforePointcut"
        class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
        <property name="mappedName">
            <value>*</value>
        </property>
        <property name="advice">
            <ref bean="adviceBefore" />
        </property>
    </bean>

    <bean id="adviceAroundRegExp"
        class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="patterns">
            <list>
                                <!-- От отчаяния пытаюсь и так и эдак -->
                <value>.*say.*</value>
                <value>.*</value>
                <value>*</value>
                <value>say*</value>
            </list>
        </property>
        <property name="advice">
            <ref bean="adviceAround" />
        </property>
    </bean>

    <bean id="adviceProxy"
        class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces">
            <value>logic.ILogic</value>
        </property>
        <property name="interceptorNames">
            <list>
                <value>adviceAroundRegExp</value>
                <value>adviceBeforePointcut</value>
                <value>adviceAfter</value>
            </list>
        </property>
        <property name="target">
            <ref bean="oldLogic" />
        </property>
    </bean>
</beans>

Реализация advice'ов тоже незамысловата: они там чё-нить выводят на консоль. Для полноты картины вот их код:
Код

// class Advice
package logic;
import ...
public class Advice implements MethodInterceptor {

    public Object invoke(MethodInvocation arg0) throws Throwable {
        System.out.println("around");
        return arg0.proceed();
    }
}

// class AdviceAfter
package logic;
import ...
public class AdviceAfter implements AfterReturningAdvice{

    public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
        System.out.println("after");
    }
}

// class AdviceBefore
package logic;
import ...
public class AdviceBefore implements MethodBeforeAdvice {

    public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
        System.out.println("before");
    }
}

В результате при переходе с первой страницы на вторую в экшене должен вызываться не метод say(), а выполняться adive's. Но на практике  smile ... вывод на консоль:
Код

Logic.say
Logic.say

В чём моя ошибка, вроде делал всё по шпаргалке Spring in action. 
Для полноты картины в web.xml добавил:
Код

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/classes/applicationContext.xml
        </param-value>
    </context-param>

Вот такая вот телега-вопрос  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.