Java 从SpringAOP方面返回自定义HttpServletResponse不起作用

Java 从SpringAOP方面返回自定义HttpServletResponse不起作用,java,spring-boot,spring-aop,spring-annotations,Java,Spring Boot,Spring Aop,Spring Annotations,我正在尝试实现一个简单的注释@RequiresLogin package com.nonce.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD)

我正在尝试实现一个简单的注释
@RequiresLogin

package com.nonce.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresLogin { }
以下是
方面

package com.nonce.aspect;

import com.nonce.annotation.RequiresLogin;
import com.nonce.security.SecurityUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
@Aspect
public class SecurityManager {

    @Around("@annotation(com.nonce.annotation.RequiresLogin) && args(request,..)")
    public Object authenticate(ProceedingJoinPoint proceedingJoinPoint, HttpServletRequest request) throws Throwable {
        System.out.println(request.getRequestURI());
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        if(!SecurityUtils.isLoggedIn(request)) {
            response.sendRedirect("/");
            return null;
        }
        else {
            return proceedingJoinPoint.proceed();
        }
    }
}
然后,我尝试在我的一个控制器中使用注释

package com.nonce.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.nonce.timeplex.annotation.RequiresLogin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.nonce.security.SecurityUtils;
import com.nonce.utils.Constants;
import com.nonce.utils.URLStore;

@Controller
@RequestMapping(URLStore.INDEX)
public class ProfileController {

    @Autowired
    HttpSession session;

    @RequiresLogin
    @RequestMapping(value = URLStore.PROFILE, method = RequestMethod.GET)
    public String showProfile(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) {
        SecurityUtils.injectCSRFToken(session);
        return Constants.PROFILE;
    }
}
在方法
showProfile()
中,当我删除参数
HttpServletResponse
时,注释不会像中那样工作,尽管方法调用被拦截,但不会发生重定向


我想知道为什么会这样?有线索吗?

我无法回答实际问题。我是AOP专家,不是Spring用户,您的问题与Spring AOP并没有真正的关系。但如果可以的话,我想建议更好的措辞。您写道:“尝试实现一个简单的注释”不,您正在尝试实现一个方面,如果它检测到某个注释,应该触发该方面。您还写道:“当我删除参数(…)时,注释不起作用”注释本身不起任何作用,它只是坐在那里。同样,方面应该在与您的连接点匹配时触发并执行相应的建议。Spring Security已经能够保护某些端点。也许你应该研究一下,而不是自己去实施。我无法回答实际问题。我是AOP专家,不是Spring用户,您的问题与Spring AOP并没有真正的关系。但如果可以的话,我想建议更好的措辞。您写道:“尝试实现一个简单的注释”不,您正在尝试实现一个方面,如果它检测到某个注释,应该触发该方面。您还写道:“当我删除参数(…)时,注释不起作用”注释本身不起任何作用,它只是坐在那里。同样,方面应该在与您的连接点匹配时触发并执行相应的建议。Spring Security已经能够保护某些端点。也许你应该研究一下,而不是自己去实现它。