利用拦截器实现注解
上一篇 自定义注解实战(一) 中说到使用aop最大的好处是不侵入业务代码,但是有些业务需要拦截请求,比如参数校验,为空的话直接返回isNull的错误信息,这时候用AOP来做这件事就显得不太优雅了,所以我想到了用拦截器来实现,定义注解的方式还是一样,这里就不多加赘述了。
声明拦截器
声明拦截器我们利用SpringMVC进行配置,而在mvc:interceptors
标签下声明interceptor主要有两种方式:
- 直接定义一个Interceptor实现类的bean对象。使用这种方式声明的Interceptor拦截器将会对所有的请求进行拦截。
- 使用mvc:interceptor标签进行声明。使用这种方式进行声明的Interceptor可以通过mvc:mapping子标签来定义需要进行拦截的请求路径。
因为利用拦截器去实现注解的话,要拦截所有请求,所以这里我们直接使用第一种方法,直接定义一个Interceptor实现类的bean对象:
1 2 3
| <mvc:interceptors> <bean class="com.bfh.interceptor.MyAnnoInterceptor"/> </mvc:interceptors>
|
实现注解
然后就是实现MyAnnoInterceptor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| public class MyAnnoInterceptor implements HandlerInterceptor {
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.setHeader("Content-type", "application/json;charset=utf-8"); try { if (handler instanceof HandlerMethod) { HandlerMethod method = (HandlerMethod) handler; MyAnno annotationParams = method.getMethodAnnotation(MyAnno.class);
}
PrintWriter out = null; try { out = response.getWriter(); out.print("你想输出的错误信息..."); out.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { out.close(); } } return false;
} catch (Exception e) { e.printStackTrace(); }
return true; }
@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, org.springframework.web.servlet.ModelAndView arg3) throws Exception { }
@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object arg2, Exception arg3) throws Exception {
} }
|
这样我们自定义的注解就可以使用了,至于return true
还是return false
,这个就看你的实际业务需求了。