There is the part of the UI Controller
@Controller
public class UiController {
...
@RequestMapping("/")
public String summary(HttpServletRequest request, HttpServletResponse response) {
return "index";
}
@RequestMapping("/contacts")
public String contacts(HttpServletRequest request, HttpServletResponse response) {
return "contacts";
}
@RequestMapping("/about")
public String about(HttpServletRequest request, HttpServletResp
return "about";
}
...
}
We need to check for every endpoint (methods): if a request comes from the ip which is contained in “blacklist” then error403.html (or what ever you want) should be returned.
@Controller
public class UiController {
@Resource
BlackList blackList;
...
@RequestMapping("/")
public String summary(HttpServletRequest request, HttpServletResponse response) {
if (blackList.isIpInBlackList(request.getRemoteAddr()) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return "errors/error403";
}
return "index";
}
@RequestMapping("/contacts")
public String contacts(HttpServletRequest request, HttpServletResponse response) {
if (blackList.isIpInBlackList(request.getRemoteAddr()) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return "errors/error403";
}
return "contacts";
}
@RequestMapping("/about")
public String about(HttpServletRequest request, HttpServletResponse response) {
if (blackList.isIpInBlackList(request.getRemoteAddr()) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return "errors/error403";
}
return "about";
}
...
}
AspectJ lets us to remove repeated “non business code” and place it to the “aspect”.
@Aspect
@Component
public class BlackListAspect {
@Resource
BlackList blackList;
@Around("execution(* web.ui.UiController.*(..))")
public String blackListFiltering(ProceedingJoinPoint jp) throws Throwable {
Object[] args = jp.getArgs();
HttpServletRequest request = (HttpServletRequest) args[0];
HttpServletResponse response = (HttpServletResponse) args[1];
if (blackList.isIpInBlackList(request.getRemoteAddr())) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return "errors/error403";
}
Object result = jp.proceed(args);
return result.toString();
}
}
Aspect weaving
The last thing we need to setup is pom.xml
to properly weave our aspects.
There are some differences between Spring and non-Spring projects so carefully read this - Aspect weaving in Spring and non-Spring projects
You may also find these posts interesting: