2015-02-10 36 views
0

我一直在使用公開soap和restful webservice的Enterprise應用程序。我在web.xml中使用了Restful webservice和跨域調用來實現CORS過濾器。現在我正在嘗試使用SOAP服務(我的ajax調用soap)。如何配置CORS在這裏進行過濾,以獲得在跨域使用CORS過濾器進行SOAP服務

添加摘錄

由於REST實現是servlet映射我有我的servlet映射這樣

<servlet-name>RestServlet</servlet-name> 
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
<init-param> 
<param-name>com.sun.jersey.config.property.packages</param-name> 
<param-value>com.servicedata.service</param-value> 
</init-param> 
</servlet> 


<servlet-mapping> 
<servlet-name>RestServlet</servlet-name> 
<url-pattern>/services/*</url-pattern> 
</servlet-mapping> 

我已經在應用程序部署我的應用程序服務器, 我Applciation.xml看起來像這樣

<module> 
    <web> 
     <web-uri>UI.war</web-uri> 
     <context-root>Web</context-root> 
    </web> 
    </module> 
    <module> 
    <web> 
     <web-uri>Router.war</web-uri> 
     <context-root>Router</context-root> 
    </web> 

因此,這將在被曝光3210 我可以用restclient打這個URL,我得到了一個響應。 正在調用Ajax的時候,我的應用程序不允許訪問我的服務。[驗證拒絕]

,所以我增加了一個CORS篩選對此

class ResponseFilter{ 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse httpServletResponse = (HttpServletResponse) response; 
     httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); 
     httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
     httpServletResponse.setHeader("Access-Control-Max-Age", "3600"); 
     httpServletResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with"); 
     chain.doFilter(request, response); 
    } 
} 

在web.xml

<filter> 
<filter-name>CORS</filter-name> 
<filter-class>com.servlet.ResponseFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>CORS</filter-name> 
<url-pattern>/services/*</url-pattern> 
</filter-mapping> 

它適用於休息,這很好。在SOAP

的情況下,我的肥皂URL將http:<hostname>:<port>/Business/service/Manager

這是URL會在我的WSDL定義。

所以,當我嘗試訪問我的SOAP部署在我的應用程序是不允許跨access.Here起源是不允許的,因爲我有一個從本地server.localhost Ajax調用hostserver

我已經配置CORS因爲它是servlet映射。我該如何做SOAP服務。

+0

「同樣的方式」。我認爲你已經嘗試過,並且遇到了問題,所以如果你需要幫助,你需要發佈具體信息。錯誤,配置,執行SOAP調用的JavaScript代碼,作品。 – Gimby 2015-02-10 15:45:04

+0

Gimby我已經添加了我的代碼的片段 – Arun 2015-02-11 08:47:45

回答

1

1)創建「handler.xml」,並把你的處理程序類的這些行。

<javaee:handler-chains xmlns:javaee="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <javaee:handler-chain> 
     <javaee:handler> 
      <javaee:handler-class>somepackage.MySOAPHandler</javaee:handler-class> 
     </javaee:handler> 
    </javaee:handler-chain> 
</javaee:handler-chains> 

2)在 「somepackage」 包創建SOAPHandler類。

import javax.servlet.http.HttpServletResponse; 
import javax.xml.namespace.QName; 
import javax.xml.soap.SOAPMessage; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.ws.handler.MessageContext; 
import javax.xml.ws.handler.soap.SOAPHandler; 
import javax.xml.ws.handler.soap.SOAPMessageContext; 

import org.apache.log4j.Logger; 

public class MySOAPHandler implements SOAPHandler<SOAPMessageContext> { 
    Logger logger; 

    public MySOAPHandler() { 
     super(); 
     logger = Logger.getLogger(MySOAPHandler.class); 
    } 

    @Override 
    public void close(MessageContext arg0) { 

    } 

    @Override 
    public boolean handleFault(SOAPMessageContext arg0) { 
     return false; 
    } 

    @Override 
    public boolean handleMessage(SOAPMessageContext smc) { 
     System.out.println("Handling soap message..."); 

     Map<String, List<String>> map = (Map<String, List<String>>)smc.get(MessageContext.HTTP_REQUEST_HEADERS);   
     Boolean outboundProperty = (Boolean) smc 
       .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 

     if (outboundProperty.booleanValue()) { 
      logger.debug("\nOutbound message:"); 
       //this is underlying http response object 
       HttpServletResponse response = (HttpServletResponse) smc.get(MessageContext.SERVLET_RESPONSE); 

       response.addHeader("Access-Control-Allow-Origin", "*"); 
       response.addHeader("Access-Control-Allow-Credentials", "false"); 
       response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
       response.setHeader("Access-Control-Max-Age", "3600"); 
       response.addHeader("Access-Control-Allow-Headers", "Origin, Accept, x-requested-with, Content-Type, SOAPAction, Access-Control-Allow-Headers, Access-Control-Response-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Origin"); 
     } else { 
      logger.debug("\nInbound message:"); 
     } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return true; 
    } 

    @Override 
    public Set<QName> getHeaders() { 
     return null; 
    } 

} 

3)添加註釋爲您WebServiceProvider此類

@ServiceMode(value = javax.xml.ws.Service.Mode.MESSAGE) 
@HandlerChain(file="handler.xml") 
@WebServiceProvider(serviceName = "MyWS", portName = "MyWSPort", targetNamespace = "http://namespace = "WEB-INF/wsdl/MyWSDL.wsdl") 
public class MyWS implements javax.xml.ws.Provider<SOAPMessage> { 

    ... 
} 

它會工作,然後。

相關問題