저는 로그인으로 거의 완벽하게 보호 될 웹 사이트를 코딩하고 있습니다. (저는 Spring Security를 사용하고 있습니다). 비록 (홈 페이지, 로그인 페이지, 등록 페이지, 잊어 버린 암호 페이지 등) 어떤 보호를받지 못하는 페이지가 있습니다. 내가 이루고자하는 목표는 다음과 같습니다.Aspect가 Spring에서 실행되지 않았습니다.
- 사용자가 기록되지 않은 경우 이미 로그인 한 사용자의 홈 페이지로 리디렉션 경우이 보안되지 않은 페이지에 액세스 할 때에, 는 일반적으로
- 을 그들에게 보여 (또는
redirectTo
주석 요소에 지정된 페이지) 물론
나는 이것을 모든 단일 컨트롤러 방법에 넣는 것을 피하고 싶다 :
if(loggedIn())
{
// Redirect
}
else
{
// Return the view
}
그런 이유로 나는 AOP를 사용하고 싶습니다.
난 주석 @NonSecured
생성 및 I는 다음의 화면으로 구분 :
@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>
이 문제를 aspect 내의 메소드 redirect(...)
가 결코 calle을 얻지 못한다고 디. 일반적으로 aspect는 잘 동작하고 있습니다. 실제로 aspect의 다음 메소드가 호출됩니다 : 다음 advice가 호출되지만 컨트롤러 메소드는 호출되지 않습니다.
@Around("execution(* *(..))")
public void redirect(ProceedingJoinPoint point) throws Throwable
{
point.proceed();
}
내 포인트 컷에 문제가 있습니까?
감사합니다.
업데이트 :이 질문의 마지막 스 니펫이 호출되지만 컨트롤러 메서드는 여전히 호출되지 않습니다.
@BijuKunjummen 고마워요,하지만이 문제를 해결하지 못했습니다 – satoshi
컨트롤러 클래스에서 중단 점을 사용하여 디버깅 할 수 있습니까 @ satoshi - 당신의 경우처럼 cglib로 프록시가 성공적으로 생성 된 경우, 컨트롤러 클래스의 유형, 디버그 변수 (eclipse 포함)에 반영됩니다. 유형이 프록시 인 것처럼 보이지 않으면 CGLIB는 효과가 없습니다 - 컴파일 시간 짜기를 사용하는 것이 좋습니다 - 그러면 위버의 장황한 옵션을 켜서 실제로 어떤 클래스가 weaved되는지 알아 보겠습니다 –
당신 말이 맞습니다 @ BijuKunjummen, 컨트롤러 (예 : HomeController 및 스택 추적에서 모든 프록시/aop 메서드에 대한 호출을 볼 수 없습니다) 프록시 만들어지지 않는 것 같습니다. CGLIB는 효과가 없습니다. 미안하지만 봄이 처음인데 컴파일 시간에 어떻게 도움이 될까요? 어떻게 사용할 수 있습니까?감사합니다 – satoshi