一.實現注解式攔截器
1.首先實現自定義注解,該注解只能作用在方法
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAn {}
2.編寫自定義攔截器
參數說明 :
Object handler: 調用的目標方法。
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if(handler instanceof HandlerMethod){ HandlerMethod han = (HandlerMethod) handler; MyAn methodAnnotation = han.getMethodAnnotation(MyAn.class); Method method = han.getMethod(); if(methodAnnotation!=null){ System.out.println(method.getName()); return true; } } response.setContentType("text/html;charset=utf-8"); response.getWriter().write("沒有權限"); return false; } }
3.將該攔截器添加到攔截器配置中
@Configuration public class MyWebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); } }
二.實現注解將值注入到參數
1.自定義注解,作用於參數中
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface MyParam {}
2.編寫自定義參數解析器
@Component public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override //當掃描到注解為MyParam時執行 public boolean supportsParameter(MethodParameter methodParameter) { return methodParameter.hasParameterAnnotation(MyParam.class); } @Override //示例:將請求地址注入到該參數 public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { HttpServletRequest nativeRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class); String requestURI = nativeRequest.getRequestURI(); Class<?> parameterType = methodParameter.getParameterType(); if(parameterType.isAssignableFrom(String.class)){ return requestURI; } return null; } }
3.添加到參數解析器
@Configuration public class MyAddArgumentResolvers extends WebMvcConfigurationSupport { @Override protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(new MyHandlerMethodArgumentResolver()); } }