如何创建一个 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();
        }
    }
}