您的位置:首页 > 编程语言

Axis2服务端用户名和密码校验authentication代码

2010-08-31 15:26 411 查看
服务端代码如下
1、用户名和密码校验类
package webservice.pojo;
import java.util.Iterator;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;

public class LoginCheck {
public static void checkUserPwd() throws AxisFault{
MessageContext msgContext = MessageContext.getCurrentMessageContext();
Iterator list = (Iterator)msgContext.getEnvelope().getHeader().getFirstElement().getChildren();
String Username = "";
String Password = "";
while (list.hasNext()) {
OMElement element = (OMElement) list.next();
if (element.getLocalName().equals("Username")) {
Username = element.getText();
}
if (element.getLocalName().equals("Password")) {
Password = element.getText();
}
}
if (!Username.equals("toone") || !Password.equals("111111")){
throw new AxisFault(" Authentication Fail! Check username/password ");
}
}
}
2、webservice axis2服务类

package webservice.pojo;

import java.util.HashMap;

import org.apache.axis2.AxisFault;

import webservice.pojo.LoginCheck;

public class StockQuoteService {
private HashMap map = new HashMap();

public double getPrice(String symbol) throws AxisFault{
LoginCheck.checkUserPwd(); //当客户端调用getPrice方法是,在此处先进行用户名和密码校验,如果校验通过则继续后续逻辑处理,如果不通过则抛出异常。
Double price = (Double) map.get(symbol);
if(price != null){
return price.doublue();
}
return 42.00;
}

public void update(String symbol, double price) {

LoginCheck.checkUserPwd(); //当客户端调用getPrice方法是,在此处先进行用户名和密码校验,如果校验通过则继续后续逻辑处理,如果不通过则抛出异常。
map.put(symbol, new Double(price));
}
}
3、服务类axis2配置文件

<service name="PojoStockQuoteService" scope="application" targetNamespace="http://quickstart.samples/">
<description>
Stock Quote Service
</description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<schema schemaNamespace="http://quickstart.samples.pojo/xsd"/>
<parameter name="ServiceClass">webservice.pojo.StockQuoteService</parameter>
</service>

服务端代码完毕。

客户端代码如下:
1、创建带用户名和密码的OMElement对象

package webservice.pojo;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;

public class HeaderOMElement {
public static OMElement createHeaderOMElement(){
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace SecurityElementNamespace = factory.createOMNamespace("http://handler.com","wsse");
OMElement authenticationOM = factory.createOMElement("Authentication",
SecurityElementNamespace);
OMElement usernameOM = factory.createOMElement("Username",
SecurityElementNamespace);
OMElement passwordOM = factory.createOMElement("Password",
SecurityElementNamespace);
usernameOM.setText("toone");
passwordOM.setText("111111");
authenticationOM.addChild(usernameOM);
authenticationOM.addChild(passwordOM);
return authenticationOM;
}
}

2、客户端代码

package webservice.pojo;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import webservice.pojo.HeaderOMElement;

public class PojoClient {
public static void main(String[] args1) throws AxisFault {
String serviceName = "http://localhost:8801/services/PojoStockQuoteService";
String namespace = "http://quickstart.samples.pojo/xsd";
String methodName = "getPrice";
Object[] methodArgs = new Object[] { };
Class[] returnTypes = new Class[] { Double.class };

RPCServiceClient serviceClient = new RPCServiceClient();

//将创建的OMElement对象放置到Header中
serviceClient.addHeader(HeaderOMElement.createHeaderOMElement());
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(serviceName);
options.setTo(targetEPR);
QName op= new QName(namespace,methodName);
Object[] response = serviceClient.invokeBlocking(op, methodArgs,returnTypes);
Double result = (Double) response[0];
if (result == null) {
System.out.println("didn't initialize!");
return;
}
else {
System.out.println("Price ====== " +
result.doublue());
}
}
}

客户端代码结束。
当在internet网络上发布webservice服务时,有时不希望别人任意访问,尤其是对修改性服务,因此需要在访问服务时先进行用户名和密码校验,对存在这一类需求的人而言,上面的方法应该会有帮助,祝好运。
另外,最近研究了一下,通过Axis2的module方式也是可进行校验的,这种方式更加松耦合,发布module后修改服务端配置文件即可,在服务端的服务方法里没有任何校验代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: