SpringBoot使⽤Filter对Controller返回数据进⾏修改,例如jsonp格式返回
需求描述,Controller接⼝定义的返回实体类型,但是前端需要jsonp格式,就是传⼊callback参数时,对返回的数据进⾏包裹::形如callback(data),现在需要⼀个统⼀的⽅法对所有的Controller添加返回数据格式修改,尝试使⽤了AOP,但是AOP的返回值会转型为Controller接⼝定义的类型,对于JSONP返回的字符串类型来说肯定是不⾏的,于是有了以下⽅法
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Map;
@WebFilter(urlPatterns = "/*", filterName = "callbackFilter")
public class ResponseFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
//获取参数
Map<String, String[]> params = ParameterMap();
String key;
//查有没有callback或者cb参数
if (!ainsKey("callback")) {
if (!ainsKey("cb")) {
filterChain.doFilter(request, response);
return;
}
key = "cb";
} else {
key = "callback";
}
String callback = "";
String[] param = (key);
if (param != null && param.length > 0) {
callback = param[0];
}
MyResponseWrapper responseWrapper = new MyResponseWrapper((HttpServletResponse) response);
// 这⾥只拦截返回,直接让请求过去,如果在请求前有处理,可以在这⾥处理
filterChain.doFilter(request, responseWrapper);
byte[] content = Content();
String str = new String(content, "UTF-8");
// System.out.println(str);
str = callback + "(" + str + ")";
//把返回值输出到客户端
ServletOutputStream out = OutputStream();
byte[] re = Bytes("UTF-8");
response.setContentLength(re.length);//重新设置返回长度
out.write(re);
}
private class MyResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream buffer;
private ServletOutputStream out;
public MyResponseWrapper(HttpServletResponse httpServletResponse) {
super(httpServletResponse);
buffer = new ByteArrayOutputStream();
buffer = new ByteArrayOutputStream();
out = new WrapperOutputStream(buffer);
}
@Override
public ServletOutputStream getOutputStream()
throws IOException {
return out;
}
@Override
public void flushBuffer()
throws IOException {
if (out != null) {
out.flush();
}
}
public byte[] getContent()
throws IOException {
flushBuffer();
ByteArray();
}
class WrapperOutputStream extends ServletOutputStream {
private ByteArrayOutputStream bos;springboot aop
public WrapperOutputStream(ByteArrayOutputStream bos) {
this.bos = bos;
}
@Override
public void write(int b)
throws IOException {
bos.write(b);
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener arg0) {
}
}
}
@Override
public void init(FilterConfig arg0)
throws ServletException {
}
@Override
public void destroy() {
}
}
使⽤@WebFilter 注解时,需要在启动类加上@ServletComponentScan
不使⽤@WebFilter 注解也可以使⽤⼿动注册,实现⾃定义扫描路径
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import t.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class ResponseFilterConfig {
@Value("${jsonp-filter-urlPatterns:/*}")
private String patterns;
@Bean
public FilterRegistrationBean setFilter(){
FilterRegistrationBean filterBean = new FilterRegistrationBean();
filterBean.setFilter(new ResponseFilter());
filterBean.setName("callbackFilter");
String[] patternStr=patterns.split(",");
filterBean.addUrlPatterns(patternStr);
return filterBean;
}
}
yml添加参数设置扫描路径,不设置时缺省值为 /*,即扫描全路径jsonp-filter-urlPatterns: /user/getList,/user/get
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论