私は、ログインによってほぼ完全に保護されるWebサイトを作成しています(Spring Securityを使用しています)。 (ホームページ、ログインページ、登録ページ、忘れたパスワードページなど)、私が達成しようとしているものは、保護されていない特定のページがあります:AspectがSpringで実行されていません
- ユーザーがログに記録されていない場合すでにログインしているユーザーは、 ホームページにリダイレクトする場合は、これらの非保護されたページにアクセスする際に、 は通常
- をそれらを表示(または
redirectTo
注釈要素で指定したページへ)もちろん
私はこれをすべての単一のコントローラメソッドに入れないようにしたい:
if(loggedIn())
{
// Redirect
}
else
{
// Return the view
}
このため、私はAOPを使用したいと思います。
I注釈@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を取得しないd。 一般的なアスペクトは正常に動作していますが、実際にはアスペクトの次のメソッドが呼び出されます:以下のアドバイスが呼び出されますが、コントローラメソッドが呼び出されることはありません。
@Around("execution(* *(..))")
public void redirect(ProceedingJoinPoint point) throws Throwable
{
point.proceed();
}
私のポイントカットに何か間違っていますか?
ありがとうございます。
更新:この質問の最後のスニペットが呼び出されますが、コントローラメソッドは呼び出されません。
@BijuKunjummenありがとう、これは問題を解決しませんでした – satoshi
コントローラクラス@satoshiでブレークポイントでデバッグすることができます - あなたのケースのように、cglibでプロキシが正常に作成されている場合は、コントローラクラスのタイプ、デバッグ変数(Eclipseの場合)に反映されます。タイプがプロキシではないと思われる場合、CGLIBは有効ではありません。コンパイル時の織り方を使用することをお勧めします。ウィーバーの冗長オプションをオンにして、実際に織り込まれているクラスを確認してください。 –
@BijuKunjummen、コントローラのためにプロキシが作成されないようです(タイプはHomeControllerなので、スタックトレースのプロキシ/ aopメソッドへの呼び出しを見ることはできません)。あなたが言うように、CGLIBは有効ではありません。私は申し訳ありませんが、私は春には新しく、コンパイル時にどのように役立ちますか?そして私はそれをどのように使うことができますか?ありがとうございました – satoshi