Axis2主要是用来做webservice的,在和springmvc合成的过程分一下几部,
1、要下载,解压缩后会产生一个axis2.war。
2、将axis2.war 放到tomcat中启动tomcat的webapps中,启动tomcat,这时tomcat会解压axis2.war
3、将axis2下的axis2-web拷贝到项目的WebContent中,然后将axis2-->WEB-INF-->conf,lib,modules拷贝到项目的 WEB-INF下
4、在WEB-INF下创建services/xxxx/META-INF/services.xml
tomcat目录 | 项目中的结构 |
| |
services.xml中相关内容
<?xmlversion="1.0"encoding="UTF-8"?>
<serviceGroup>
<servicename="checkService">
<description>Web Service</description>
<!-- 通过ServiceObjectSupplier参数指定SpringServletContextObjectSupplier类来获得Spring的ApplicationContext对象 -->
<parametername="ServiceObjectSupplier"locked="false">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter>
<!-- SpringBeanName固定的不能改,关联spring中注入的bean的id -->
<parametername="SpringBeanName">checkLabelServiceImpl</parameter>
<!--
在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。
例如,getGreeting方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,
而update方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。
-->
<messageReceivers>
<messageReceivermep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
<messageReceivermep="http://www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
</messageReceivers>
<!-- 定义webservice接口的命名空间 -->
<schemaschemaNamespace="http://service.checkservice.cn"/>
</service>
</serviceGroup>
|
同时必须在springmvc的配置文件中添加如下一句话,否则就会报错,切记这里必须加入到springmvc的配置文件中,而不能加入到spring的配置文件中
web.xml中相关的axis2的配置
服务端
服务的相关接口 |
public interface ICheckLabelService {
//测试webservice的连通性方法
publicString checkLabeltest(String abc);
//查询标签信息(先不做消费更新操作)
public String checkLabel(String labelid,String consCode);
}
|
服务接口的实现类 |
packageorg.jymf.webservice.impl;
importjava.math.BigDecimal;
importjavax.annotation.Resource;
importorg.jymf.entity.Comment;
importorg.jymf.entity.Depict;
importorg.jymf.entity.LabelIndex;
importorg.jymf.entity.LabelInfo;
importorg.jymf.service.ICommentService;
importorg.jymf.service.ICordycepsLogisService;
importorg.jymf.service.ILabelInfoService;
importorg.jymf.utils.AddressUtils;
importorg.jymf.utils.Constants;
importorg.jymf.utils.JsonUtil;
importorg.jymf.webservice.ICheckLabelService;
importorg.jymf.webservice.LoginCheck;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importcom.jymf.common.LableUtil;
/**
*webservice的接口服务
*@authorfjk
*/
@Component("checkLabelServiceImpl")
publicclass CheckLabelServiceImpl implementsICheckLabelService{
publicString checkLabeltest(String name){
return "hello "+name;
}
@Autowired
privateILabelInfoService labelInfoService;
@Autowired
privateICommentService commentService;
@Resource
privateICordycepsLogisService cordycepsLogisService;
public String checkLabel(String labelid,String consCode){
//用户查询的用户名/密码是否正确
if(!LoginCheck.checkUserPwd()){
return"{'errorMsg':'用户查询用户名或密码错误'}";
}
System.out.println(LoginCheck.getClientIp());
if(!labelIdChk(labelid)){
// 追溯码错误
return"{'errorMsg':'标签id错误'}";
}
// 16 位追溯码 = 12 顺序码 + 4 位验证码
if(!consIdChk(labelid+consCode)){
return"{'errorMsg':'标签id或验证码错误'}";
}
StringaddressCode = AddressUtils.getAddressByIp(LoginCheck.getClientIp());
BooleanisCons=true;
StringlabelId = labelid.substring(0,labelid.length()-4);
LabelIndexlabelIndex = null;
if(labelid.length()==22) {
labelIndex= labelInfoService.getZYLabelIndex(labelId);
}else{
labelIndex= labelInfoService.getLabelIndex(Long.parseLong(labelId));
}
if(null== labelIndex){
return"{'errorMsg':{'labelindex':'标签段未注册'}}";
}
LabelInfolabelInfo = labelInfoService.getLableinfo(labelId,isCons,labelIndex,addressCode,newBigDecimal(labelIndex.getWorkMode()));
// 获取产品基本信息
if(null== labelInfo){
return"error";
}
Depictdepict = labelInfo.getLabelIndex().getDepict();
if(null!= depict){
Stringdepicts = depict.getDepicts();
if(null!=depicts&& !depicts.equals("")){
depict.setDepicts(paragrap(depicts));
}
}
if(null!=labelInfo.getDescription() && !labelInfo.getDescription().equals("")){
labelInfo.setDescription(paragrap(labelInfo.getDescription()));
}
if(labelIndex.getWorkMode()==Constants.WM_QP){
Commentcmt = commentService.queryComtById(labelid);
if(cmt!=null){
labelInfo.setComment(cmt);
}
}
returnJsonUtil.toJson(labelInfo);
}
/**
* 追溯码check
*@param labelId
*@return
*/
privatebooleanlabelIdChk(String labelId){
returnLableUtil.checkLabel16(labelId).equals("0");
}
/**
* 16 + 4位追溯码,验证
*@param id 20位码
*@return
*/
privatebooleanconsIdChk(String id){
returnLableUtil.checkLabel20(id).equals("0");
}
/**
* 将输入字符串转换成段落格式
*@param strs
*@return
*/
privateString paragrap(String strs) {
String[]lines = strs.split("\r\n");
StringBuilderstrDepicts = newStringBuilder();
for(Stringline : lines){
strDepicts.append(String.format("<p>%s</p>\r\n",line.replace(" "," ").trim()));
}
return strDepicts.toString();
}
}
|
服务端登录加密 |
public class LoginCheck {
/**
* 用户查询登录校验
*@throwsAxisFault
*/
publicstatic boolean checkUserPwd(){
//获取消息上下文
MessageContextmsgContext = MessageContext.getCurrentMessageContext();
// 获取Head
Iterator list= (Iterator) msgContext.getEnvelope().getHeader().getFirstElement().getChildren();
StringUsername = "";
StringPassword = "";
while (list.hasNext()){
OMElementelement = (OMElement) list.next();
if (element.getLocalName().equals("Username")) {
Username = element.getText();
}
if (element.getLocalName().equals("Password")) {
Password = element.getText();
}
}
//校验用户名及密码是否正确
if (!Username.equals("admin") || !Password.equals("password")) {
returnfalse;
}else{
returntrue;
}
}
/**
* 获取客户端ip
*@return
*/
public static String getClientIp() {
MessageContextmc = MessageContext.getCurrentMessageContext();
HttpServletRequestrequest = (HttpServletRequest) mc.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
System.out.println("remote ip: " + request.getRemoteAddr());
return request.getRemoteAddr();
}
}
|
客户端
客户端接口及客户端加密 |
public class WebClient {
publicstatic void main(String[]args) {
testRPCClient();
}
publicstatic void testRPCClient() {
try {
// axis2 服务端
Stringurl = "http://ip:port/project/services/checkService?wsdl";
// 使用RPC方式调用WebService
RPCServiceClientserviceClient = newRPCServiceClient();
// 指定调用WebService的URL
EndpointReferencetargetEPR = newEndpointReference(url);
Optionsoptions = serviceClient.getOptions();
//确定目标服务地址
options.setTo(targetEPR);
//初始化命名空间,及方法名
QNameqname = newQName("http://service.checkservice.cn","checkLabel");
// 指定checkLabel方法的参数值
Object[]parameters = newObject[] {"1000020993216988","5546"};
serviceClient.addHeader(createHeaderOMElement());
//调用方法一 传递参数,调用服务,获取服务返回结果集
OMElementelement = serviceClient.invokeBlocking(qname,parameters);
//值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。
//我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果
Stringresult = element.getFirstElement().getText();
System.out.println(result);
}catch (AxisFault e) {
e.printStackTrace();
}
}
/**
* 客户端进行加密
*/
publicstatic OMElement createHeaderOMElement(){
OMFactoryfactory = OMAbstractFactory.getOMFactory();
OMNamespaceSecurityElementNamespace= factory.createOMNamespace("http://handler.com","wsse");
OMElementauthenticationOM = factory.createOMElement("Authentication",SecurityElementNamespace);
//定义用户名
OMElementusernameOM = factory.createOMElement("Username",SecurityElementNamespace);
//定义密码
OMElementpasswordOM = factory.createOMElement("Password",SecurityElementNamespace);
//设置用户名
usernameOM.setText("admin");
//设置密码
passwordOM.setText("password");
authenticationOM.addChild(usernameOM);
authenticationOM.addChild(passwordOM);
return authenticationOM;
}
}
|
然后访问http://ip:port/project/services/checkService?wsdl,这是会出现下面的信息