SpringBoot实现请求拦截(@Aspect切面类和自定义拦截器)

第一种(@Aspect切面类)

package com.gx.interceptor;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
@AllArgsConstructor
@Slf4j
public class AuthorityHandlerAspect {

    @Pointcut("execution(* com.gx.controller.*.*(..))")
    public void executeService() {
    }

    @Around("executeService()")
    public Object authorityHandler(ProceedingJoinPoint pjp) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
        Method method = methodSignature.getMethod();
        
     /判断方法上是否有此注解
     if (method.isAnnotationPresent(WorkSheetAnnotation.class)) {}
     //判断类上是否有次注解
     if(pjp.getTarget().getClass().isAnnotationPresent(WorkSheetAnnotation.class)){}
     //获取方法上的注解值
       method.getAnnotation(NoAuth.class)
     log.info("method{}",method); System.out.println("!!!!!!!!!!!!!!!!!已被拦截"); 
  return pjp.proceed(); 
   } 
}
@Target({METHOD, FIELD})
@Retention(RUNTIME)
@Documented
public @interface NoAuth{

    String message() default "";

}
/**
 * @Description 工单类注解
 * @Author GX
 * @Date 2019/5/7 10:02
 * @Version V1.0
 **/
@Target(TYPE)
@Retention(RUNTIME)
@Documented
public @interface WorkSheetAnnotation {
}
//获取当前请求的URI
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String uri = request.getRequestURI()

第二种(自定义拦截器类)

第一步
package
com.chitic.bank.web.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpHeaders; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class CrossDomainInterceptor extends HandlerInterceptorAdapter{
  /**
  *
在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
  */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }

    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    }

  /**
  *
请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
  */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
    }

   /**
    *在请求处理之前进行调用(Controller方法调用之前)
   **/
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        
            if (request.getHeader(HttpHeaders.ORIGIN) != null) {
                
                response.setHeader("Access-Control-Allow-Origin", "*");
                response.setHeader("Access-Control-Allow-Methods", "POST, GET");
                response.setHeader("Access-Control-Allow-Headers", "token,Content-Type");
                response.setHeader("Access-Control-Expose-Headers", "token");
            }
           return true;
    }
        
}

第二步:注册自定义拦截器
package com.chitic.bank.web.config;

import com.chitic.bank.web.interceptor.CrossDomainInterceptor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class CustomWebConfig extends WebMvcConfigurerAdapter {

@Order(1) //作用,值越小,越优先执行
@Bean
@ConditionalOnMissingBean(CrossDomainInterceptor.class)
public CrossDomainInterceptor crossDomainInterceptor() {
return new CrossDomainInterceptor();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(crossDomainInterceptor());
}

}


原文地址:https://www.cnblogs.com/gaomanito/p/10683906.html