关于web service与cxf的拦截器

对于web service接口,有着服务端与客户端之分,服务负责编写并暴露接口在服务器上,而客户端,就是携带相关数据与服务端交互,而获取相关数据,然而对于客户端对服务端的访问,也必须通过相关的约束才能访问获取数据,比如客户端携带的登录名及密码啊........而对于客户端数据的拦截怎样实现呢?


首先我们自己编写个接口并暴露

import javax.jws.WebService;


@WebService
public interface checkLogin {

public Boolean login(String name,String pwd);


}


接口实现类:

@WebService(endpointInterface="com.azj.service.checkLogin",serviceName="checkLoginImpl")
public class checkLoginImpl implements checkLogin {


@Override
public Boolean login(String name,String pwd) {
if("admin".equals(name) && "admin".equals(pwd)){
return true;
}
return false;
}


}

这里的webservice注解,发布接口也有两种方式,效果也都一样,我说下:

第一种就是上面的命名方式。

第二种:

编写的接口:

@WebService
public interface checkLogin {
@WebMethod
public Boolean login(String name,String pwd);


}


编写的接口实现类:

@WebService
public class checkLoginImpl implements checkLogin {


@Override
public Boolean login(String name,String pwd) {
if("admin".equals(name) && "admin".equals(pwd)){
return true;
}
return false;
}


}



这两种方式的注解,我想你也看出优劣势了吧!!


我们再说接口的暴露:

public class servicePulish {


public static void main(String[] args) {
checkLogin cl=new checkLoginImpl();
EndpointImpl el=(EndpointImpl) Endpoint.publish("http://localhost:8080/test", cl);
el.getInInterceptors().add(new inchecked());//这里有进出拦截器之分,对于服务端而言,客户端要携带数据进入服务端,所以就是进入拦截器的编写



}


}

进入拦截器的编写:

public class inchecked extends AbstractPhaseInterceptor<SoapMessage> {

   //由于AbstractPhaseInterceptor无无参数构造器,使用继承的方式,需要显示调用父类有参数的构造器 
public inchecked() {

                 //Phase.PRE_PROTOCOL做好准备工作,在调用方法之前进行拦截
super(Phase.PRE_PROTOCOL);
}

          //实现自己的拦截器时,需要实现handleMessage方法。    //handleMessage方法中的形参就是被拦截到的Soap消息 

@Override
public void handleMessage(SoapMessage ms) throws Fault {
Header header = ms.getHeader(new QName("azj"));//获取标志为“azj”的header头,这里必须与客户端的的携带数据的标志header相对应
Element el = (Element) header.getObject();
String name = el.getElementsByTagName("name").item(0).getTextContent();
String pwd = el.getElementsByTagName("pwd").item(0).getTextContent();
 //假如要求Header携带了用户名,密码信息
if("admin".equals(name) && "admin".equals(pwd)){
System.out.println("success");
}else System.out.println("fail");

}


}

编写的拦截器类inchecked必须继承extends AbstractPhaseInterceptor<SoapMessage>这个类,重写相关方法。而 AbstractPhaseInterceptor<SoapMessage>则是继承的interceptor这个父类而对应获取web service的soap携带的相关数据的信息,而这些信息都放在请求头header里面



客户端代码:


public static void main(String[] args) {
CheckLoginImpl cl=new CheckLoginImpl();
CheckLogin lo = cl.getCheckLoginImplPort();
Client client = ClientProxy.getClient(lo);
client.getOutInterceptors().add(new outCheck("admin","admin")); //对于客户端而言,就是数据传出的拦截
if(lo.login("admin", "admin")){
System.out.println("登录验证成功");
}


}

客户端拦截器:

public class outCheck extends AbstractPhaseInterceptor<SoapMessage> {


private String name;
private String pwd;

public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public String getPwd() {
return pwd;
}


public void setPwd(String pwd) {
this.pwd = pwd;
}


public outCheck(String name,String pwd) {
super(Phase.PREPARE_SEND);//在准备发送SOAP消息时启用该拦截器  
this.name=name;
this.pwd=pwd;
}


@Override
public void handleMessage(SoapMessage ms) throws Fault {


                //创建一个标志为“azj”的xml

  1.          *  <azj> 
  2.          *      <nameele >hejingyuan</nameele > 
  3.          *      <pwdele >hjy</pwdele > 
  4.          * </azj>

List<Header> headers = ms.getHeaders();
Document dom = DOMUtils.createDocument();
Element el = dom.createElement("azj");
Element nameele = dom.createElement("name");
nameele.setTextContent(name);

Element pwdele = dom.createElement("pwd");
pwdele.setTextContent(pwd);

el.appendChild(nameele);
el.appendChild(pwdele);
//把el元素包装成Header,并添加到SOAP消息的Header列表中  
headers.add(new Header(new QName("azj"), el));


}


}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrl+C+V程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值