Я кодирую сайт, который будет почти полностью защищен логином (я использую 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(...)
в аспекте никогда не вызывается. Аспекты в целом работают нормально, фактически будет вызван следующий метод в аспекте: Вызывается следующий совет, но не вызывается для методов контроллера.
@Around("execution(* *(..))")
public void redirect(ProceedingJoinPoint point) throws Throwable
{
point.proceed();
}
Что-то не так в моем pointcut?
Спасибо.
Обновление: последний фрагмент этого вопроса вызывается, но все еще не вызывается для методов контроллера.