Возврат пользовательского HttpServletResponse из аспекта Spring AOP не работает - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь реализовать простую аннотацию @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 { }

Вот Aspect

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 response, аннотация не работает, так как, хотя вызов метода перехватывается, перенаправление не принимаетместо.

Я пытаюсь понять, почему это происходит?Любые ведет?

...