概述
使用切面|注解 在controller和filter 上面加权限注解,用来限制controller/filter转发的访问权限控制。
切面
@Aspect
@Component
public class LogAspect {
@Around("execution(public * com..*Filter.*(..))")
public Object doFilterAuthorization(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
MyTest annotation = signature.getMethod().getAnnotation(MyTest.class);
String value = annotation.value();
System.out.println(value);
return joinPoint.proceed(joinPoint.getArgs());
}
@Around("execution(public * com..*Controller.*(..))")
public Object doControllerAuthorization(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
MyTest annotation = signature.getMethod().getAnnotation(MyTest.class);
String value = annotation.value();
System.out.println(value);
return joinPoint.proceed(joinPoint.getArgs());
}
主类
@SpringBootApplication
@ServletComponentScan
public class Demo7Application {
public static void main(String[] args) {
SpringApplication.run(Demo7Application.class, args);
}
}
注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MyTest {
String value();
}
一定要注意,如果注解灭有有上面哪些注解会在切面中获取不到对应注解对象。
Controller类
@RequestMapping("/test")
@RestController
public class TTController {
@RequestMapping("/sad")
@MyTest(value = "sad")
public String getT() {
return "sss";
}
}
Filter
@WebFilter(urlPatterns = "/*")
public class CCFilter implements Filter {
@Override
@MyTest("sss")
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("sad");
filterChain.doFilter(servletRequest, servletResponse);
}
}
以上代码整体来说是没有问题的,但是为了项目好管理我们一般吧filter注入容器的方式改成@Bean的注入方式,以方便传参等等。
@Configuration
public class CasFilterBeanConfig {
@Bean
public FilterRegistrationBean<CCFilter> validateServiceTickteFilter() {
FilterRegistrationBean<CCFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new CCFilter());
registration.addUrlPatterns("/*");
return registration;
}
}
然后引入了问题就是,切面已经切不到filter的doFilter方法了。。