Я пытаюсь реализовать простую аннотацию @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
, аннотация не работает, так как, хотя вызов метода перехватывается, перенаправление не принимаетместо.
Я пытаюсь понять, почему это происходит?Любые ведет?