(11) Interceptor

easyopen supports interceptors since version 1.3.1.

The implementation principle of the easyopen interceptor is similar to that of the springmvc interceptor. The interceptor acts on the api method, that is, the method annotated with @Api.

The interceptor is defined as follows:

/**
 * 拦截器,原理同springmvc拦截器
 * @author tanghc
 *
 */
public interface ApiInterceptor {
    /**
     * 预处理回调方法,在方法调用前执行
     * @param request
     * @param response
     * @param serviceObj service类
     * @param argu 方法参数
     * @return
     * @throws Exception
     */
    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu)
            throws Exception;

    /**
     * 接口方法执行完后调用此方法。
     * @param request
     * @param response
     * @param serviceObj service类
     * @param argu 参数
     * @param result 方法返回结果
     * @throws Exception
     */
    void postHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu,
            Object result) throws Exception;

    /**
     * 结果包装完成后执行
     * @param request
     * @param response
     * @param serviceObj service类
     * @param argu 参数
     * @param result 最终结果,被包装过
     * @param e 
     * @throws Exception
     */
    void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu,
            Object result, Exception e) throws Exception;

    /**
     * 匹配拦截器
     * @param apiMeta 接口信息
     * @return
     */
    boolean match(ApiMeta apiMeta);
}

Also provides an adapter ApiInterceptorAdapter

  • Interceptor execution flow:

Same as springmvc interceptor execution process

  1. If preHandle returns false, the api method is not called, and then afterCompletion is called in reverse order, which needs to be returned by the response
  2. If preHandle returns true, proceed to next preHandle
  3. After preHandle is executed, execute postHandle in reverse order
  4. Finally call afterCompletion in reverse order

    • Normal Process:
ApiInterceptor1.preHandle
ApiInterceptor2.preHandle

apiMethod.invoke() // api方法调用

ApiInterceptor2.postHandle
ApiInterceptor1.postHandle

ApiInterceptor2.afterCompletion
ApiInterceptor1.afterCompletion

Configure the interceptor

Create a new log processing interceptor, inherit ApiInterceptorAdapter, and override the methods in the parent class

public class LogInterceptor extends ApiInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu)
            throws Exception {

        System.out.println("======preHandle======");
        System.out.println("IP:" + RequestUtil.getClientIP(request));
        System.out.println("接口类:" + serviceObj.getClass().getName());
        if(argu != null) {
            System.out.println("参数类:" + argu.getClass().getName());
        }


        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu,
            Object result) throws Exception {
        System.out.println("======postHandle======");
        System.out.println("接口类:" + serviceObj.getClass().getName());
        if(argu != null) {
            System.out.println("参数类:" + argu.getClass().getName());
        }
        System.out.println("结果:" + JSON.toJSONString(result));
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object serviceObj,
            Object argu, Object result, Exception e) throws Exception {
        System.out.println("======afterCompletion======");
        System.out.println("接口类:" + serviceObj.getClass().getName());
        System.out.println("参数类:" + argu.getClass().getName());
        System.out.println("最终结果:" + JSON.toJSONString(result));
        System.out.println("e:" + e);
    }

}

Add interceptor in apiConfgi:

@Override
    protected void initApiConfig(ApiConfig apiConfig) {
        ...

        // 配置拦截器
        apiConfig.setInterceptors(
                new ApiInterceptor[] { new LogInterceptor()});

       ...
    }

Intercept range

All interfaces are intercepted by default. If you want to intercept a specified interface, you can override the boolean match() method:

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324953261&siteId=291194637