如何创建一个 JSONP 过滤器,并在回调前加上 /**/?
How do I create a JSONP filter with /**/ prepended to the callback?
我正在将 Spring 引导应用程序升级到 2.0 版,并将 Spring 框架升级到 5.1 版。
该应用程序当前使用 Spring 的内置 JSONP 支持,使用 AbstractJsonpResponseBodyAdvice。
@ControllerAdvice
public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice {
public JsonpControllerAdvice() {
super("jsonp");
}
}
但是,JSONP 支持 。另外,这个时候转CORS也不行。
最后一个警告是 JavaScript 回调方法必须以 /**/
开头。例如(截断):
/**/jQuery1720351297557893959_1567180700293(...)
我试过使用 jsonp-filter,但我无法将回调配置为包含 /**/
。
如何创建自定义 Spring 引导 JSONP 过滤器,并在回调前添加 /**/
?
注:我的例子和类似。但是我不能删除 /**/
因为现有的前端代码在回调中需要它。
虽然您不能使用jsonp-filter,但您可以基于它定义一个简单的过滤器。例如:
@Component
public class JsonPFilter implements Filter {
@Override public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String callback = null;
if (request instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
callback = httpServletRequest.getParameter("jsonp");
}
if (callback != null) {
OutputStream out = response.getOutputStream();
out.write(String.format("/**/%s(", callback).getBytes());
chain.doFilter(request, response);
out.write(new JsonPResponseWrapper((HttpServletResponse) response).getData());
out.write(")".getBytes());
out.close();
} else {
chain.doFilter(request, response);
}
}
private static class JsonPResponseWrapper extends HttpServletResponseWrapper {
private JsonPResponseWrapper(HttpServletResponse response) {
super(response);
}
private byte[] getData() {
return new ByteArrayOutputStream().toByteArray();
}
}
}
我正在将 Spring 引导应用程序升级到 2.0 版,并将 Spring 框架升级到 5.1 版。
该应用程序当前使用 Spring 的内置 JSONP 支持,使用 AbstractJsonpResponseBodyAdvice。
@ControllerAdvice
public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice {
public JsonpControllerAdvice() {
super("jsonp");
}
}
但是,JSONP 支持
最后一个警告是 JavaScript 回调方法必须以 /**/
开头。例如(截断):
/**/jQuery1720351297557893959_1567180700293(...)
我试过使用 jsonp-filter,但我无法将回调配置为包含 /**/
。
如何创建自定义 Spring 引导 JSONP 过滤器,并在回调前添加 /**/
?
注:我的例子和/**/
因为现有的前端代码在回调中需要它。
虽然您不能使用jsonp-filter,但您可以基于它定义一个简单的过滤器。例如:
@Component
public class JsonPFilter implements Filter {
@Override public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String callback = null;
if (request instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
callback = httpServletRequest.getParameter("jsonp");
}
if (callback != null) {
OutputStream out = response.getOutputStream();
out.write(String.format("/**/%s(", callback).getBytes());
chain.doFilter(request, response);
out.write(new JsonPResponseWrapper((HttpServletResponse) response).getData());
out.write(")".getBytes());
out.close();
} else {
chain.doFilter(request, response);
}
}
private static class JsonPResponseWrapper extends HttpServletResponseWrapper {
private JsonPResponseWrapper(HttpServletResponse response) {
super(response);
}
private byte[] getData() {
return new ByteArrayOutputStream().toByteArray();
}
}
}