CXF 框架拦截器

CXF的拦截器

•为什么设计拦截器? 1.为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. •拦截器分类: 1.按所处的位置分:服务器端拦截器,客户端拦截器 2.按消息的方向分:入拦截器,出拦截器 3.按定义者分:系统拦截器,自定义拦截器

•拦截器API Interceptor(拦截器接口) AbstractPhaseInterceptor(自定义拦截器从此继承) LoggingInInterceptor(系统日志入拦截器类) LoggingOutInterceptor(系统日志出拦截器类)

①系统拦截器 服务器端拦截器:

//通过终端类将helloWS对象发布到address上
                EndpointImpl endpoint = (EndpointImpl) Endpoint.publish(address, helloWS);
                //在服务器端添加一个日志的in拦截器
                endpoint.getInInterceptors().add(new LoggingInInterceptor());
                //在服务器端添加一个日志的out拦截器
                endpoint.getOutInterceptors().add(new LoggingOutInterceptor());

客户端拦截器:

//创建生成SEI实现对象的工厂
                HelloWSImplService factory = new HelloWSImplService();
                //得到web service的SEI的实现类对象(动态生成的对象)
                HelloWS helloWS = factory.getHelloWSImplPort();
                //得到客户端对象
                Client client = ClientProxy.getClient(helloWS);
                //添加客户端的out拦截器
                client.getOutInterceptors().add(new LoggingOutInterceptor());
                //添加客户端的in拦截器
                client.getInInterceptors().add(new LoggingInInterceptor());
                String result=helloWS.sayHello("tom")

②自定义拦截器 AbstractPhaseInterceptor:抽象过程拦截器,一般自定义的拦截器都会继承于它 功能:通过自定义拦截器实现用户名和密码的检查 1. 客户端: 设置out拦截器,向soap消息中添加用户名和密码数据

public class AddUserIntercept extends AbstractPhaseInterceptor<SoapMessage> {
                        private String name;
                        private String password;

                        public AddUserIntercept(String name, String pasword) {
                            super(Phase.PRE_PROTOCOL);
                            this.name = name;
                            this.password = pasword;

                        }

                        @Override
                        public void handleMessage(SoapMessage msg) throws Fault {
                            System.out.println("-----handleMessage");
                            Document document = DOMUtils.createDocument();
                            //<atguigu>
                            Element tgfile= document.createElement("tg");
                            //<name>tg</name>
                            Element nameEle = document.createElement("name");
                            nameEle.setTextContent(name);

                            //<password>123</password>
                            Element passwordEle = document.createElement("password");
                            passwordEle.setTextContent(password);

                    tgfile.appendChild(nameEle);
                            tgfile.appendChild(passwordEle);

                            //添加为请求消息的 头消息<soap:Header>  soap 有head ,body等  
                            msg.getHeaders().add(new Header(new QName("tg"), tgfile));
                        }

                    }
  1. 服务器端: 设置in拦截器,从soap消息中获取用户名和密码数据,如果不满足条件就不执行web service的方法
public class MyIntercept extends AbstractPhaseInterceptor<SoapMessage> {
                        public MyIntercept() {
                            super(Phase.PRE_PROTOCOL);
                        }
                        @Override
                        public void handleMessage(SoapMessage msg) throws Fault {
                            System.out.println("-----handleMessage");

                            Header header = msg.getHeader(new QName("tg"));
                            if(header==null) {
                                System.out.println("没有通过拦截器");
                                throw new Fault(new RuntimeException("用户名密码不存在 "));
                            } else {
                                Element data = (Element) header.getObject();
                                if(data==null) {
                                    throw new Fault(new RuntimeException("用户名密码不存在22"));
                                } else {
                                    String name = data.getElementsByTagName("name").item(0).getTextContent();
                                    String password = data.getElementsByTagName("password").item(0).getTextContent();
                                    if(!"tg".equals(name) || !"123".equals(password)) {
                                        throw new Fault(new RuntimeException("用户名密码不正确"));
                                    }
                                }
                            }
                            System.out.println("通过拦截器了!");
                        }
                    }
  1. 说明:用户名和密码是以xml片断的形式存放在soap消息中的
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
                        <soap:Header>
                            <tg>
                                <name>tanggao</name>
                                <password>123</password>
                            </tg>
                        </soap:Header>
                        <soap:Body>
                            <ns2:getStudentById xmlns:ns2="http://server.ws.java.tg.net/">
                                <arg0>1</arg0>
                            </ns2:getStudentById>
                        </soap:Body>
                    </soap:Envelope>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏禹都一只猫博客

Linux 性能检测常用的 10 个基本命令

18220
来自专栏影子

SpringBoot自定义拦截器实现IP白名单功能

4.9K20
来自专栏技术博文

excel导入与导出

基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已。修改这种文件后再保存...

31360
来自专栏移动端开发

NSURLSession 所有的都在这里(一)

61730
来自专栏草根专栏

从头编写 asp.net core 2.0 web api 基础框架 (3)

Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-...

50770
来自专栏影子

SpringBoot自定义拦截器实现IP白名单功能

转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8993331.html

1.3K10
来自专栏landv

烽火2640路由器命令行手册-05-路由器配置命令

使用auto-summary命令激活自动路由汇总功能,no auto-summary命令则关闭自动路由 汇总功能。

18240
来自专栏Google Dart

Flutter 构建完整应用手册-联网 顶

从大多数应用程序获取互联网上的数据是必要的。 幸运的是,Dart和Flutter为这类工作提供了工具!

14020
来自专栏cmazxiaoma的架构师之路

FastDFS蛋疼的集群和负载均衡(十五)之lvs四层+Nginx七层负载均衡

16820
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第二十一天 Web商城实战一【悟空教程】

public class BaseServlet extends HttpServlet {

21140

扫码关注云+社区

领取腾讯云代金券