Spring 如何创建一个在回调前加上/**/的JSONP过滤器?
我正在将Spring启动应用程序升级到2.0版,将Spring框架升级到5.1版 该应用程序目前使用Spring的内置JSONP支持 然而,JSONP支持是有限的。此外,此时切换到CORS是不可行的 最后一个警告是JavaScript回调方法必须以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 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();
}
}
}