国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

xfire集成spring構(gòu)建webservice

2019-11-14 22:17:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
xfire集成sPRing構(gòu)建webservice

前言:xfire、spring都是比較流行的技術(shù),這里就不再贅述他們各自的優(yōu)點(diǎn);本文著重介紹xfire和spring的整合,不會(huì)做太深入的探究。

服務(wù)端

1. web.xml配置

spring配置部分:contextConfigLocation定義配置文件路徑,可以指定全局的配置文件路徑。

<!-- spring配置 -->    <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>           /WEB-INF/xfire-servlet.xml      </param-value>    </context-param>    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>    <!-- spring配置 -->

XFire配置部分:xfire配置1使用spring的DispatcherServlet類(lèi)來(lái)作為xfire的處理類(lèi),DispatcherServlet的配置文件名默認(rèn)為[servletname]-servlet,位于WEB-INF目錄下,也可以通過(guò)namespace參數(shù)來(lái)指定或者通過(guò)contextConfigLocation參數(shù)自定義配置文檔的位置;這種配置方式只能通過(guò)服務(wù)名.ws的方式訪問(wèn),方便隱藏其它的服務(wù)接口;xfire配置2使用xfire的XFireSpringServlet類(lèi)來(lái)作為xfire的處理類(lèi),這種配置方式可以直接通過(guò)接口名訪問(wèn),也可以訪問(wèn)所有的服務(wù)接口。

<!-- XFire 配置 1 使用spring的DispatcherServlet作為xfire的處理類(lèi),好處是可以自定義服務(wù)的名稱(chēng)并隱藏所有提供的其它接口,客戶(hù)端只能通過(guò)服務(wù)名.ws的方式訪問(wèn)-->    <servlet>        <!-- 配合Spring容器中XFire一起工作的Servlet -->        <servlet-name>xfireServlet</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <init-param>            <!-- WebapplicationContext命名空間,默認(rèn)值是[servlet-name]-servlet,對(duì)應(yīng)DispatcherServlet的定義檔名稱(chēng),位于                 /WEB-INF下,也可以通過(guò)contextConfigLocation參數(shù)自定義位置 -->            <param-name>namespace</param-name>            <param-value>xfire-servlet</param-value>        </init-param>                <!-- 通過(guò)contextConfigLocation參數(shù)自定義位置        <init-param>            <param-name>contextConfigLocation</param-name>            <param-value>                   /WEB-INF/xfire-servlet.xml              </param-value>        </init-param>-->            </servlet>    <servlet-mapping>        <servlet-name>xfireServlet</servlet-name>        <!-- 在這個(gè)URI下開(kāi)放Web Service服務(wù) -->        <url-pattern>*.ws</url-pattern>    </servlet-mapping>    <!-- XFire 配置1 -->        <!-- XFire 配置2 使用xfire的XFireSpringServlet作為xfire的處理類(lèi),可以直接使用接口類(lèi)名來(lái)訪問(wèn)開(kāi)放的服務(wù),也可以查看所有開(kāi)發(fā)的服務(wù)接口 -->    <servlet>        <!-- 配合Spring容器中XFire一起工作的Servlet -->        <servlet-name>xfireServlet2</servlet-name>        <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>xfireServlet2</servlet-name>        <!-- 在這個(gè)URI下開(kāi)放Web Service服務(wù) -->        <url-pattern>/service/*</url-pattern>    </servlet-mapping>    <!-- XFire 配置2 -->

2.xfire-servlet配置

首先需要引入xfire.xml的配置;第二部分用來(lái)定義訪問(wèn)的服務(wù)名,若使用XFireSpringServlet作為servlet時(shí)無(wú)需此配置,直接通過(guò)接口名訪問(wèn);第三部分我們通過(guò)XFireExporter將業(yè)務(wù)類(lèi)導(dǎo)出為Web Service,對(duì)于任何導(dǎo)出器,我們都需要引入XFire環(huán)境,即serviceFactory和xfire,這是標(biāo)準(zhǔn)的配置。ServiceFactory是XFire的核心類(lèi),它可以將一個(gè)POJO生成為一個(gè)Web Service。在本實(shí)例中,我們通過(guò)定義一個(gè)baseWebService,其余的webService配置都將該bean作為父bean,這樣可以簡(jiǎn)化Spring的配置,不需要多次引入serviceFactory和xfire,這其中的inHandlers參數(shù)用來(lái)定義xfire的SOAP的截取處理類(lèi),可以添加多個(gè),用來(lái)完成一些安全驗(yàn)證等功能;最后一部分用來(lái)定義業(yè)務(wù)接口,他們都需要將baseWebService作為父bean。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>    <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />    <!-- 定義訪問(wèn)的url 使用XFireSpringServlet作為servlet時(shí)無(wú)需此配置 -->    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">        <property name="urlMap">            <map>                            <entry key="/helloworld.ws">                    <ref bean="HelloWorldService" />                </entry>                            </map>        </property>    </bean>    <!-- 使用XFire導(dǎo)出器 我們通過(guò)XFireExporter將業(yè)務(wù)類(lèi)導(dǎo)出為Web Service,對(duì)于任何導(dǎo)出器,        我們都需要引入XFire環(huán)境,即serviceFactory和xfire,這是標(biāo)準(zhǔn)的配置。ServiceFactory是        XFire的核心類(lèi),它可以將一個(gè)POJO生成為一個(gè)Web Service。在本實(shí)例中,我們通過(guò)定義一個(gè)        baseWebService,其余的webService配置都將該bean作為父bean,這樣可以簡(jiǎn)化Spring的配置,        不需要多次引入serviceFactory和xfire。-->    <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter"        lazy-init="false" abstract="true">        <!-- 引用xfire.xml中定義的工廠 -->        <property name="serviceFactory" ref="xfire.serviceFactory" />        <!-- 引用xfire.xml中的xfire實(shí)例 -->        <property name="xfire" ref="xfire" />        <!-- 安全驗(yàn)證 -->        <property name="inHandlers" ref="AuthenticationHandler"></property>    </bean>    <!-- 安全認(rèn)證 -->    <bean id="AuthenticationHandler" class="com.AuthenticationHandler"></bean>    <bean id="HelloWorldServiceImpl" class="com.impl.HelloWorldServiceImp" />    <bean id="HelloWorldService" parent="baseWebService">        <!-- 業(yè)務(wù)服務(wù)bean -->        <property name="serviceBean" ref="HelloWorldServiceImpl" />        <!-- 業(yè)務(wù)服務(wù)bean的窄接口類(lèi) -->        <property name="serviceClass" value="com.HelloWorldService" />    </bean></beans>

3.AuthenticationHandler安全驗(yàn)證類(lèi)

webservice是一種開(kāi)放的服務(wù)的,但有時(shí)候我們需要控制用戶(hù)的訪問(wèn),這里我們采用handler的方式來(lái)截取訪問(wèn)的SOAP報(bào)文來(lái)判斷其中是否包含驗(yàn)證信息,這樣就可以完成一個(gè)簡(jiǎn)單的安全校驗(yàn);繼承AbstractHandler類(lèi)實(shí)現(xiàn)invoke方法,通過(guò)MessageContext獲取請(qǐng)求的報(bào)文信息頭中是否包含我們需要的用戶(hù)名、密碼等驗(yàn)證信息,相應(yīng)的我們就需要就客戶(hù)端調(diào)用時(shí)放入這些信息,客戶(hù)端驗(yàn)證類(lèi)ClientPassWordHandler我們?cè)谙旅娴目蛻?hù)端部分介紹。

public class AuthenticationHandler extends AbstractHandler {    public void invoke(MessageContext cfx) throws Exception {        if (cfx.getInMessage().getHeader() == null) {// 是否有驗(yàn)證信息            throw new org.codehaus.xfire.fault.XFireFault("請(qǐng)求必須包含驗(yàn)證信息",                    org.codehaus.xfire.fault.XFireFault.SENDER);        }        Element token = cfx.getInMessage().getHeader()                .getChild("AuthenticationToken");// AuthenticationToken為自定義元素值        if (token == null) {            throw new org.codehaus.xfire.fault.XFireFault("請(qǐng)求必須包含身份驗(yàn)證信息",                    org.codehaus.xfire.fault.XFireFault.SENDER);        }        String username = token.getChild("Username").getValue();        String password = token.getChild("Password").getValue();        try {            // 進(jìn)行身份驗(yàn)證 ,只有test@test的用戶(hù)為授權(quán)用戶(hù)            if (username.equals("test") && password.equals("test"))                System.out.println("身份驗(yàn)證通過(guò)");            else                throw new Exception();        } catch (Exception e) {            throw new org.codehaus.xfire.fault.XFireFault("非法的用戶(hù)名和密碼",                    org.codehaus.xfire.fault.XFireFault.SENDER);        }    }}

4、完整這些配置和接口的類(lèi)的開(kāi)發(fā)后服務(wù)端的工作就完成了,在tomcat中運(yùn)行這個(gè)demo,在瀏覽器中輸入對(duì)應(yīng)的url當(dāng)出現(xiàn)“Invalid SOAP request.”字樣是表示接口可以正常訪問(wèn)了,在url后添加?wsdl可以獲得更詳細(xì)的接口信息,如下圖:

image image image

客戶(hù)端

1.ClientPasswordHandler安全驗(yàn)證類(lèi)

客戶(hù)端安全驗(yàn)證類(lèi)也要繼承AbstractHandler類(lèi)實(shí)現(xiàn)invoke方法,以Element的方式構(gòu)建驗(yàn)證信息添加到SOAP的報(bào)文頭信息中,然后添加這個(gè)類(lèi)到客戶(hù)端訪問(wèn)的服務(wù)接口的請(qǐng)求中,就會(huì)在被服務(wù)端的AuthenticationHandler類(lèi)截獲完成安全驗(yàn)證。

public class ClientPasswordHandler extends AbstractHandler {    private String username = null;    private String password = null;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public ClientPasswordHandler(String username, String password) {        this.username = username;        this.password = password;    }    public void invoke(MessageContext context) throws Exception {        // 為SOAP Header構(gòu)造驗(yàn)證信息        Element el = new Element("header");//標(biāo)頭        context.getOutMessage().setHeader(el);        Element auth = new Element("AuthenticationToken");//自定義元素        Element username_el = new Element("Username");        username_el.addContent(username);        Element password_el = new Element("Password");        password_el.addContent(password);        auth.addContent(username_el);        auth.addContent(password_el);        el.addContent(auth);    }}

2、訪問(wèn)服務(wù)端接口類(lèi)

GetServiceBean類(lèi)用來(lái)獲取服務(wù)端接口對(duì)象,添加客戶(hù)端驗(yàn)證類(lèi);ClientTest通過(guò)調(diào)用GetServiceBean獲取服務(wù)端接口對(duì)象,然后就可以像使用本地類(lèi)一樣調(diào)用其中的方法了(如下圖),這里一個(gè)顯而易見(jiàn)的要求就是客戶(hù)端要保留服務(wù)端的接口類(lèi)、對(duì)象類(lèi)才能完成調(diào)用。

public class GetServiceBean {    private static XFireProxyFactory factory = new XFireProxyFactory();    public static Object getBean(String serviceUrl, Class<?> serviceClass)            throws MalformedURLException {        Service service = new ObjectServiceFactory().create(serviceClass);        Object object = factory.create(service, serviceUrl);        Client client = ((XFireProxy) Proxy.getInvocationHandler(object))                .getClient(); // 獲取訪問(wèn)服務(wù)的客戶(hù)端        client.addOutHandler(new ClientPasswordHandler("test", "test"));// 添加客戶(hù)端驗(yàn)證類(lèi)       return object;    }}
public class ClientTest {    public static void main(String[] args) throws Exception {        HelloWorldService service = (HelloWorldService) GetServiceBean.getBean(                "http://localhost/xfireserver/helloworld.ws",                HelloWorldService.class);        System.out.println(service.hello("小明"));        Person person = new Person();        person = service.getPerson();        System.out                .println("id:" + person.getId() + " name:" + person.getName());        List<Person> students = new ArrayList<Person>();        students = service.getList();        for (int i = 0; i < students.size(); i++) {            Person per = students.get(i);            System.out.println("id:" + per.getId() + " name:" + per.getName());        }    }}

image

結(jié)語(yǔ):個(gè)人理解會(huì)有偏駁和不對(duì)的地方,歡迎大家批評(píng)指正!

demo下載地址:http://pan.baidu.com/s/1eQxRjeM


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 滕州市| 酉阳| 娱乐| 萨迦县| 平邑县| 兴海县| 固原市| 临西县| 赣榆县| 华阴市| 龙山县| 松阳县| 富锦市| 西藏| 资中县| 海城市| 公主岭市| 姜堰市| 改则县| 罗山县| 昌平区| 田阳县| 兰西县| 北安市| 海原县| 孙吴县| 长葛市| 东至县| 楚雄市| 皮山县| 柳林县| 九江市| 准格尔旗| 庄河市| 米林县| 乌拉特后旗| 清涧县| 新乡县| 容城县| 达孜县| 怀远县|