2017-01-13 7 views
1

私は、Spring RestサービスでAjaxアップロードを使用してアップロード機能を開発しています。これは、開発サーバー上で正常に動作しますが、一度本番と同様の構成を有しているとクロスplateformコールを必要とする統合サーバ上で、私は私のJavaScriptコンソールで恐ろしいクロスプラットフォームのAjaxアップロードが動作しない

XMLHttpRequest cannot load http://xxxxxxxxxx:7001/felixmetier/rest/upload/montants. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://yyyyyyy' is therefore not allowed access. The response had HTTP status code 500. 

を取得します。ここで

アップロードのJavascriptコードとJSPの作品:春コントローラから

var xhr = new XMLHttpRequest(); 
    if ("withCredentials" in xhr) { 
    xhr.withCredentials = true; 
    xhr.open('POST', '<%=Environment.getServiceParameter("FELIX", "rest.service.saisieMontants.upload.url")%>', true); 
    } else if (typeof XDomainRequest != "undefined") { 
    xhr = new XDomainRequest(); 
    xhr.open('POST', '<%=Environment.getServiceParameter("FELIX", "rest.service.saisieMontants.upload.url")%>'); 
    } else { 
    throw new Error('Accès cross-platform interdit sur ce navigateur. Utilisez un navigateur plus récent (IE 8+, Chrome 3+, Firefox 3.5+, Safari 4+).'); 
    } 
    xhr.onload = function() { 
    activateFormButtonsAndLinks(); 
    document.getElementById('fwkWaitingScreen').style.display = 'none'; 
    var response = this.responseText; 
    var data = JSON.parse(response); 

    if (data.status===1) { 
     alert("Erreur générale lors du chargement (pas de mise à jour en BDD) : "+data.message); 
    } else { 
     var msg = "Chargement terminé.\n\nNb de lignes traitées : "+data.totLines+"\nNb de lignes déjà controlées : "+data.totControlled+"\nNb de lignes inexistantes en BDD : "+data.totIgnored 

     if (data.status===2) { 
      msg = msg + "\n\n"+data.totError+" erreur se sont produires lors du chargement. Lignes en erreur (max. "+data.maxError+" affichées) : "+data.errorLines 
     } else { 
      msg = msg + "\n\n"+"Chargement OK"; 
     } 

     alert(msg); 
    } 

    var rechBouton = document.getElementsByName("recherche").item(0); 

    doAction(rechBouton, '','rechercherbouton'); 
    } 

    xhr.send(formData); 

:私のweb.xmlから

@Controller 
public class MontantsUploadController { 
... 

    @RequestMapping(value = "/upload/montants", method = RequestMethod.POST) 
    public ResponseEntity<?> upload(@RequestParam("file_up") MultipartFile file, HttpServletRequest request) { 
     InputStream is; 
     SaisieMontantsUploadRestResponse feedback = null; 
     try { 
      is = file.getInputStream(); 
      Reader reader = new InputStreamReader(is); 

      feedback = parseImportedFile(reader, "guest", getLocale(request)); 
     } catch (IOException e) { 
      feedback = new SaisieMontantsUploadRestResponse(); 
      feedback.setMessage("Impossible de lire le fichier attaché"); 
      feedback.setStatus(SaisieMontantsUploadRestResponse.STATUS_GENERAL_ERROR); 
      log.error("Impossible de traiter le CSV", e); 
     } 

     backupFile(file); 

     return new ResponseEntity<SaisieMontantsUploadRestResponse>(feedback, HttpStatus.OK); 
    } 
... 
} 

<filter> 
    <filter-name>CORS</filter-name> 
    <filter-class>fr.xxxx.felix.ejb.restjson.filter.CorsFilter</filter-class> 
</filter> 

<!-- Applying the CORS Filter to All REST URL --> 
<filter-mapping> 
    <filter-name>CORS</filter-name> 
    <url-pattern>/rest/*</url-pattern> 
</filter-mapping> 

そして、ここにフィルタからのコード:

public class CorsFilter extends OncePerRequestFilter { 
    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 
     response.addHeader("Access-Control-Allow-Origin", "*"); 
     response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 
     response.addHeader("Access-Control-Allow-Headers", "Content-Type"); 
     response.addHeader("Access-Control-Max-Age", "30"); 

     filterChain.doFilter(request, response); 
    } 
} 

私はJava 7、Tomcat 7、Spring 3.0.4を使用しています。

編集:request.getHeader("Access-Control-Request-Method")のログに(私はそのサーバーでデバッグできません)、それはnullです。しかし、request.getMethod()は "POST"を返します。それは普通ですか?

編集2:私の休息コールは、マルチパート/フォームデータのコンテンツタイプとカスタムヘッダーがないPOSTメソッドを使用しているため、プリフライトコールは必要ありません。とにかく、カスタムヘッダーを追加し、それを自分のAccess-Control-Allow-Headersレスポンスヘッダーに許可することで、プリフライトコールを強制しました。今、私はブラウザのネットワークコンソールで2つの呼び出しを見ることができます。そして奇妙なことです:私のプリフライトOPTIONS呼び出しは何の問題もなく渡されますが、私のPOST呼び出しは依然として "No 'Access-Control-Allow-Origin'ヘッダーが要求されたリソースに存在します。私は本当にそれを取得していません。

編集3:今、私たちはどこかに行っています。クロスドメイン環境では、ブラウザがクロスドメインエラーとして500エラーをサーバーから誤って解釈しているようです。そして、私はlocalhost.logで見たとき、私は実際に例外を参照してください。私はクロームのネットワークビューで私の要求に「file_up」と呼ばれるマルチパートファイルを見ることができますので、私:

org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'file_up' is not present 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.raiseMissingParameterException(AnnotationMethodHandlerAdapter.java:715) 
     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestParam(HandlerMethodInvoker.java:511) 
     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:340) 
     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:427) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:415) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:788) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:717) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at fr.xxxxx.felix.ejb.restjson.filter.CorsFilter.doFilterInternal(CorsFilter.java:77) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:745) 

問題は今なぜそれがうまくいかないのかまだ分かりません。

要求ペイロード:

------WebKitFormBoundaryi7iVj0nFvRL8zcuy 
Content-Disposition: form-data; name="file_up"; filename="test_SAISIE_DES_MONTANTS.csv" 
Content-Type: application/vnd.ms-excel 


------WebKitFormBoundaryi7iVj0nFvRL8zcuy-- 

謎が厚く...

+0

これは識別された問題のように見えますが、multipartResolverとmultipartFilterを追加しても、それはまだ機能しません。しかし、私は進歩しています。 –

答えて

0

私は最終的に私の問題を解決しました。実際のクロスドメインの問題ではないことが分かりましたが、500内部エラーブラウザはクロスドメインアクセスエラーと誤解していました。これは、クロスドメインコールが行われたときにいつも起こりうることです500エラーが発生しています。クロスドメインエラーに対処する際の注意点。

実際の問題は簡単なSpring設定の問題でしたが、何らかの欠けていたパラメータが、自分のローカルTomcatインストールでコードが動作しないようにしていませんでした。

+0

@troelsknありがとうございました。ここに彼のコメントを添えて、私に正しい方向を教えてくれてありがとう:http://stackoverflow.com/questions/10143093/origin-is-not-allowed-by-access-control-allow-origin –

1


response.addHeader("Access-Control-Allow-Headers", "Content-Type, Content-Range, Content-Disposition, Content-Description");

で試してみて、私はあなたがOPTIONSもあなたの方法でを追加する必要があると思います。

+0

"Access-Control-Allow-Headers"ヘッダーに "Content-Range、Content-Disposition、Content-Description"を追加し、 "OPTIONS"を "Access-Control-Allow-Methods"に追加しましたが、 。 –

関連する問題