关于web service与cxf的拦截器

    xiaoxiao2021-03-26  29

    对于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

             *  <azj>           *      <nameele >hejingyuan</nameele >           *      <pwdele >hjy</pwdele >           * </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)); } }

    转载请注明原文地址: https://ju.6miu.com/read-600071.html

    最新回复(0)