通過註解方式實現攔截器功能interceptor,通過註解實現對引數的值注入
阿新 • • 發佈:2022-03-17
一.實現註解式攔截器
1.首先實現自定義註解,該註解只能作用在方法
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAn {}
2.編寫自定義攔截器
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException { 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()); } }