目录
  1. 1. WebService应用2-拦截器
    1. 1.1. 创建server拦截器
      1. 1.1.1. 创建包
      2. 1.1.2. 创建server拦截器类
      3. 1.1.3. 更改server测试类
    2. 1.2. 创建client拦截器
      1. 1.2.1. 创建client拦截器类
      2. 1.2.2. 更改client测试类
WebService应用2-拦截器

WebService应用2-拦截器

创建server拦截器

创建包
  • 创建server的拦截器包com.rack.webService.intercepter
创建server拦截器类
  • 创建类ServerIntercepter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.rack.webService.intercepter;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;

import javax.xml.namespace.QName;

/**
* 服务器端的拦截器
* 这个拦截器是用来拦截客户端发来的用户信息,
* 如果用户信息与服务器中存储的用户信息不符则进行拦截
* 如果相符合则通过
*/

public class ServerIntercepter extends AbstractSoapInterceptor {
private static final String USER_NAME = "rack";
private static final String PASSWORD = "111111";

//协议化数据之前进行拦截
public ServerIntercepter() {
super(Phase.PRE_PROTOCOL);
}

@Override
public void handleMessage(SoapMessage soapMessage) throws Fault {
//1. 取出消息头(消息头名为节点名)
Header user = soapMessage.getHeader(new QName("user"));
//从节点中获取元素
Element element = (Element) user.getObject();
String userName = element.getElementsByTagName("userName").item(0).getTextContent();
String password = element.getElementsByTagName("password").item(0).getTextContent();
if (USER_NAME.equals(userName) && PASSWORD.equals(password)) {
//通过则返回
return;
}else{
//如果与服务端的信息不匹配,则抛出异常
throw new Fault(new RuntimeException("输入信息不正确..."));
}

}
}
更改server测试类
  • 更改测试类TestApp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.rack.webService.server;

import com.rack.webService.intercepter.ServerIntercepter;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.message.Message;

import javax.xml.ws.Endpoint;
import java.util.List;

public class TestApp {
public static final String PATH="http://127.0.0.1:8080/myWebService/rack";
public static void main(String[] args) {
/**
* 这个静态方法是用来发布webservice的
* PATH变量是用来存储需要发布的路径
* service是需要应用的对象
*/
UserService service = new UserService();
//获取发布实例
EndpointImpl publish = (EndpointImpl)Endpoint.publish(PATH, service);
//从发布实例中获取入服务器的拦截器
List<Interceptor<? extends Message>> inInterceptors = publish.getInInterceptors();
//将日志拦截器添加入拦截器中
inInterceptors.add(new LoggingInInterceptor());
//添加自定义拦截器
inInterceptors.add(new ServerIntercepter());
System.out.println("发布成功");
}
}

创建client拦截器

创建client拦截器类
  • 创建类ClientIntercepter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.rack.webservice.intercepter;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.util.List;

/**
* 客户端的拦截器
* 这个拦截器是用来将输入的用户信息放入wsdl文档中
*/
public class ClientIntercepter extends AbstractSoapInterceptor {

private String userName ;
private String password ;

//在数据进行协议化之前拦截
public ClientIntercepter(String userName,String password){
super(Phase.PRE_PROTOCOL);
this.userName = userName ;
this.password = password ;
}

//将输入的用户信息加入构建文档wsdl
@Override
public void handleMessage(SoapMessage soapMessage) throws Fault {

try {
//1. 从文档构建者工厂中获取一个文档构建者工厂实例
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//2. 从文档构建者工厂中获取一个文档构建者实例
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//3. 从文档构建者对象中获取一个文档实例
Document document = documentBuilder.newDocument();
//4. 创建一个user元素
Element userElement = document.createElement("user");
//5. 创建一个userName元素并为其设置值
Element userNameElement = document.createElement("userName");
userNameElement.setTextContent(userName);
//6. 创建一个password元素并为其设置值
Element passwordElement = document.createElement("password");
passwordElement.setTextContent(password);

//7. 将元素userNameElement和passwordElement加入userElement中
userElement.appendChild(userNameElement);
userElement.appendChild(passwordElement);

//8. 将wsdl文档中的元素存放到headers集合中
List<Header> headers = soapMessage.getHeaders();
//9. 将新的节点作为一个对象加入集合中,并为其命名
headers.add(new Header(new QName("rack"),userElement));

} catch (ParserConfigurationException e) {
e.printStackTrace();
} finally {
}
}
}
更改client测试类
  • 更改测试类TestApp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.rack.webservice.client;

import com.rack.webservice.intercepter.ClientIntercepter;
import com.rack.webservice.server.UserService;
import com.rack.webservice.server.UserServiceService;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;

import java.util.List;

public class TestApp {
public static void main(String[] args) {
//创建代理类对象,代理类的类名在wsdl文档的最后一个节点server中的name属性里
UserServiceService userServiceService = new UserServiceService();
//通过代理对象获取到userService对象(真正的被代理对象)
UserService userServicePort = userServiceService.getUserServicePort();
//生成客户端的代理对象,使用代理对象进行调用(代理对象可以使用代理工具进行调用,用客户端对象有诸多限制)
Client client = ClientProxy.getClient(userServicePort);
//获取所有的出拦截器
List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
//添加日志拦截器
outInterceptors.add(new LoggingOutInterceptor());
//添加自定义拦截器
outInterceptors.add(new ClientIntercepter("rack","111111"));
//被代理对象调用方法
String str = userServicePort.getStr("rack");
System.out.println(str);
}
}

文章作者: rack-leen
文章链接: http://yoursite.com/2019/05/27/Java/Java%E6%A1%86%E6%9E%B6/WebService/WebService%E5%BA%94%E7%94%A82-%E6%8B%A6%E6%88%AA%E5%99%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 rack-leen's blog
打赏
  • 微信
  • 支付宝

评论