我的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);
}
});
答案 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;
}
}
希望它可以帮到你, 亨利