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

webservice的安全機制2---handler實現

2013-11-23 19:28:42  來源: Java核心技術 

  引言
   
    前一節介紹了使用userslst文件來實現webservice的用戶名和密碼的校驗
   
    本節介紹使用webservice的handler來實現webservice的安全校驗
   
    這裡不用用戶名和密碼來實現安全校驗換一種方式采用IP地址校驗的方式
   
    這裡通過一個配置文件來控制是否打開IP校驗開關以及允許哪些IP地址的客戶端可以訪問
   
    這裡的開發還是基於上一節HelloService這個基本的webservice基礎上來開發
   
項目環境
   
    system:win
   
    myeclipse: tomcat:  JDK:開發環境編譯環境
   
    axis:
   
項目結構圖如下

  

      示例代碼配置文件

  webxmlweb項目的配置文件和基本的webservice配置沒任何區別


      webxml

   <?xml version= encoding=UTF?>

   <webapp version=

   xmlns=

   xmlns:xsi=instance

   xsi:schemaLocation=

   app__xsd>

  

   <servlet>

   <servletname>AxisServlet</servletname>

   <servletclass>

   orgapacheaxistransporthttpAxisServlet

   </servletclass>

   </servlet>

   <servletmapping>

   <servletname>AxisServlet</servletname>

   <urlpattern>/services/*</urlpattern>

   </servletmapping>

  

   </webapp>

  serverconfigwsddaxis的配置文件這裡的配置就是一個webservice+handler的基本配置


   serverconfigwsdd

   <?xml version= encoding=UTF?> <deployment xmlns= xmlns:java=> <globalConfiguration> <parameter name=sendMultiRefs value=pan/archive////true /> <parameter name=disablePrettyXML value=pan/archive////true /> <parameter name=adminPassword value=pan/archive////admin /> <parameter name=attachmentsDirectory value=pan/archive////file://localhost/D:/tomcat/webapps/WebService/WEBINF/attachments /> <parameter name=dotNetSoapEncFix value=pan/archive////true /> <parameter name=enableNamespacePrefixOptimization value=pan/archive////false /> <parameter name=sendXMLDeclaration value=pan/archive////true /> <parameter name=sendXsiTypes value=pan/archive////true /> <parameter name=attachmentsimplementation value=pan/archive////orgapacheaxisattachmentsAttachmentsImpl /> <requestFlow> <handler type=java:orgapacheaxishandlersJWSHandler> <parameter name=scope value=pan/archive////session /> </handler> <handler type=java:orgapacheaxishandlersJWSHandler> <parameter name=scope value=pan/archive////request /> <parameter name=extension value=pan/archive////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=pan/archive////AdminService /> <parameter name=enableRemoteAdmin value=pan/archive////false /> <parameter name=className value=pan/archive////orgapacheaxisutilsAdmin /> <namespace>;/namespace> </service> <service name=Version provider=java:RPC> <parameter name=allowedMethods value=pan/archive////getVersion /> <parameter name=className value=pan/archive////orgapacheaxisVersion /> </service> <transport name=http> <requestFlow> <handler type=URLMapper /> <handler type=java:orgapacheaxishandlershttpHTTPAuthHandler /> </requestFlow> <parameter name=qs:list value=pan/archive////orgapacheaxistransporthttpQSListHandler /> <parameter name=qs:wsdl value=pan/archive////orgapacheaxistransporthttpQSWSDLHandler /> <parameter name=qslist value=pan/archive////orgapacheaxistransporthttpQSListHandler /> <parameter name=thod value=pan/archive////orgapacheaxistransporthttpQSMethodHandler /> <parameter name=qs:method value=pan/archive////orgapacheaxistransporthttpQSMethodHandler /> <parameter name=qswsdl value=pan/archive////orgapacheaxistransporthttpQSWSDLHandler /> </transport> <transport name=local> <responseFlow> <handler type=LocalResponder /> </responseFlow> </transport> <! 配置一個handler用來進行IP校驗> <handler name=IPHandler type=java:serverhandlerIpAuthentionHandler> <parameter name=status value=pan/archive////success /> </handler> <! 配置自己的服務 > <service name=HelloService provider=java:RPC> <parameter name=allowedMethods value=pan/archive////* /> <parameter name=className value=pan/archive////serverserviceHelloServiceImpl /> <! 引入IP校驗的handler > <requestFlow> <handler type=IPHandler /> </requestFlow> </service> </deployment>

服務端文件
   
    服務類
   
    HelloServiceImpljava
   
    HelloServiceImpljava
   
    package serverservice;   public class HelloServiceImpl {  
   
    public String hello(String s) {
   
    Systemoutprintln(我是服務端……
   
    Systemoutprintln(方法的入參為+s)
   
    return hello + s;
   
    } }
   
    handler處理類和配置文件
   
    IpAuthentionHandlerjava
   
    IpAuthentionHandlerjava
   
    package serverhandler;   import javaioIOException; import javaioInputStream; import javautilProperties; import javautilregexPattern;   import javaxservlethttpHttpServletRequest; import orgapacheaxisAxisFault; import orgapacheaxisMessageContext; import orgapacheaxishandlersBasicHandler; import orgapacheaxistransporthttpHTTPConstants; import orgapacheaxisutilsMessages; //利用handler進行客戶端IP校驗 public class IpAuthentionHandler extends BasicHandler {
   
    private static final long serialVersionUID = L;
   
   
   
    private static Properties p = new Properties()
   
    static {
   
    InputStream in = null;
   
    try {
   
    //注意這裡的文件的存放位置和文件路徑的書寫方式 path 不以/開頭時默認是從此類所在的包下取資源
   
    //這裡如果我們把ipproperties放在src根目錄下然後采用src/ipproperties的形式是沒法取到此文件的
   
    //此時需要使用
   
    in=IpAuthentionHandlerclassgetClassLoader()getResourceAsStream(ipproperties
   
    in = IpAuthentionHandlerclassgetResourceAsStream(ipproperties
   
   
   
    pload(in)
   
    } catch (IOException e) {
   
    Systemoutprintln(ipproperties配置文件加載失敗!
   
    eprintStackTrace()
   
    } finally {
   
    if (null != in)
   
    try {
   
    inclose()
   
    } catch (IOException e) {
   
    Systemoutprintln(關閉流操作發生異常!
   
    eprintStackTrace()
   
    }
   
    }
   
    }
   
    public void invoke(MessageContext messageContext) throws AxisFault {
   
    String status=(String)thisgetOption(status
   
    Systemoutprintln(IpAuthentionHandlers  status is :+status)
   
    String uri = messageContextgetSOAPActionURI()
   
    String targetService = messageContextgetTargetService()
   
    Systemoutprintln(webservice開始IP認證service》 + uri + /+ targetService)
   
    String name = HTTPConstantsMC_HTTP_SERVLETREQUEST;
   
    HttpServletRequest request = (HttpServletRequest) messageContext
   
    getProperty(name)
   
    String remoteAddr = requestgetRemoteAddr()
   
    Systemoutprintln(客戶端IP: + remoteAddr)
   
    String switcher = pgetProperty(ip_switcher
   
    Systemoutprintln(IP校驗開關 + switcher)
   
    if (onequalsIgnoreCase(switcher)) {
   
    Systemoutprintln(服務端IP校驗開關處於【打開】狀態需要校驗IP
   
    String regx = pgetProperty(ip_allow
   
    Systemoutprintln(允許調用服務的IP地址有 + regx)
   
    if (null != regx && regxlength() > ) {
   
    String regxArray[] = regxsplit(
   
    boolean ip_check = false;
   
    for (int i = ; i < regxArraylength; i++) {
   
    Pattern p = pile(regxArray[i])
   
    boolean flag = pmatcher(remoteAddr)find()
   
    if (flag) {
   
    ip_check = true;
   
    break;
   
    }
   
    }
   
    if (ip_check) {
   
    Systemoutprintln(IP校驗通過!
   
    } else {
   
    throw new AxisFault(MessagesgetMessage(wrong ip:+remoteAddr)nullnull)
   
    }
   
    } else {
   
    Systemoutprintln(請指定校驗的客戶端IP!
   
    throw new AxisFault()
   
    }
   
    } else if (offequalsIgnoreCase(switcher)) {
   
    Systemoutprintln(服務端IP校驗開關處於【關閉】狀態不需要校驗IP
   
    }
   
    }
   
    }
   
    ipproperties
   
    ipproperties
   
    ##################################IP校驗配置################################## #IP校驗開關 只能填寫on或者off不區分大小寫 ip_switcher=on #允許調用對應的webservice服務的客戶端IP地址 多個IP地址之間用逗號隔開 #當ip校驗開關打開的時候必須配置IP地址 ip_allow= ##################################IP校驗配置##################################


   
    客戶端文件
   
    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())//設置超時限制
   
    // 通過invoke方法調用webservice
   
    String str = new String(pantp
   
    String dept = (String) callinvoke(new Object[] { str })// 調用服務方法
   
    // 打印返回結果
   
    Systemoutprintln(我是客戶端……
   
    Systemoutprintln(dept)
   
    } }
   
    驗證結果
   
    發布工程啟動tomcat服務器
   
    看webservice在浏覽器中是否可以正常顯示
   
    在浏覽器中輸入wsdl地址
   
   //localhost:/WebService_Security/services/HelloService?wsdl







  

  運行webservice客戶端看是否可以正常的訪問
   
    目前IP配置文件中開關是打開的並且是允許訪問此webservice服務的
   
    運行後客戶端和服務端日志分別如下

  

  

  模擬不能正常訪問的IP地址的調用情況
   
    把ipproperties文件中的
   
    ip_allow=
   
    改為
   
    ip_allow=
   
    然後重新發布項目啟動tomcat:
   
    此時客戶端和服務端的日志如下(此時需要時間稍微長一點客戶端才會出現以下異常)

  

  


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26935.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.