我正在尝试为响应设置“Access-Control-Allow-Origin: *”头。然而,这个头并不存在。我做错了什么?
我查看了org.restlet.engine.application.CorsResponseHelper的源代码,其中包含以下代码:
我们可以看到MyCorsService可用,但它从未被Servlet框架调用。另一方面,如果我从IDE运行服务(Java SE版本),则会调用MyCorsService。为什么这些情况会有不同的行为呢?
部分解决方案:我通过更改org.restlet.engine.header.HeaderUtils中的代码成功添加了允许来源头信息。
然而,为什么Tomcat中的servlet框架没有调用cors服务的答案仍然未知。
public class JsonApplication extends Application
{
private static final String SERVER_URL = "http://localhost:8111";
public static void main(String[] args) throws Exception
{
Server testServer = new Server(Protocol.HTTP, 8111);
JsonApplication jsonApplication = new JsonApplication();
CorsService corsService = new CorsService();
corsService.setAllowedOrigins( new HashSet(Arrays.asList("*")));
corsService.setAllowedCredentials(true);
jsonApplication.getServices().add( corsService );
testServer.setNext( jsonApplication );
testServer.start();
}
@Override
public Restlet createInboundRoot()
{
Router router = new Router( getContext() );
router.attach( SERVER_URL + "/", RootResource.class );
return router;
}
}
我查看了org.restlet.engine.application.CorsResponseHelper的源代码,其中包含以下代码:
public void addCorsResponseHeaders(Request request, Response response) {
String origin = request.getHeaders().getFirstValue("Origin", true);
if (origin == null) {
// Not a CORS request
return;
}
...
}
因为在这种情况下 origin == null,所以目前的CORS实现似乎不支持从本地html文件发出的请求。
我在我的servlet应用程序中添加了一些日志记录:
JsonApplication::createInboundRoot()
16:26 MyCorsService()
16:26 myCorsService = wwwdbase.rest.cors.MyCorsService@6e1b241d
16:26 MyCorsService::setAllowedOrigins(), [*]
16:26 services: [org.restlet.service.TunnelService@4c88fe62,
org.restlet.service.StatusService@68349a5b,
org.restlet.service.DecoderService@77cfd8d3,
org.restlet.service.EncoderService@40c331fb,
org.restlet.service.RangeService@4bb3bc6f,
org.restlet.service.ConnectorService@7990100,
org.restlet.service.ConnegService@e194860,
org.restlet.service.ConverterService@578cfcb1,
org.restlet.service.MetadataService@18a62eb,
org.restlet.service.TaskService@4ed4f2db,
wwwdbase.rest.cors.MyCorsService@6e1b241d]
我们可以看到MyCorsService可用,但它从未被Servlet框架调用。另一方面,如果我从IDE运行服务(Java SE版本),则会调用MyCorsService。为什么这些情况会有不同的行为呢?
部分解决方案:我通过更改org.restlet.engine.header.HeaderUtils中的代码成功添加了允许来源头信息。
if (response.getAccessControlAllowOrigin() != null)
{
addHeader(HeaderConstants.HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
response.getAccessControlAllowOrigin(), headers);
}
to
if (response.getAccessControlAllowOrigin() != null)
{
addHeader(HeaderConstants.HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
response.getAccessControlAllowOrigin(), headers);
}
else
{
// --- Add in any case!
//
response.setAccessControlAllowOrigin( "*" );
addHeader(HeaderConstants.HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
response.getAccessControlAllowOrigin(), headers);
}
然而,为什么Tomcat中的servlet框架没有调用cors服务的答案仍然未知。