2015-02-11 48 views
2

我想要做什麼:使用jQuery與jQuery Soap插件(通過Remy Blom)從JavaScript調用跨域SOAP服務。 (也就是我所說的$.soap();在JavaScript)預檢選項請求到SOAP服務不起作用

我所做:CORS設置在服務器端(CXF)的工作(使用org.eclipse.jetty.servlets.CrossOriginFilter),所以中存在下列答案:

Access-Control-Allow-Head... X-Requested-With,Content-Type,Accept,Origin 
Access-Control-Allow-Meth... GET,POST,OPTIONS,HEAD 
Access-Control-Allow-Orig... http://localhost:8082 
Content-Type     application/soap+xml;charset=UTF-8 

缺少什麼:在POST請求SOAP調用之前,Firefox和Chrome發送預檢OPTIONS請求。顯然,SOAP不允許使用動詞OPTIONS

它不會了SoapUI(5.0)以及CXF(2.7.7)的工作。它在org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor線130ff在評論甚至說:

/* 
* Reject OPTIONS, and any other noise that is not allowed in SOAP. 
*/ 

所以,我的問題是:如何修改我的SOAP servcie實現(使用CXF),使得OPTIONS請求成功返回?

+0

如果我理解正確的;那麼,你只需要用@OPTIONS註釋你的WebService類。請參閱:http://cxf.apache.org/docs/jax-rs-cors.html – Rafa 2015-02-18 05:17:21

+1

@YoriKusanagi這裏描述瞭如何爲REST服務而不是SOAP服務解決這個問題。 – 2015-04-03 09:56:21

回答

4

即使它是一個有點晚了,最近我有同樣的問題,也許這將有助於未來的旅客。

OPTIONS的情況下,請你可能無法與FilterChain繼續。 我創建了一個簡單CORSFilter,它看起來像這樣:

import java.io.IOException; 
import javax.servlet.*; 
import javax.servlet.http.* 

public class CORSFilter implements Filter { 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException {} 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest req = (HttpServletRequest) request; 
     HttpServletResponse resp = (HttpServletResponse) response; 

     resp.addHeader("Access-Control-Allow-Origin", "*"); 
     resp.addHeader("Access-Control-Allow-Methods", "GET, POST"); 
     resp.addHeader("Access-Control-Allow-Headers", req.getHeader("Access-Control-Request-Headers")); 

     if (!req.getMethod().equalsIgnoreCase("OPTIONS")) { 
      chain.doFilter(request, response) 
     } 
    } 

    @Override 
    public void destroy() {} 
} 

我增加了以下我的web.xml:

<filter> 
    <filter-name>CORSFilter</filter-name> 
    <filter-class>CORSFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CORSFilter</filter-name> 
    <url-pattern>/api/*</url-pattern> 
</filter-mapping>