我正在研究一个dropwizard应用程序和js ui来与api交互.我需要加载json数据来更新视图,但我必须在之前启用dropwizard中的cors.我做了一些工作人员,但似乎没有工作因为dropwizard总是返回204没有内容.
@Override
public void run(final BGConfiguration configuration, final Environment environment) throws Exception {
final Map<String, String> params = new HashMap<>();
params.put("Access-Control-Allow-Origin", "/*");
params.put("Access-Control-Allow-Credentials", "true");
params.put("Access-Control-Expose-Headers", "true");
params.put("Access-Control-Allow-Headers", "Content-Type, X-Requested-With");
params.put("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
environment.servlets().addFilter("cors", CrossOriginFilter.class).setInitParameters(params);
}
Run Code Online (Sandbox Code Playgroud)
Mik*_*rke 53
这里的错误是过滤器尚未通过该addMappingForUrlPatterns方法配置URL路径.
这对我使用dropwizard 0.7.1:
import org.eclipse.jetty.servlets.CrossOriginFilter;
import javax.servlet.DispatcherType;
import java.util.EnumSet;
public void run(Configuration conf, Environment environment) {
// Enable CORS headers
final FilterRegistration.Dynamic cors =
environment.servlets().addFilter("CORS", CrossOriginFilter.class);
// Configure CORS parameters
cors.setInitParameter("allowedOrigins", "*");
cors.setInitParameter("allowedHeaders", "X-Requested-With,Content-Type,Accept,Origin");
cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD");
// Add URL mapping
cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
}
Run Code Online (Sandbox Code Playgroud)
我假设您正在浏览器中进行实时测试,但您可以通过CLI验证这样的curl命令:
$ curl -H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS --verbose \
http://localhost:8080
Run Code Online (Sandbox Code Playgroud)
您应该Access-Control-*在响应中看到一堆HTTP标头.
加入Mike Clarke的回答:
设置CHAIN_PREFLIGHT_PARAM为false将使此过滤器处理预检请求,而您的身份验证过滤器不会截取200响应并将其转换为未授权/禁止.
import org.eclipse.jetty.servlets.CrossOriginFilter;
import javax.servlet.DispatcherType;
import java.util.EnumSet;
public void run(Configuration conf, Environment environment) {
// Enable CORS headers
final FilterRegistration.Dynamic cors =
environment.servlets().addFilter("CORS", CrossOriginFilter.class);
// Configure CORS parameters
cors.setInitParameter("allowedOrigins", "*");
cors.setInitParameter("allowedHeaders", "X-Requested-With,Content-Type,Accept,Origin");
cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD");
// Add URL mapping
cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
// DO NOT pass a preflight request to down-stream auth filters
// unauthenticated preflight requests should be permitted by spec
cors.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM, Boolean.FALSE.toString());
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶我没有在包含此配置的互联网上找到任何示例.花了几天时间试图解决这个问题.
| 归档时间: |
|
| 查看次数: |
14933 次 |
| 最近记录: |