技术标签: spring xfire web java web soap
Xfire +SoapUi + Webservices开发
最近在开发xfrie的webservice的项目,以前做过,但是没有单独的去用xfire开发,cxf之类的确实方便,但是项目中会增加很多的jar包,考虑再三自己放弃了,决定用xfire开发,也不写什么客户端的代码,直接就是soapui eclipse的插件调试,要实现接口调用是有权限验证的,没有key不能调用,统计调用次数,等等.遇到了一些问题,参考了一些资料,但是真正的去用时,发现就一两个是原创的,其余都是copy留念的,问题出现了得解决啊,不废话了,这次就来个参考加一些实际解决遇到的问题的 留念.
1.Xfire web servlet 开发
1.加入文件 META-INF\xfire\services.xml
<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>myService</name>
<namespace>http://XFireServer/myService</namespace>
<serviceClass>xx.IMyService</serviceClass>
<implementationClass>xx.MyService</implementationClass>
<!-- 加入验证auth-->
<inHandlers>
<handler handlerClass ="xx.xx.AuthenticationHandler"></handler >
</inHandlers>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>
</beans>
2.开发接口和实现类
publicinterface IMyService {
public String getString(String a);
}
实现类:
publicclass MyService implements IMyService {
publicString getString(String a) {
//System.out.println(commonDao== null);
//List<SysMenu>list = commonDao.findMenus();
returna;
}
privateCommonDao commonDao;
publicvoid setCommonDao(CommonDao commonDao) {
this.commonDao= commonDao;
}
}
3.权限验证类:
public class AuthenticationHandler extendsAbstractHandler {
publicvoid invoke(MessageContext cfx) throws Exception {
if(cfx.getInMessage().getHeader() == null) {
thrownew org.codehaus.xfire.fault.XFireFault("请求必须包含验证信息",
org.codehaus.xfire.fault.XFireFault.SENDER);
}
Elementtoken =cfx.getInMessage().getHeader().getChild("AuthenticationToken");
if(token == null) {
thrownew org.codehaus.xfire.fault.XFireFault("请求必须包含身份验证信息",
org.codehaus.xfire.fault.XFireFault.SENDER);
}
Stringusername = token.getChild("Username").getValue();
Stringpassword = token.getChild("Password").getValue();
try{
//进行身份验证,只有ryan@1234的用户为授权用户
if(username.equals("ryan") &&password.equals("1234")) {
System.out.println("身份验证通过");
}else {
thrownew Exception();
}
}catch (Exception e) {
thrownew org.codehaus.xfire.fault.XFireFault("非法的用户名和密码",
org.codehaus.xfire.fault.XFireFault.SENDER);
}
}
}
4.web.xml配置:
<!-- XFire webService 相关开始 -->
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.
XFireConfigurableServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<!-- XFire webService 相关结束 -->
5.soapUi测试接口信息:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:web="http://webservice.crm.com">
<soapenv:Header/>
<soapenv:Body>
<web:getString>
<web:in0>223142</web:in0>
</web:getString>
</soapenv:Body>
</soapenv:Envelope>
用soapUi自动提供的request发现总是验证不能过,因为你都灭有在soapenv中加验证信息,所以加入
<soapenv:Header>
<AuthenticationToken>
<Username>ryan</Username>
<Password>1234</Password>
</AuthenticationToken>
</soapenv:Header>
验证返回结果:
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<ns1:getStringResponsexmlns:ns1="http://webservice.crm.com">
<ns1:out>223142</ns1:out>
</ns1:getStringResponse>
</soap:Body>
</soap:Envelope>
结果ok 没有问题
但是到这里大家总以为都开发ok,其实你开发这个东西如果提供出去的时候还是不能起作用,你会发现如果打开实现类那边的注释,commonDao的调用始终是不成功的,为什么的?如果你用了spring的配置注入或者扫描注入都是不会成功,这完全是两种不同的模式开发,如果不用spring 那就在实现类中把调用数据库等等相关的东西都初始化在你调用的时候,连接访问数据库ok,返回结果ok,如果你确实是这样的功能,那下面的不用看了。
二.xfire spring 结合注入services实现功能需求
1.这个时候 META-INF\xfire\services.xml这个文件删除就可以了,用不了了,加另一个在classpath下面:xfire-servlet.xml 名字随便:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC"-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--START SNIPPET: xfire -->
<importresource="classpath:org/codehaus/xfire/spring/xfire.xml" />
<beanid="myServiceImp" class="xx.MyService">
<property name="commonDao"ref="commonDao" />
</bean>
<beanid="sso"class="org.codehaus.xfire.spring.remoting.XFireExporter">
<propertyname="serviceFactory">
<refbean="xfire.serviceFactory" />
</property>
<propertyname="xfire">
<refbean="xfire" />
</property>
<propertyname="serviceBean">
<refbean="myServiceImp" />
</property>
<propertyname="serviceClass">
<value>xx.IMyService</value>
</property>
</bean>
<!--END SNIPPET: xfire -->
</beans>
2.修改web.xml中的信息:
记得把xfire-servelet.xml加入<context-param>
<!--XFire webService 相关开始 -->
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<!-- XFire webService 相关结束 -->
3.直接测试:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.crm.com">
<soapenv:Body>
<web:getString>
<web:in0>223142</web:in0>
</web:getString>
</soapenv:Body>
</soapenv:Envelope>
结果返回ok:
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<ns1:getStringResponse xmlns:ns1="http://webservice.crm.com">
<ns1:out>223142</ns1:out>
</ns1:getStringResponse>
</soap:Body>
</soap:Envelope>
疑问又出来了,那我写的那个auth的验证的怎么没有加进去,怎么加验证呢?
其实这个时候配置下马上ok:
<propertyname="inHandlers">
<!--加webService验证信息 -->
<list>
<beanclass="com.crm.webservice.auth.AuthenticationHandler" />
</list>
</property>
把这个信息加入到xfire-servlet.xml sso节点中,重启服务发现之前写的soapenv调用提示需要验证信息,加吧,把之前那个直接拿过来:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:web="http://webservice.crm.com">
<soapenv:Header>
<AuthenticationToken>
<Username>ryan</Username>
<Password>1234</Password>
</AuthenticationToken>
</soapenv:Header>
<soapenv:Body>
<web:getString>
<web:in0>223142</web:in0>
</web:getString>
</soapenv:Body>
</soapenv:Envelope>
测试ok了,commonDao可以访问后台数据库了,直接对外提供接口,要什么调用什么dao,ok了,项目开发结束。
这个文章中麻烦的两点就是给header中加验证信息,这个格式是可以自定义的,我在这里卡了一个下午,
后续就是spring的信息注入不进来,发现servelt的类是不同的,两种方式,其他的就是1个小时可以搞定。
文章浏览阅读1.3k次。合适的工作难找?最新的招聘信息也不知道?AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职!上海财经大学上海财经大学是教育部直属的一所以经管为主,法、文、理协..._上海财经大学语言智能实验室
文章浏览阅读4.1k次。根据端口查进程:lsof -i:portnetstat -nap | grep port根据进程号查端口:lsof -i|grep pidnetstat -nap | grep pid根据进程名查找pid、port:ps -ef |grep tomcatps -ef |grep port(根据port查找相关进程)ps -ef |grep pid(根据pid查找相关进程)查看防..._进程名称如何反查端口号
文章浏览阅读2.6w次,点赞11次,收藏29次。联想WIN10默认设置了【快速启动】,导致笔记本无法F12按进BIOS开启intelvt-x。解决办法:按住shift ,同时windows选择重启出现界面选择:疑难解答高级选项UEFI 固件设置重启,自动进入BISO界面Configuration-----Intel VirtualTechnology Disabled 改为 EnabledExit 保存修改退出..._inter vtx
文章浏览阅读3.6k次。Precondition:hadoop 2.7.1hbase 0.98.13solr 5.2.1 / Apache Solr 4.8.1http://archive.apache.org/dist/lucene/solr/4.8.1/gora 0.6.1gora编译和Nutch编译部署1. Gora下载最新版本呢gora是0.6.1,下载或者直接通过_hbase_client_prefetch_limit
文章浏览阅读361次。来源:AI科技评论编辑 | Camel四大边界:数据边界、语义边界、符号边界和因果边界当前,深度学习之于自然语言处理,有其局限性。那么它所能起作用的边界在哪里呢?对此..._基于word自然语言处理 基于character自然语言处理
文章浏览阅读290次。学习下 linux 数模程序驱动的编写,本节我们实现的功能是实现三路ADC 数模转换。驱动程序驱动程序的名字:“itop4412_adc.c”。要想把这个驱动注册到内核,先把这个驱动程序放到内核的“driver/char”目录下面,如下图所示: Makefile然后打开 drive/char 目录下面的 Makefile,添加:obj-$(CONFIG_ADC_CTL) += itop4412_a..._linux adc转换程序流程图
文章浏览阅读1k次。这篇博客将给大家带来一系列技术性的东西,大家看好了哦,本篇给大家说点什么呢-amp,这个东西是谷歌搞出的针对移动优化的,和百度mip是一样的东西,关于哪家的好呢,这个还真不好评说,海豚的建议是amp和mip都做一个,哈哈。什么是移动加速器在制作amp之前,需要关注下它的发展背景,起初在网络还不是很发达的2000年初,移动业务却迅猛发展,大家还记得曾经抱着手机偷菜吗?一个月30M流量也能在..._amp制作
文章浏览阅读293次。下面我为各位汇友们带来重点推广更新升级版【极限反转】本策略是我们公司独立研发的,因为这款EA很是不错最近网上出现了很多的盗版,现在新版经过了四层加密,请广大汇友认准正版。前期因为英国脱欧,加载的镑系货币过多,出现了较大的回撤,经过这20天的潜心研究,反复的测试,有效的控制了风险,更新的版本已经完成。长期的观摩账户199000941在前期出现了回撤,使用更新版本后该账户稳定盈利,该账户只对购买过的客户开放。正版极限反转面板:更新版极限反转参数面板:..._极限反转1.51版
文章浏览阅读1.3k次。封装,继承,多态,抽象_java四大基本特性
文章浏览阅读171次。一.停止基于线程的服务1.一般的应用程序中会创建多个线程的服务,例如线程池,我们创建一个线程池的服务时,它会又创建多个线程,如果我们不关闭服务,它会一直存在,所以服务的生命周期通常比创建它们的方法的生命周期更长。如果应用程序准备退出,应用程序会关闭服务,服务又会关闭它拥有的线程。由于无法通过抢占式的方法来停止线程,所以它们需要自行关闭。2.我们对线程的封装原则是:除非拥有某个线程,否则不能对该线程进行操控。线程有一个相应的所有者(创建它的类),因此线程池是其他工作者线程的所有者,如果要中断这些线程,那么_producerexec.awaittermination
文章浏览阅读1.7k次。使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越实在太久远,兼容性依然是避不开的问题..._wpf程序使用microsoft.ui.xaml
文章浏览阅读896次。解密20位md5,20位md5加密算法。 dedecms的20位md5加密算噶是从32位md5中截取的20位,所以去掉前3位喝最后1位,即可获得16位md5值,即可破解15位md5。 例如:数据库的密文是f297a57a5a743894a0e4 得到20位MD5密码,前减3后,再去掉最后1位,得到16位MD5,这样就获得7a57a5a743894a0e 如果密文不能_20位加密串 怎么计算