拦截器拦截入参出参
入参
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { logger.info("开始拦截........."); String business = request.getRequestURI(); business.replaceAll("cloud-native-container-manage",""); //获取返回 String result = null; try { //获取集群id String clusterId = request.getHeader("clusterId"); if (clusterId == null || clusterId.length() == 0) { ResponseJson responseJson = new ResponseJson(); responseJson.setErrorCode(EnumMsg.PARAMS_MISSING.getCode()); responseJson.setErrorMsg(EnumMsg.PARAMS_MISSING.getMsg()); // HashMap<String, Object> map = new HashMap<>(); // map.put("message",EnumMsg.PARAMS_MISSING.getMsg()); // map.put("code",EnumMsg.PARAMS_MISSING.getCode()); result = JSONObject.toJSONString(responseJson); } else { getRequestBody(request,clusterId); } } catch (Exception e) { logger.info("出现异常",e); ResponseJson responseJson = new ResponseJson(); responseJson.setErrorCode(EnumMsg.RESULT_IS_Missing.getCode()); responseJson.setErrorMsg(EnumMsg.RESULT_IS_Missing.getMsg()); // HashMap<String, Object> map = new HashMap<>(); // map.put("message",EnumMsg.RESULT_IS_Missing.getMsg()); // map.put("code",EnumMsg.RESULT_IS_Missing.getCode()); result = JSONObject.toJSONString(responseJson); } //返回数据 写到前端 if (result != null) { response.setHeader("Cache-Control", "no-cache"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/json;charset=UTF-8"); logger.info(business + "返回结果" + result); try { response.getWriter().println(result); response.getWriter().flush(); response.getWriter().close(); } catch (Exception e) { logger.error("io读写失败" + e); } return false; } return true; }
出参
使用@RestController或者@ResponseBody注解的类或方法,不能再拦截器的postHandle方法获取返回值,因为返回值直接就注入到了流内。
这时需要使用@ControllerAdvice
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType)方法可以指定哪些方法或者类需要进行拦截true为拦截,false为不拦截
package com.awifi.cloudnative.container.manage.provider.k8sClientController.interceptor; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.awifi.cloudnative.container.common.basic.ResponseJson; import org.slf4j.Logger; import java.lang.reflect.Method; import org.slf4j.LoggerFactory; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; /** * @ClassName K8sApiResponseBody * @Description TODO * @Author 张鑫 * @Date 2021/12/31 * @Version 1.0 **/ @ControllerAdvice public class K8sApiResponseBody implements ResponseBodyAdvice<Object> { private static final Logger logger = LoggerFactory.getLogger(K8sApiResponseBody.class); @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { return returnType.getContainingClass().getPackage().getName().startsWith("com.awifi.cloudnative.container.manage.provider.k8sClientController") && (returnType.getContainingClass().getAnnotation(RestController.class) != null || (returnType.getMethod() != null && returnType.getMethod().getAnnotation(ResponseBody.class) != null)); } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { logger.info("拦截出参"); String s = body.toString(); JSONObject parseObject = JSONObject.parseObject(s); if (parseObject != null) { if (parseObject.getString("code") != null) { ResponseJson responseJson = new ResponseJson(); responseJson.setErrorCode(parseObject.getString("code")); responseJson.setErrorMsg(parseObject.getString("message")); return JSON.toJSONString(responseJson); } } return body; } }