SpringBoot拦截器配置及的用法

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";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值