1.说明
当用户访问某个URL的时候,需要对这个URL进行拦截,并作相应的判断逻辑。这个示例是获取用户访问的方法的注解的值,并对值进行判断,满足条件则返回true,允许用户访问,否则为false,对请求进行拦截
2.作用在方法上的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD})
public @interface AccessLimit {
int maxAccess();
int second();
}
3.设置拦截器
实现HandlerInterceptor接口,重写preHandle方法。preHandle方法在用户访问URL之前对访问进行拦截。这里获取用户访问的方法,获取其注解设置的值,满足则返回true,允许访问,否则返回false禁止访问相应的Controller
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class AccessIntercepter implements HandlerInterceptor{
private static final Logger LOGGER = LoggerFactory.getLogger(AccessIntercepter.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
LOGGER.info(request.getServletPath()+" "+request.getServerName()+" "+request.getRequestURI());
LOGGER.info(request.getServerPort()+" "+request.getServletContext()+" "+request.getSession());
request.setAttribute("A", "kk");
Cookie cookie = new Cookie("cook", "cook1");
response.addCookie(cookie);
if(handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod)handler;
AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);
int second = accessLimit.second();
int maxAccess = accessLimit.maxAccess();
if(second>5 && maxAccess>10) {
LOGGER.info("失败");
return false;
}
}
LOGGER.info("成功");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
4.注册拦截器
配置好拦截器后,需要对拦截器进行注册,需要实现WebMvcConfigurer接口
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
//WebMvcConfigurer.super.addInterceptors(registry);
//对拦截器AccessIntercepter进行注册,并设置拦截路径/accessTest
registry.addInterceptor(new AccessIntercepter()).addPathPatterns("/accessTest");
}
}
5.测试Controller
当用户访问/accessTest路径的时候拦截器对请求进行拦截,获取注解@AccessLimit的值,是否允许访问
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class AccessTestController {
@RequestMapping("/accessTest")
@ResponseBody
@AccessLimit(maxAccess = 1,second = 1)
public String accessTest() {
return "hello";
}
}