拦截器

easyopen在1.3.1版本开始支持拦截器。

easyopen拦截器实现原理跟springmvc拦截器类似,拦截器作用在api方法上,即有@Api注解的方法。

拦截器定义如下:

  1. /**
  2. * 拦截器,原理同springmvc拦截器
  3. * @author tanghc
  4. *
  5. */
  6. public interface ApiInterceptor {
  7. /**
  8. * 预处理回调方法,在方法调用前执行
  9. * @param request
  10. * @param response
  11. * @param serviceObj service类
  12. * @param argu 方法参数
  13. * @return
  14. * @throws Exception
  15. */
  16. boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu)
  17. throws Exception;
  18. /**
  19. * 接口方法执行完后调用此方法。
  20. * @param request
  21. * @param response
  22. * @param serviceObj service类
  23. * @param argu 参数
  24. * @param result 方法返回结果
  25. * @throws Exception
  26. */
  27. void postHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu,
  28. Object result) throws Exception;
  29. /**
  30. * 结果包装完成后执行
  31. * @param request
  32. * @param response
  33. * @param serviceObj service类
  34. * @param argu 参数
  35. * @param result 最终结果,被包装过
  36. * @param e
  37. * @throws Exception
  38. */
  39. void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu,
  40. Object result, Exception e) throws Exception;
  41. /**
  42. * 匹配拦截器
  43. * @param apiMeta 接口信息
  44. * @return
  45. */
  46. boolean match(ApiMeta apiMeta);
  47. }

同样也提供一个适配器ApiInterceptorAdapter

  • 拦截器执行流程:
    跟springmvc拦截器执行流程一样

  • preHandle 如果返回false,则不调用api方法,接着逆序调用afterCompletion,需要通过response自定义返回

  • 如果preHandle 返回true,继续进行下一个preHandle
  • preHandle执行完毕后,逆序执行postHandle
  • 最后逆序调用afterCompletion
  • 正常流程:
    1. ApiInterceptor1.preHandle
    2. ApiInterceptor2.preHandle
    3. apiMethod.invoke() // api方法调用
    4. ApiInterceptor2.postHandle
    5. ApiInterceptor1.postHandle
    6. ApiInterceptor2.afterCompletion
    7. ApiInterceptor1.afterCompletion

配置拦截器

新建一个日志处理拦截器,继承ApiInterceptorAdapter,重写父类中的方法

  1. public class LogInterceptor extends ApiInterceptorAdapter {
  2. @Override
  3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu)
  4. throws Exception {
  5. System.out.println("======preHandle======");
  6. System.out.println("IP:" + RequestUtil.getClientIP(request));
  7. System.out.println("接口类:" + serviceObj.getClass().getName());
  8. if(argu != null) {
  9. System.out.println("参数类:" + argu.getClass().getName());
  10. }
  11. return true;
  12. }
  13. @Override
  14. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu,
  15. Object result) throws Exception {
  16. System.out.println("======postHandle======");
  17. System.out.println("接口类:" + serviceObj.getClass().getName());
  18. if(argu != null) {
  19. System.out.println("参数类:" + argu.getClass().getName());
  20. }
  21. System.out.println("结果:" + JSON.toJSONString(result));
  22. }
  23. @Override
  24. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object serviceObj,
  25. Object argu, Object result, Exception e) throws Exception {
  26. System.out.println("======afterCompletion======");
  27. System.out.println("接口类:" + serviceObj.getClass().getName());
  28. System.out.println("参数类:" + argu.getClass().getName());
  29. System.out.println("最终结果:" + JSON.toJSONString(result));
  30. System.out.println("e:" + e);
  31. }
  32. }

在apiConfgi中添加拦截器:

  1. @Override
  2. protected void initApiConfig(ApiConfig apiConfig) {
  3. ...
  4. // 配置拦截器
  5. apiConfig.setInterceptors(
  6. new ApiInterceptor[] { new LogInterceptor()});
  7. ...
  8. }

拦截范围

默认拦截所有接口,如果要拦截指定接口,可重写boolean match()方法:

  1. // 只拦截goods.get接口
  2. @Override
  3. public boolean match(ApiMeta apiMeta) {
  4. return apiMeta.getName().equals("goods.get");
  5. }