CorsFilter丢失表示实体



我的GET与CorsFilter一起工作,但是当我做一个文件上传帖子时,我在资源级别失去了表示实体。请帮帮我,我被卡住了。以下是源代码(/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);

在资源中的我的表示实体中,我的调试器说实体是[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);
 }
 });

我认为你可以尝试使用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;
    }
}

希望它能帮助你,蒂埃里

最新更新