gpt4 book ai didi

spring - 方面未在 Spring 中执行

转载 作者:行者123 更新时间:2023-12-03 04:53:10 25 4
gpt4 key购买 nike

我正在编写一个几乎完全受登录保护的网站(我正在使用 Spring Security)。不过,有些页面不 protected (主页、登录页面、注册页面、忘记密码页面……),我想要实现的是:

  • 如果用户在访问这些非安全页面时未登录,正常显示它们
  • 如果用户已经登录,则重定向到主页(或 redirectTo 注释元素中指定的页面)

当然,我想避免将其放入每个 Controller 方法中:

if(loggedIn())
{
// Redirect
}
else
{
// Return the view
}

因此我想使用 AOP。

我创建了注释@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(...)永远不会被调用。 方面总体上工作正常,实际上方面中的以下方法将被调用:以下建议被调用,但不会为 Controller 方法调用。

@Around("execution(* *(..))")
public void redirect(ProceedingJoinPoint point) throws Throwable
{
point.proceed();
}

我的切入点是否做错了什么?

谢谢。

更新:这个问题中的最后一个代码片段被调用,但仍然没有被 Controller 方法调用。

最佳答案

@satoshi,我认为您遇到的问题是因为您使用的是 Spring-AOP,它只能为具有接口(interface)的 bean 创建 AOP 代理 - 在您的情况下, Controller 没有接口(interface)。

修复方法可能是使用 AspectJ 进行编译时/加载时编织,而不使用 Spring AOP 或在类路径中包含 cglib jar 并强制创建基于 cglib 的代理:

<aop:aspectj-autoproxy proxy-target-class="true"/>

更新:编译时编织可以使用 maven 插件完成,showWeaveInfo 配置将准确显示哪些类已被编织:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.10</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.6.10</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>

关于spring - 方面未在 Spring 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9310927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com