客户端调用:
/**
* 使用axis 生成代码调用,并设置header内容
*/
public static void invokeService() {
try {
ServerServiceDemoImplServiceLocator locator = new ServerServiceDemoImplServiceLocator();
ServerServiceDemoImplServiceSoapBindingStub stub = new ServerServiceDemoImplServiceSoapBindingStub(new URL(locator.getServerServiceDemoPortAddress()),
new Service());
String nameSpace = "http://test.com";//可随意填写
String localPart="ssss"//可随意填写
SOAPHeaderElement element = new SOAPHeaderElement(new QName( nameSpace, localPart));
element.setPrefix("");//设置前缀
element.addChildElement("client_ip").setValue("ddddddd");//httpHeader key 与value
stub.setHeader(element);
String result = stub.emrService("ddfdfdf");//调用服务端开放方法
System.out.println(result);
} catch (RemoteException | MalformedURLException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
}
}
服务端:
定义接口:
@WebService(name = "ServerServiceDemo", targetNamespace = "http://test.com")
public interface ServerServiceDemo {
@WebMethod
@WebResult(name="mySayHelloResult")String emrService(@WebParam String data,@RequestHeader("token") String token);
@WebMethod
String testDemoService(@WebParam String data);
}
实现类:
@Component
@WebService(name = "ServerServiceDemo", targetNamespace = "http://test.com",
endpointInterface = "service.ServerServiceDemo")
public class ServerServiceDemoImpl implements ServerServiceDemo {
@Override
public @WebResult(name="mySayHelloResult") String emrService(@WebParam String data, @RequestHeader("token") String token) {
if(null == data || "".equals(data.trim())){
return "传入的参数为空";
}
return "调用成功";
}
@Override
public String testDemoService(String data) {
if(null == data || "".equals(data.trim())){
return "传入的参数为空testDemoService";
}
return "调用成功testDemoService";
}
}
webService 拦截器:
import org.apache.cxf.binding.soap.SoapHeader;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.util.List;
public class webServiceAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
Logger logger = LoggerFactory.getLogger(webServiceAuthInterceptor.class);
private static final String USERNAME="root";
private static final String PASSWORD="admin";
public webServiceAuthInterceptor() {
//定义在哪个阶段进行拦截
super(Phase.PRE_PROTOCOL);
}
@Override
public void handleMessage(SoapMessage soapMessage) throws Fault {
List<Header> headers = null;
String username=null;
String password=null;
try {
headers = soapMessage.getHeaders();
} catch (Exception e) {
logger.error("getSOAPHeader error: {}",e.getMessage(),e);
}
if (headers == null) {
throw new Fault(new IllegalArgumentException("找不到Header,无法验证用户信息"));
}
//获取用户名,密码
for (Header header : headers) {
SoapHeader soapHeader = (SoapHeader) header;
Element e = (Element) soapHeader.getObject();
NodeList usernameNode = e.getElementsByTagName("client_ip");//获取客户端header信息
String token=usernameNode.item(0).getTextContent();
System.out.println("header参数:"+token);
}
}
}
将所有配置注入spring中:
@Configuration
public class WebServiceConfig {
@Autowired
private ServerServiceDemo serverServiceDemo;
/**
* Apache CXF 核心架构是以BUS为核心,整合其他组件。
* Bus是CXF的主干, 为共享资源提供一个可配置的场所,作用类似于Spring的ApplicationContext,这些共享资源包括
* WSDl管理器、绑定工厂等。通过对BUS进行扩展,可以方便地容纳自己的资源,或者替换现有的资源。默认Bus实现基于Spring架构,
* 通过依赖注入,在运行时将组件串联起来。BusFactory负责Bus的创建。默认的BusFactory是SpringBusFactory,对应于默认
* 的Bus实现。在构造过程中,SpringBusFactory会搜索META-INF/cxf(包含在 CXF 的jar中)下的所有bean配置文件。
* 根据这些配置文件构建一个ApplicationContext。开发者也可以提供自己的配置文件来定制Bus。
*/
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
/**
* 此方法作用是改变项目中服务名的前缀名,此处127.0.0.1或者localhost不能访问时,请使用ipconfig查看本机ip来访问
* 此方法被注释后, 即不改变前缀名(默认是services), wsdl访问地址为 http://127.0.0.1:8080/services/ws/api?wsdl
* 去掉注释后wsdl访问地址为:http://127.0.0.1:8080/soap/ws/api?wsdl
* http://127.0.0.1:8080/soap/列出服务列表 或 http://127.0.0.1:8080/soap/ws/api?wsdl 查看实际的服务
* 新建Servlet记得需要在启动类添加注解:@ServletComponentScan
*
* 如果启动时出现错误:not loaded because DispatcherServlet Registration found non dispatcher servlet dispatcherServlet
* 可能是springboot与cfx版本不兼容。
* 同时在spring boot2.0.6之后的版本与xcf集成,不需要在定义以下方法,直接在application.properties配置文件中添加:
* cxf.path=/service(默认是services)
*/
//@Bean
//public ServletRegistrationBean dispatcherServlet() {
// return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
//}
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), serverServiceDemo);
endpoint.getInInterceptors().add(new webServiceAuthInterceptor());//添加校验拦截器
endpoint.publish("/wslll/api");
return endpoint;
}
}
参考博客:
https://www.jianshu.com/p/dd1bf8fa6904/
https://www.cnblogs.com/myitnews/p/12370308.html