WebService:使用tcp/ip monitor拦截请求
来源:互联网 发布:淘宝收藏按钮ps文件 编辑:程序博客网 时间:2024/05/16 11:27
1,wsimport
-d<目录>:参数是默认的,不写也有,
-s<目录>:生成.java文件,
-p<生成的新包名>:生成包
2,发布的类中必须有一个非静态,非私有的方法,否则报错。
3,开发时,soap1.2的客户端可以向soap1.2的服务端发请求,
Soap1.1的客户端可以向soap1.1的服务端发请求,
Soap1.1的客户端可以向soap1.2的服务端发请求,(向下兼容)
Soap1.2的客户端不可以想soap1.1的服务端发请求。
4,在WSDL文档中,portType标识的一般是接口,
一个标签的字标签一般是这个标签的方法。
例如<service>的字标签
Service表示的是一个类,可以new。他的字标签port标识的就是这个类中的一个方法,名为getMobileCodeWSSoap()。
5,jdk1.6只支持SOAP1.1,到了jdk1.7,就支持soap1.2了。
可以通过注解绑定SOAP类型。
在需要发布的类上添加注解:
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING)
上面注解绑定了SOAP1.1的规范。如果不加这个注释,默认使用SOAP1.1规范。
如果在jdk1.6的环境绑定SOAP1.2,会报错,“不能绑定SOAP1.2协议”。
如果要在jdk1.6环境下开发SOAP1.2,需要用到第三方框架。Cxf或xfire。
我们主要使用cxf。
不加注解的情况下运行,如何知道是使用SOAP1.1呢?
运行之后,在浏览器访问这个服务的WSDL,发现:
6,我们通常都是远程调用这个方法,访问对方的数据库,增删改查,获取信息。比如我们要获取一组用户的数据,需要用一个List集合来存储。获取单个用户,可以直接从这个List集合中获取。
例如:
private List<User> userList = new ArrayList<User>();//获取一个用户。public User getUser(int index){//根据用户传入的角标获取集合中的用户if(index < 0 || index >= userList.size()) { //防止角标越界异常return null;}return userList.get(index);}//保存用户public void saveUser(User user){userList.add(user);}//获取所有用户public List<User> getAllUser() {return userList;}//根据id删除用户信息。public User deleteUser(int index) {if(index < 0 || index >= userList.size()) {return null;}return userList.remove(index);}
再将这个工程发布,浏览器输入
http://192.168.3.237:8989/hello?wsdl
访问生成的WSDL文档,刚才定义的方法就会在这里面描述:
此外,还有一段描述:
这个是方法的描述,与这个WSDL文档不同。将这个url拷贝到地址栏中:比如:
描述了deleteUser这个方法需要的参数类型是int型,返回值类型是user。(只要是Response都是返回信息)
7,发布的方式有两种,一种是告诉对方WSDL地址http://192.168.3.237:8989/hello?wsdl
另一种方式就是在页面上点击右键另存为,保存为一个.xml文件,就会下载一个.xml文件。如果对方没有网络,你就可以把这个文件通过某种方式烤给他。他获取这个文件之后,可以将这个文件放入任何目录之下,通过wsimport命令解析java文件。
就可以在当前目录下生成Java文件,将里面的class文件全部删除,把cn目录整体拷贝到项目中,
可以像刚才一样调用方法。
8,上面生成的Java文件运行没有问题,然后我们把hello.xml文件删掉,再运行,会报错,报找不到hello.xml文件的错误。为什么呢?
通过这种方式运行需要依赖这个文件。
在生成的HelloWorldService.java的46行报错,查看这个类的46行:
发现这个构造函数调用了父类的构造函数,父类构造函数需要一个HELLOWORLDSERVICE_WSDL_LOCATION常量参数,那这个参数是什么呢?按住ctrl点进去:
发现它绑定了一个url,这个url在构建的时候就使用了刚才的hello.xml文件,在这里写死了,最后又将这个url赋值给这个常量。
所以会报找不到这个文件的错误。
但是我们在web上使用的时候是不应该依赖这个文件的。怎么办呢?只要将这个写死的文件引用改掉就可以了。
我们需要在发布的时候,将WSDL地址也告诉对方,把这两个地方改成WSDL地址就可以了。
在上边还有一个:
OK了。
9,客户端请求远程数据的时候发送的是SOAP协议数据,即HTTP+XML格式的数据。之前已经提到,我们可以通过HTTPwatch拦截HTTP请求信息,但是不能拦截SOAP协议数据信息。因为发送SOAP协议的时候没有使用浏览器,所以无法捕获。
Sniffer局域网监听器,可以用于监听局域网传递的信息。
监听器相当于在局域网设置了一个代理,客户端将请求数据发送到代理,通过代理再发送到服务端,服务端返回数据的时候同样先将数据发送到代理上,通过代理返回给客户端。
MyEclipse自带一个代理监听工具,TCP/IPMonitor。
通过菜单栏windowàShow viewàother... 搜索tcp/ip monitor。
就找到了这个工具,点击OK打开。会在下面出现一个界面:
可以在公司中通过这个工具拦截局域网的信息。-_-#
右上角有一个小三角,点击出现下拉菜单,选择Properties。
一开始里面什么都没有,我们点击add添加一个。
点击OK后,还没有启动这个代理,点击右侧的start启动。
然后我们在浏览器中访问localhost:7777,就可以看到百度的主页。
10,使用TCP/IP Monitor监听我们的发布服务的请求及相应。
比如要监听http://192.168.3.237/hello需要如下定义:
在浏览器访问http://localhost:5555/hello?wsdl,
可以访问我们发布的服务wsdl。
在tcp/ip monitor中可以看到:
我们可以使用http://localhost:5555/hello?wsdl地址在本地生成java文件,与之前的方式相同,
将class文件删除,把cn拷贝到项目中,与之前的调用方式一样,可以访问服务器,因为我们为服务器配置了代理,所以请求会通过代理转发到服务器上,在TCP/IP Monitor就可以看到拦截的请求信息。
观察请求信息,发现它发送了GET请求,这是因为第一次访问的时候需要先与服务器握手,以后再请求就不会发送GET请求了。
注意:如果是GET请求,Content-type是null,如果是POST请求,Content-type不是空值。
请求头中有一个soapaction,只有soap1.1才有这个头信息。
在请求体中可以发现是xml数据。
这个xml的格式就是soap的标准格式,与网站上的格式比较:
上面是我们截取的请求体,后面是网站的内容。
- WebService:使用tcp/ip monitor拦截请求
- Web Service (006---使用eclipse端口拦截器[TCP/IP Monitor]监视WebService请求)
- TCP/IP Monitor 使用总结
- 使用 Eclipse 中的 TCP/IP Monitor (转)
- MyEclipse的Tcp/Ip monitor的使用
- MyEclise中TCP/IP Monitor的使用
- 使用 Eclipse 中的 TCP/IP Monitor
- MyEclipse TCP/IP monitor工具的使用
- Myeclipse中的TCP/IP Monitor使用
- Eclipse TCP/IP Monitor 的使用
- 使用TCP-IP Monitor监视Soap协议
- 使用TCP-IP Monitor监视Soap协议
- TCP/IP Monitor
- MyEclipse TCP/IP Monitor
- eclipse tcp/ip monitor
- Tcp/Ip Monitor
- 使用eclipse中的tcp/ip监听webservice请求和响应数据
- 使用eclipse的TCP/IP Monitor监控Web service程序
- 散列表
- UVA 10759 Dice Throwing(dp 概率)
- 【Android】第三方QQ账号登录的实现
- 读取sav文件失败
- 查看oracle锁表相关脚本
- WebService:使用tcp/ip monitor拦截请求
- Android传感器概述(二)
- 2013.11.07
- Android Activity生命周期
- 内存DC
- 一步一步学android控件(之十) —— Gallery
- RestEasy与Jsonp(ajax跨域)
- ubuntu13.10下到tftp的配置与使用
- 顺序栈类定义