Spring 如何创建一个在回调前加上/**/的JSONP过滤器?

Spring 如何创建一个在回调前加上/**/的JSONP过滤器?,spring,spring-boot,jsonp,Spring,Spring Boot,Jsonp,我正在将Spring启动应用程序升级到2.0版,将Spring框架升级到5.1版 该应用程序目前使用Spring的内置JSONP支持 然而,JSONP支持是有限的。此外,此时切换到CORS是不可行的 最后一个警告是JavaScript回调方法必须以/**/开头。例如(截断): 我已尝试使用,但无法将回调配置为包含/***/ 如何创建一个定制的Spring Boot JSONP过滤器,并在回调之前添加/**/ 注意:我的示例与类似。但是我不能删除/**/,因为现有前端代码希望回调中有它。虽然不能

我正在将Spring启动应用程序升级到2.0版,将Spring框架升级到5.1版

该应用程序目前使用Spring的内置JSONP支持

然而,JSONP支持是有限的。此外,此时切换到CORS是不可行的

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

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

如何创建一个定制的Spring Boot JSONP过滤器,并在回调之前添加
/**/


注意:我的示例与类似。但是我不能删除
/**/
,因为现有前端代码希望回调中有它。

虽然不能使用,但可以基于它定义一个简单的过滤器。例如:

@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();
        }
    }
}
虽然不能使用,但可以基于它定义一个简单的过滤器。例如:

@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过滤器。你确定这是一个答案吗?因为看起来这个信息应该添加到问题中/@JonathanJohx是的,我确定。这是我用来解决这个问题的定制SpringBootJSONP过滤器。
@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();
        }
    }
}