Я кодирую веб-сайт, который будет почти полностью защищен логином (для этого я использую Spring Security). Существуют определенные страницы, которые не защищены, хотя (домашняя страница, страница входа, страница регистрации, страница забытых паролей и т. Д.), И я пытаюсь достичь:Аспект не выполнен весной
- Если пользователь не зарегистрирован в при доступе к этим небезопасные страницы, показать им, как правило,
- Если пользователь уже вошел в систему, перенаправление на главную страницу (или на странице, указанной в элементе
redirectTo
аннотаций)
конечно Я хочу, чтобы это не было сделано для каждого метода контроллера:
if(loggedIn())
{
// Redirect
}
else
{
// Return the view
}
И по этой причине я хотел бы использовать АОП.
Я создал аннотацию @NonSecured
, и я закодирован следующий аспект:
@Aspect
public class LoggedInRedirectAspect
{
@Autowired
private UserService userService;
@Around("execution(@my.package.annotation.NonSecured * *(..))")
public void redirect(ProceedingJoinPoint point) throws Throwable
{
System.out.println("Test");
point.proceed();
}
}
Пример аннотированного метод:
@Controller
@RequestMapping("/")
public class HomeController
{
@NonSecured(redirectTo = "my-profile")
@RequestMapping(method = RequestMethod.GET)
public String index(Model model,
HttpServletRequest request) throws Exception
{
// Show home page
}
}
applicationContext.xml важные биты:
<context:annotation-config />
<context:component-scan base-package="my.package" />
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<bean id="loggedInRedirectAspect" class="my.package.aspect.LoggedInRedirectAspect" />
<aop:aspectj-autoproxy proxy-target-class="true">
<aop:include name="loggedInRedirectAspect" />
</aop:aspectj-autoproxy>
Проблема заключается в том что метод redirect(...)
в аспекте никогда не получает calle д. Аспекты в целом работают нормально, на самом деле будет вызван следующий метод в аспекте: Следующий совет вызывается, но не вызывается для методов контроллера.
@Around("execution(* *(..))")
public void redirect(ProceedingJoinPoint point) throws Throwable
{
point.proceed();
}
Я делаю что-то не так в моем pointcut?
спасибо.
Обновление: Последний фрагмент в этом вопросе вызван, но по-прежнему не вызван для методов контроллера.
Спасибо @BijuKunjummen, но это не решило проблему – satoshi
Можете ли вы отладить с точкой останова в классе контроллера @satoshi - если прокси-сервер был успешно создан cglib, как в вашем случае, вы должны увидеть он отражается в типе вашего класса контроллера в переменных отладки (с затмением). Если тип не является прокси-сервером, то CGLIB не вступил в силу - я бы предложил использовать время компиляции - тогда у вас будет многословная опция ткача, чтобы посмотреть, какие классы действительно сотканы. –
Вы правы @BijuKunjummen, похоже, что прокси-сервер не создается для контроллера (тип - HomeController, и я не вижу никакого вызова какого-либо метода прокси/aop в трассировке стека). Итак, как вы говорите, CGLIB не вступил в силу. Извините, но я новичок в Spring, как мне может помочь компиляция времени? И как я могу его использовать?Спасибо – satoshi