CorsFilter失去代表实体

时间:2015-10-27 14:43:11

标签: cors restlet

我的GET与CorsFilter一起工作,但是当我执行文件上传帖子时,我在资源级别丢失了Representation实体。请帮助我卡住了。以下是源(/ collections GET),(/ fileupload POST无效)。

     CorsFilter corsFilter = new CorsFilter(getContext(), router);
     corsFilter.setAllowedOrigins(new HashSet(Arrays.asList("*")));
     corsFilter.setAllowedCredentials(true);
     corsFilter.setAllowingAllRequestedHeaders(true);
     corsFilter.setSkippingResourceForCorsOptions(true);

     corsFilter.setNext(CollectionsResource.class);
     router.attach("/collections", corsFilter);
     corsFilter.setNext(FileUploadResource.class);
     router.attach("/fileupload", corsFilter);

在资源中的Representation实体中,我的调试器说实体是[false/*]。表示为空。

我认为它应该是这样的:[multipart/form-data; .....]

以下是我的HTML& AJAX电话请看看。我错过了什么吗? get对我来说很好,但不是POST:

<html>
<head>
<script type="text/javascript" src="https://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.min.js"></script>
</head>
<body>
<form id="assetUpload">
<input id="fileToUpload" name="fileToUpload" type="file" />
<input type="submit" value="submit"/>
</form>
</body>
</html>

$("#assetUpload").submit(function(evt){
evt.preventDefault();

var formData = new FormData($(this)[0]);
    alert("FIRE");
$.ajax({
   url: 'http://localhost:14502/api/v1/fileupload',
 type: 'POST',
 data: formData,
 async: false,
 cache: false,
 contentType: 'false',
 enctype: 'multipart/form-data',
 processData: false,
 success: function (response) {
   alert(response);
 }
 });

1 个答案:

答案 0 :(得分:0)

我认为您可以尝试使用CorsService代替CorsFilter。配置起来更方便。

以下是在您的Restlet应用程序本身上配置它的方法:

CorsService corsService = new CorsService();
corsService.setAllowedOrigins(new HashSet(Arrays.asList("*")));
corsService.setAllowedCredentials(true);
corsService.setAllowingAllRequestedHeaders(true);
corsService.setSkippingResourceForCorsOptions(true);

application.getServices().add(corsService);
component.getDefaultHost().attachDefault(application);

使用此方法,在配置应用程序的路由时,您不再需要处理过滤器。这是您重构的代码:

public class MyApplication extends Application {
    public Restlet createInboutRoot() {
        Router router = new Router(getContext());
        router.attach("/collections", CollectionsResource.class);
        router.attach("/fileupload", FileUploadResource.class);
        return router;
    }
}

我认为您的问题来自您定义路由的方式。实际上,你设置了CorsFilter的下一个属性的两倍,最后一个获胜!因此,对于这两个路径(/collections/fileupload),将由FileUploadResource类处理。

此博文可能会让您感兴趣:https://templth.wordpress.com/2014/11/12/understanding-and-using-cors/

<强>被修改

如果您想明确使用CorsFilter,则应按照以下说明重构代码:

public class MyApplication extends Application {
    public Restlet createInboutRoot() {
        Router router = new Router(getContext());

        CorsFilter corsFilter = new CorsFilter(getContext(), router);
        corsFilter.setAllowedOrigins(new HashSet(Arrays.asList("*")));
        corsFilter.setAllowedCredentials(true);
        corsFilter.setAllowingAllRequestedHeaders(true);
        corsFilter.setSkippingResourceForCorsOptions(true);

        router.attach("/collections", CollectionsResource.class);
        router.attach("/fileupload", FileUploadResource.class);

        return corsFilter;
    }
}

希望它可以帮到你, 亨利