熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

webservice的安全機制---Filter

2013-11-23 18:46:46  來源: Java核心技術 

  引言
   
    前面講了webservice的安全機制本節繼續webservice的安全之旅
   
    本節采用servlet的Filter的來實現對webservice的安全訪問
   
    在調用webservice之前過濾器會攔截匹配的請求只有滿足安全要求的客戶端才能訪問webservice服務
   
項目環境
   
    system:win  myeclipse:  tomcat:
   
    JDK:開發環境編譯環境
   
    axis:

  

  示例代碼()配置文件
    webxml
    webxml
    <?xml version= encoding=UTF?>
    <webapp version=
   
    xmlns=
   
    xmlns:xsi=instance
   
    xsi:schemaLocation=
   
    app__xsd>
   
   
    <! 配置webservice的處理類 >
   
    <servlet>


   
    <servletname>AxisServlet</servletname>
   
    <servletclass>
   
    orgapacheaxistransporthttpAxisServlet
   
    </servletclass>
   
    </servlet>
   
    <servletmapping>
   
    <servletname>AxisServlet</servletname>
   
    <urlpattern>/services/*</urlpattern>
   
    </servletmapping>
   
   
    <!配置IP地址的過濾器 >
   
    <filter>
   
    <filtername>WebServiceFilter</filtername>
   
    <filterclass>serverfilterWebServiceFilter</filterclass>
   
    </filter>
   
    <filtermapping>
   
    <filtername>WebServiceFilter</filtername>
   
    <urlpattern>/services/*</urlpattern>
   
    </filtermapping>
   
    </webapp>
    serverconfigwsdd
    serverconfigwsdd
    <?xml version= encoding=UTF?>
    <deployment xmlns=
   
    xmlns:java=>
   
    <globalConfiguration>
   
    <parameter name=sendMultiRefs value=true />
   
    <parameter name=disablePrettyXML value=true />
   
    <parameter name=adminPassword value=admin />
   
    <parameter name=attachmentsDirectory
   
    value=D:\tomcat\webapps\WebService\WEBINF\attachments />
   
    <parameter name=dotNetSoapEncFix value=true />
   
    <parameter name=enableNamespacePrefixOptimization
   
    value=false />
   
    <parameter name=sendXMLDeclaration value=true />
   
    <parameter name=sendXsiTypes value=true />
   
    <parameter name=attachmentsimplementation
   
    value=orgapacheaxisattachmentsAttachmentsImpl />
   
    <requestFlow>
   
    <handler type=java:orgapacheaxishandlersJWSHandler>
   
    <parameter name=scope value=session />
   
    </handler>
   
    <handler type=java:orgapacheaxishandlersJWSHandler>
   
    <parameter name=scope value=request />
   
    <parameter name=extension value=jwr />
   
    </handler>
   
    </requestFlow>
   
    </globalConfiguration>
   
    <handler name=LocalResponder
   
    type=java:orgapacheaxistransportlocalLocalResponder />
   
    <handler name=URLMapper
   
    type=java:orgapacheaxishandlershttpURLMapper />
   
    <handler name=Authenticate
   
    type=java:orgapacheaxishandlersSimpleAuthenticationHandler />
   
    <service name=AdminService provider=java:MSG>
   
    <parameter name=allowedMethods value=AdminService />
   
    <parameter name=enableRemoteAdmin value=false />
   
    <parameter name=className value=orgapacheaxisutilsAdmin />
   
    <namespace>;/namespace>
   
    </service>
   
    <service name=Version provider=java:RPC>
   
    <parameter name=allowedMethods value=getVersion />
   
    <parameter name=className value=orgapacheaxisVersion />
   
    </service>
   
   
    <transport name=http>
   
    <requestFlow>
   
    <handler type=URLMapper />
   
    <handler
   
    type=java:orgapacheaxishandlershttpHTTPAuthHandler />
   
    </requestFlow>
   
    <parameter name=qs:list
   
    value=orgapacheaxistransporthttpQSListHandler />
   
    <parameter name=qs:wsdl
   
    value=orgapacheaxistransporthttpQSWSDLHandler />
   
    <parameter name=qslist
   
    value=orgapacheaxistransporthttpQSListHandler />
   
    <parameter name=thod
   
    value=orgapacheaxistransporthttpQSMethodHandler />
   
    <parameter name=qs:method
   
    value=orgapacheaxistransporthttpQSMethodHandler />
   
    <parameter name=qswsdl
   
    value=orgapacheaxistransporthttpQSWSDLHandler />
   
    </transport>
   
    <transport name=local>
   
    <responseFlow>
   
    <handler type=LocalResponder />
   
    </responseFlow>
   
    </transport>
   
   
   
    <! 配置自己的服務 >
   
    <service name=HelloService provider=java:RPC>
   
    <parameter name=allowedMethods value=* />
   
    <parameter name=className
   
    value=serverserviceHelloServiceImpl />
   
   
    </service>
   
    </deployment>
    ()服務端代碼
    HelloServiceImpljavawebservice服務端
    HelloServiceImpljava
    package serverservice; public class HelloServiceImpl {
    public String hello(String s) {
    return hello + s;
    } }
    WebServiceFilterjavaFilter過濾器
    WebServiceFilterjava
    package serverfilter;   import javaioIOException;   import javaxservletFilter; import javaxservletFilterChain; import javaxservletFilterConfig; import javaxservletServletException; import javaxservletServletRequest; import javaxservletServletResponse; import javaxservlethttpHttpServletRequest; public class WebServiceFilter implements Filter {
   
    //不允許訪問webservice服務的IP地址
    static final String[] deniedIPList=new String[]{};
   
    public boolean isIPDenied(String ipAddr){
    if(deniedIPListlength==
    return false;
    for(int i=;i<deniedIPListlength;i++){
    if(deniedIPList[i]equals(ipAddr)){
    return true;
    }
    }
    return false;
    }
    public void destroy() {
    }
    public void doFilter(ServletRequest req ServletResponse res
    FilterChain chain) throws IOException ServletException {
    HttpServletRequest request=(HttpServletRequest) req;
   
    String clientIP=requestgetRemoteHost()
    Systemoutprintln(客戶端IP:+clientIP)
   
    Systemoutprintln(開始過濾…
   
    if(isIPDenied(clientIP)){
    throw new ServletException(你沒有權限調用此webservice!
    }else{
    chaindoFilter(req res)
    }
    }
    public void init(FilterConfig arg) throws ServletException {
    } }
    ()客戶端代碼
    Testjava客戶端動態調用的代碼
    Testjava
    package client;
   
    import URL;
   
    import javaxxmlrpcParameterMode;
   
    import orgapacheaxisclientCall;
    import orgapacheaxisencodingXMLType;
   
    public class Test {
   
   
    public static void main(String args[]) throws Exception{
   
    webservice_user()
   
    }
   
    public static void webservice_user() throws Exception {
   
    // 創建service對象通過axis自帶的類創建
    orgapacheaxisclientService service = new orgapacheaxisclientService()
    // 創建url對象
    String wsdlUrl = //localhost:/WebService_Security/services/HelloService?wsdl;// 請求服務的URL
    URL url = new URL(wsdlUrl)// 通過URL類的構造方法傳入wsdlUrl地址創建URL對象
    // 創建服務方法的調用者對象call設置call對象的屬性
    Call call = (Call) servicecreateCall()
    callsetTargetEndpointAddress(url)// 給call對象設置請求的URL屬性
    String serviceName = hello;// webservice的方法名
    callsetOperationName(serviceName)// 給call對象設置調用方法名屬性
    calladdParameter(s XMLTypeXSD_STRING ParameterModeIN)// 給call對象設置方法的參數名參數類型參數模式
    callsetReturnType(XMLTypeSOAP_STRING)// 設置調用方法的返回值類型 //
    callsetTimeout(new Integer())//設置超時限制
   
    //
    //此處的用戶名和密碼對應WEBINF目錄下userslst文件中的用戶名和密碼 //
    callgetMessageContext()setUsername(pantp //
    callgetMessageContext()setPassword(
    //
   
    // 通過invoke方法調用webservice
    String str=new String(pantp
    Systemoutprintln(開始調用webservice服務……
    String dept = (String) callinvoke(new Object[] { str })// 調用服務方法
    Systemoutprintln(結束調用webservice服務……
    // 打印返回結果
    Systemoutprintln(返回結果如下+dept) } }
    安全測試()正常測試(本機IP地址不在受限IP之內)


    浏覽器中輸入wsdl地址測試











  

  運行Test客戶端測試

  客戶端日志

  

  服務端日志

  

    ()受限測試(本機IP地址在受限IP之內)
    修改WebServiceFilter類中deniedIPList數組所在的一行代碼加入IP地址然後重新發布項目
    修改後數組IP地址如下
    受限IP地址列表


    static final String[] deniedIPList=new String[]{};
    浏覽器中輸入wsdl地址測試

  

  運行Test客戶端測試

  客戶端日志

  

  服務端日志

  

    總結
    至此webservice的安全相關的文章就已經介紹完了
    以上都是webservice安全方面比較簡單的實現措施
    更多的歡迎各位的探討


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25712.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.