加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

jax-ws handler 例子

发布时间:2020-12-17 01:11:44 所属栏目:安全 来源:网络整理
导读:? aop技术一般用于某个对象的函数调用的日志,认证等。 webservice是远程的函数调用,也需要类似的aop方法,举例jax-ws的webservice,handler就相当于aop。 举一例jax-ws handler例子 先写个webservice ? view plaincopy to clipboardprint? 01.import javax
?

aop技术一般用于某个对象的函数调用的日志,认证等。

webservice是远程的函数调用,也需要类似的aop方法,举例jax-ws的webservice,handler就相当于aop。

举一例jax-ws handler例子

先写个webservice

?
view plaincopy to clipboardprint?
01.import javax.jws.HandlerChain;??
02.import javax.jws.WebMethod;??
03.import javax.jws.WebService;??
04.?
05.?
06.@WebService?
07.@HandlerChain(file="handlers.xml")??
08.public class Hello {??
09.?
10.??? @WebMethod()??
11.??? public String sayHello(String name) {??
12.??????? return "Hello " + name + ".";??
13.??? }??
14.}?
import javax.jws.HandlerChain;
import javax.jws.WebMethod;
import javax.jws.WebService;


@WebService
@HandlerChain(file="handlers.xml")
public class Hello {

??? @WebMethod()
??? public String sayHello(String name) {
??????? return "Hello " + name + ".";
??? }
}

超级傻瓜的webservice,唯一特别的就是@HandlerChain标注,其中的handlers.xml是一个描述jax-ws 的handler链的xml文件,这个文件可以放在与此源文件同一目录下。

来看一下handlers.xml的内容

view plaincopy to clipboardprint?
01.<?xml version="1.0" encoding="UTF-8"?>?
02.<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">?
03.??? <handler-chain>?
04.?????? <handler>?
05.?????????? <handler-name>ServiceSOAPHandler</handler-name>?
06.?????????? <handler-class>com.ws.handler.HelloHandler</handler-class>?
07.?????? </handler>?
08.??? </handler-chain>?
09.</handler-chains>?
<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
??? <handler-chain>
?????? <handler>
?????????? <handler-name>ServiceSOAPHandler</handler-name>
?????????? <handler-class>com.ws.handler.HelloHandler</handler-class>
?????? </handler>
??? </handler-chain>
</handler-chains>

其中定义了handler链,链里只有一个handler,也可以包括多个handler

再看看handler的具体实现:

view plaincopy to clipboardprint?
01.import java.util.Set;??
02.?
03.import javax.xml.namespace.QName;??
04.import javax.xml.ws.handler.MessageContext;??
05.import javax.xml.ws.handler.soap.SOAPHandler;??
06.import javax.xml.ws.handler.soap.SOAPMessageContext;??
07.?
08.public class HelloHandler implements SOAPHandler<SOAPMessageContext> {??
09.?
10.?
11.??? @Override?
12.??? public boolean handleMessage(SOAPMessageContext context) {??
13.??????? System.out.println(context.get(MessageContext.WSDL_SERVICE).toString());??
14.??????? return true;??
15.??? }??
16.?
17.??? @Override?
18.??? public boolean handleFault(SOAPMessageContext context) {??
19.??????? // TODO Auto-generated method stub??
20.??????? return true;??
21.??? }??
22.?
23.??? @Override?
24.??? public void close(MessageContext context) {??
25.??????? // TODO Auto-generated method stub??
26.??????????
27.??? }??
28.?
29.??? @Override?
30.??? public Set<QName> getHeaders()??
31.??? {??
32.??????? // TODO Auto-generated method stub??
33.??????? return null;??
34.??? }??
35.?
36.}?
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class HelloHandler implements SOAPHandler<SOAPMessageContext> {


?@Override
?public boolean handleMessage(SOAPMessageContext context) {
??System.out.println(context.get(MessageContext.WSDL_SERVICE).toString());
??return true;
?}

?@Override
?public boolean handleFault(SOAPMessageContext context) {
??// TODO Auto-generated method stub
??return true;
?}

?@Override
?public void close(MessageContext context) {
??// TODO Auto-generated method stub
??
?}

?@Override
?public Set<QName> getHeaders()
?{
??// TODO Auto-generated method stub
??return null;
?}

}

一个handler必须实现SOAPHandler或LogicalHandler接口,至于他们两者的区别,与Handler接口的关系,以及<>中的XXXContext的意义,请参考jaxws的spec,这里只是helloworld例子。

所有接口定义的方法实际上我就实现了一个,打印了被调用的webservice的名字,实际上可以在这里做很多事情,比如修改soap中的内容,添加或删除xml的标签,添加删除soap附件,获取soap相关的字段,更形象的功能可以有加解密,日志等等。

最后还要做一些相关配置文件修改:

在web.xml中添加:

view plaincopy to clipboardprint?
01.<listener>??
02.??????? <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>??
03.??? </listener>??
04.??? <servlet>??
05.??????????
06.??????? <servlet-name>wsservlet</servlet-name>??
07.??????? <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>??
08.??????? <load-on-startup>1</load-on-startup>??
09.??? </servlet>??
10.??? <servlet-mapping>??
11.??????? <servlet-name>wsservlet</servlet-name>??
12.??????? <url-pattern>/helloservice</url-pattern>??
13.??? </servlet-mapping>?
<listener>
??????? <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
??? </listener>
??? <servlet>
???????
??????? <servlet-name>wsservlet</servlet-name>
??????? <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
??????? <load-on-startup>1</load-on-startup>
??? </servlet>
??? <servlet-mapping>
??????? <servlet-name>wsservlet</servlet-name>
??????? <url-pattern>/helloservice</url-pattern>
??? </servlet-mapping>

实际上当有类标有@webservice的标注,容器会自动把他变成一个webservice,但是我试过这里必须要用上面这种方法,也就是利用jaxws的运行时以wsservlet来匹配请求,并且在之前就通过wsservletcontextlistener在初始上下文时就指定加载某个类作为webservice,这个listener会自动检测webroot下(和web.xml同一目录)的名为sun-jaxws.xml的文件,其中包含了webservice具体实现的表述。

在这里sun-jaxws.xml的内容为:

view plaincopy to clipboardprint?
01.<endpoints?
02.??? xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"?
03.??? version="2.0">?
04.?
05.??? <endpoint?
06.??????? name="helloservice"?
07.??????? implementation="com.ws.service.Hello"?
08.??????? url-pattern="/helloservice" />?
09.?
10.</endpoints>?
<endpoints
??? xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
??? version="2.0">

??? <endpoint
??????? name="helloservice"
??????? implementation="com.ws.service.Hello"
??????? url-pattern="/helloservice" />

</endpoints>

这其中指定的那个实现可以是一个有@Webservice的类,也可以是实现Provider接口的类,相关Provider可以查看官方spec,它是jax-rs的基础。

打包,部署,我是部署在glassfish里的,找个webservice的测试工具,eclipse jee套装里有自带的webservice客户端测试的

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读