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

WebService学习笔记-CXF添加自定义拦截器

发布时间:2020-12-17 00:55:29 所属栏目:安全 来源:网络整理
导读:使用自定义拦截器实现用户名和密码的校验 客户端:出拦截器 服务器:入拦截器 客户端 AddUserInterceptor.java package?com.demo.interceptors;import?java.util.List;import?javax.xml.namespace.QName;import?org.apache.cxf.binding.soap.SoapMessage;imp

使用自定义拦截器实现用户名和密码的校验

客户端:出拦截器

服务器:入拦截器


客户端

AddUserInterceptor.java

package?com.demo.interceptors;

import?java.util.List;

import?javax.xml.namespace.QName;

import?org.apache.cxf.binding.soap.SoapMessage;
import?org.apache.cxf.headers.Header;
import?org.apache.cxf.interceptor.Fault;
import?org.apache.cxf.phase.AbstractPhaseInterceptor;
import?org.apache.cxf.phase.Phase;
import?org.apache.xml.utils.DOMHelper;//使用xalan-2.7.1.jar
import?org.w3c.dom.Document;
import?org.w3c.dom.Element;

public?class?AddUserInterceptor?extends?AbstractPhaseInterceptor<SoapMessage>?{
	private?String?username;
	private?String?password;

	public?AddUserInterceptor(String?username,?String?password)?{
		super(Phase.PRE_PROTOCOL);//?准备协议化时拦截
		this.username?=?username;
		this.password?=?password;
	}

	/*
	?*?消息格式
	??<soap:Envelope?xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
		??<soap:Header>
			??<atguigu>
				??<username>umgsai</username>
				??<password>123456</password>
			??</atguigu>
		??</soap:Header>
		??<soap:Body>
			??<ns1:sayHi?xmlns:ns1="http://demo.com/">
			??	<text>test~~~</text>
			??</ns1:sayHi>
		??</soap:Body>
	??</soap:Envelope>
	?*?
	?*?*/
	
	
	@Override
	public?void?handleMessage(SoapMessage?message)?throws?Fault?{
		List<Header>?headers?=?message.getHeaders();
		Document?document?=?DOMHelper.createDocument();
		Element?rootElement?=?document.createElement("atguigu");
		Element?usernameElement?=?document.createElement("username");
		usernameElement.setTextContent(username);
		rootElement.appendChild(usernameElement);
		Element?passwordElement?=?document.createElement("password");
		passwordElement.setTextContent(password);
		rootElement.appendChild(passwordElement);
		headers.add(new?Header(new?QName("atguigu"),?rootElement));
		System.out.println("拦截...");
	}

}

InterceptorHelloWorldClient.java ?客户端添加拦截器

package?com.demo;

import?org.apache.cxf.interceptor.LoggingOutInterceptor;
import?org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import?com.demo.HelloWorld;
import?com.demo.User;
import?com.demo.interceptors.AddUserInterceptor;

//http://blog.csdn.net/fhd001/article/details/5778915
public?class?InterceptorHelloWorldClient?{
	public?static?void?main(String[]?args)?{
		JaxWsProxyFactoryBean?svr?=?new?JaxWsProxyFactoryBean();
		svr.setServiceClass(HelloWorld.class);
		svr.setAddress("http://localhost:8080/helloWorld");
		HelloWorld?hw?=?(HelloWorld)?svr.create();

		//?jaxws?API?转到?cxf?API?添加日志拦截器
		org.apache.cxf.endpoint.Client?client?=?org.apache.cxf.frontend.ClientProxy
				.getClient(hw);
		org.apache.cxf.endpoint.Endpoint?cxfEndpoint?=?client.getEndpoint();
		//添加日志拦截器
		cxfEndpoint.getOutInterceptors().add(new?LoggingOutInterceptor());
		//添加自定义的拦截器
		cxfEndpoint.getOutInterceptors().add(new?AddUserInterceptor("umgsai",?"123456"));

		User?user?=?new?User();
		user.setUsername("Umgsai");
		user.setDescription("test");
		System.out.println(hw.sayHiToUser(user));
		//String?sayHi?=?hw.sayHi("test~~~");
		//System.out.println(sayHi);
	}
}


服务器端

CheckUserInterceptor.java 拦截器

package?com.demo.interceptors;

import?javax.xml.namespace.QName;

import?org.apache.cxf.binding.soap.SoapMessage;
import?org.apache.cxf.headers.Header;
import?org.apache.cxf.interceptor.Fault;
import?org.apache.cxf.phase.AbstractPhaseInterceptor;
import?org.apache.cxf.phase.Phase;
import?org.w3c.dom.Element;
//检查用户的?拦截器
public?class?CheckUserInterceptor?extends?AbstractPhaseInterceptor<SoapMessage>?{

	public?CheckUserInterceptor()?{
		super(Phase.PRE_PROTOCOL);//?准备协议化时拦截
	}

	@Override
	public?void?handleMessage(SoapMessage?message)?throws?Fault?{
		Header?header?=?message.getHeader(new?QName("atguigu"));
		if?(header?!=?null)?{
			Element?element?=?(Element)?header.getObject();
			String?username?=?element.getElementsByTagName("username").item(0).getTextContent();
			String?password?=?element.getElementsByTagName("password").item(0).getTextContent();
			if?(username.equals("umgsai")&&password.equals("123456"))?{
				System.out.println("通过拦截器...");
				return;
			}
		}
		//不能通过
		System.out.println("没有通过拦截器");
		throw?new?Fault(new?RuntimeException("用户名或密码不正确"));
	}

}


InterceptorServerApp.java 将服务器端拦截器添加到服务端

package?com.demo;

import?javax.xml.ws.Endpoint;
import?org.apache.cxf.interceptor.LoggingInInterceptor;
import?org.apache.cxf.jaxws.EndpointImpl;

import?com.demo.interceptors.CheckUserInterceptor;

public?class?InterceptorServerApp?{
	public?static?void?main(String[]?args)?{
		System.out.println("Starting?web?service...?");
		HelloWorldImpl?implementor?=?new?HelloWorldImpl();
		String?address?=?"http://localhost:8080/helloWorld";
		Endpoint?endpoint?=?Endpoint.publish(address,?implementor);

		//?jaxws?API?转到?cxf?API?添加日志拦截器
		EndpointImpl?jaxwsEndpointImpl?=?(EndpointImpl)?endpoint;
		org.apache.cxf.endpoint.Server?server?=?jaxwsEndpointImpl.getServer();
		org.apache.cxf.endpoint.Endpoint?cxfEndpoint?=?server.getEndpoint();
????????????????//添加日志拦截器
		LoggingInInterceptor?logging?=?new?LoggingInInterceptor();
		cxfEndpoint.getInInterceptors().add(logging);
		//添加自定义拦截器
		cxfEndpoint.getInInterceptors().add(new?CheckUserInterceptor());
		System.out.println("Web?service?started");
	}
}


参考尚硅谷教程

本文出自 “优赛工作室” 博客,请务必保留此出处http://www.voidcn.com/article/p-zeqwdzeu-qg.html

(编辑:李大同)

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

    推荐文章
      热点阅读