自定义注解实战(二)

利用拦截器实现注解

上一篇 自定义注解实战(一) 中说到使用aop最大的好处是不侵入业务代码,但是有些业务需要拦截请求,比如参数校验,为空的话直接返回isNull的错误信息,这时候用AOP来做这件事就显得不太优雅了,所以我想到了用拦截器来实现,定义注解的方式还是一样,这里就不多加赘述了。

声明拦截器

声明拦截器我们利用SpringMVC进行配置,而在mvc:interceptors标签下声明interceptor主要有两种方式:

  1. 直接定义一个Interceptor实现类的bean对象。使用这种方式声明的Interceptor拦截器将会对所有的请求进行拦截。
  2. 使用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);

/**
* 你定义的校验规则,如果通过校验,直接return true;
*/
}

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,这个就看你的实际业务需求了。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×