【问题标题】:How do I create a JSONP filter with /**/ prepended to the callback?如何在回调前添加 /**/ 创建 JSONP 过滤器?
【发布时间】:2020-01-03 22:04:05
【问题描述】:

我正在将 Spring Boot 应用程序升级到 2.0 版,并将 Spring Framework 升级到 5.1 版。

应用程序当前使用 Spring 内置的 JSONP 支持,使用 AbstractJsonpResponseBodyAdvice

@ControllerAdvice
public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice {

    public JsonpControllerAdvice() {
        super("jsonp");
    }
}

但是,JSONP 支持是 deprecated in version 5.0.7 and removed in version 5.1 RC1。另外,此时切换到CORS也不可行。

最后一个警告是 JavaScript 回调方法必须以 /**/ 开头。例如(截断):

/**/jQuery1720351297557893959_1567180700293(...)

我已尝试使用 jsonp-filter,但无法将回调配置为包含 /**/

如何在回调前添加 /**/ 创建自定义 Spring Boot JSONP 过滤器?


注意:我的例子类似于Spring Boot: Remove /**/ before JSONP callback function name。但我无法删除 /**/,因为现有的前端代码在回调中需要它。

【问题讨论】:

    标签: spring spring-boot jsonp


    【解决方案1】:

    虽然您不能使用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();
            }
        }
    }
    

    【讨论】:

    • 你确定这是一个答案吗?因为看起来应该在问题中添加此信息/
    • @JonathanJohx 是的,我确定。这是我用来解决问题的自定义 Spring Boot JSONP 过滤器。
    猜你喜欢
    • 2021-11-06
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多