package cn.xxx.user.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.*;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import java.util.Map;
@Slf4j
@Aspect
@Component
@ControllerAdvice
public class JsonpInterceptor implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Class arg1) {
//过滤,只有ctrl包下的类,走beforeBodyWrite方法。
if (methodParameter.getMethod().getDeclaringClass().getName().contains("cn.xxx.user.ctrl"))
return true;
return false;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter arg1,
MediaType arg2, Class arg3, ServerHttpRequest request,
ServerHttpResponse arg5) {
String pcallback = null;
//过滤,只对GET方式的方法,进行jsonp处理
if (null != request.getMethod() && request.getMethod().matches("GET")) {
Map<String, String[]> parameterMap = ((ServletServerHttpRequest) request).getServletRequest().getParameterMap();
if (!CollectionUtils.isEmpty(parameterMap)) {
String[] pcallbackArray = parameterMap.get("pcallback");
if (null != pcallbackArray && pcallbackArray.length > 0) {
pcallback = pcallbackArray[0];
if(!StringUtils.isEmpty(pcallback)){
return pcallback + "(" + body.toString() + ")";
}
}
}
}
return body;
}
}
使用spring @ControllerAdvice 对jsonp进行封装
最新推荐文章于 2024-04-12 10:14:01 发布