说明:过滤器使用范围还是挺广泛的,比如webservice中的安全认证、数字签名、Token认证都可以使用过滤器来做;下面纯粹是一个小例子,以方便后期使用时查询,仅供参考。以服务端和客户端两部分介绍(所需要包自己导入):
【服务端】
一、定义接口
import javax.jws.WebService;
@WebService
public interface HelloWorld {
public String sayHello(String inputXML);
}
二、定义实现类
@WebService(endpointInterface = "com.dyc.dao.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
@WebMethod
public String sayHello(@WebParam(name = "inputXML") String inputXML) {
// TODO Auto-generated method stub
String name = ParseXml.parseElement(inputXML, "name");
System.out.println("Server接收到输入参数为-->" + name);
return "How are you ?-->" + name;
}
}
三、XML解析类(dom4j,请自导入包)
public class ParseXml {
public static String parseElement(String inputXML, String objStr) {
InputStream in = null;
String str = null;
Element rootElement = null;
try {
in = new ByteArrayInputStream(inputXML.getBytes("UTF-8"));
SAXReader reader = new SAXReader();
Document document = reader.read(in); // 把流转成document对象。
rootElement = document.getRootElement();
Element tokenNode = rootElement.element(objStr);
if (tokenNode != null) {
str = tokenNode.getTextTrim();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
return str;
}
}
四、过滤器
public class TokenInFilter extends AbstractPhaseInterceptor<SoapMessage> {
public TokenInFilter(String phase) {
super(Phase.PRE_INVOKE);
}
public void handleMessage(SoapMessage message) throws Fault {
// 获取SOAP消息的全部头
List<Header> headers = message.getHeaders();
if (null == headers || headers.size() < 1) {
throw new Fault(new SOAPException("SOAP消息头格式不对哦!"));
}
try{
for (Header header : headers) {
SoapHeader soapHeader = (SoapHeader) header;
// 取出SOAP的Header元素
/*解析soap的头信息*/
Element element = (Element) soapHeader.getObject();
XMLUtils.printDOM(element);
NodeList tokenList = element
.getElementsByTagName("tns:token");
/*NodeList nameList = element
.getElementsByTagName("tns:name");
NodeList passList = element
.getElementsByTagName("tns:pass");*/
String token = tokenList.item(0).getTextContent();
System.out.println("Token------>"+token);
//在此验证Token的合法性
/* System.out.println(nameList.item(0).getTextContent());
System.out.println(passList.item(0).getTextContent());*/
}
}catch(Exception e){
throw new Fault(new SOAPException("解析Soap信息出错!"));
}
}
}
五、XML配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans_*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<display-name>cxf</display-name>
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
六、bean_1.xml:用来发布服务的配置
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- 自定义拦截器 -->
<bean id="authIntercetpr" class="com.dyc.filter.TokenInFilter">
<constructor-arg value="receive" />
</bean>
<jaxws:endpoint id="helloWorld"
implementor="com.dyc.impl.HelloWorldImpl" address="/HelloWorld">
<jaxws:inInterceptors> <!-- 进入webservice之前的拦截器 -->
<ref bean="authIntercetpr" />
</jaxws:inInterceptors>
</jaxws:endpoint>
【客户端】
一、利用wsdl2java生成客户端代码(省略,代码太多了)
例:wsdl2java -p com.dyc.client -d d:/ws -verbose http://localhost:6888/webgisplatform/BaseService?wsdl
二、将生成的代码导入一个工程,可以建任意一个java工程
三、生成AddSoapHeader,模拟生成一个soap的头信息
public class AddSoapHeader extends AbstractSoapInterceptor {
private static String nameURI="http://localhost:8080/cxf_filter/HelloWorld";
public AddSoapHeader(){
super(Phase.WRITE);
}
public void handleMessage(SoapMessage message) throws Fault {
String token="12345678956789123344444";
QName qname=new QName("RequestSOAPHeader");
Document doc=DOMUtils.createDocument();
//自定义节点
Element spId=doc.createElement("tns:token");
spId.setTextContent(token);
Element username=doc.createElement("tns:name");
username.setTextContent("gary");
Element password=doc.createElement("tns:pass");
password.setTextContent("123456");
Element root=doc.createElementNS(nameURI, "tns:RequestSOAPHeader");
root.appendChild(spId);
root.appendChild(username);
root.appendChild(password);
SoapHeader head=new SoapHeader(qname,root);
List<Header> headers=message.getHeaders();
headers.add(head);
System.out.println(">>>>>添加header<<<<<<<");
}
}
四、写一个调试入口main方法
public void testSend() {
try {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
List<Interceptor<? extends Message>> list = new ArrayList<Interceptor<? extends Message>>();
// 添加soap header
list.add(new AddSoapHeader());
// 添加soap消息日志打印
list.add(new org.apache.cxf.interceptor.LoggingOutInterceptor());
factory.setOutInterceptors(list);
factory.setServiceClass(HelloWorld.class);
factory
.setAddress("http://localhost:8080/cxf_filter/HelloWorld");
Object obj = factory.create();
System.out.println(obj == null ? "NULL" : obj.getClass().getName());
if (obj != null) {
HelloWorld ws = (HelloWorld) obj;
String name = Dom4jDemo.createDocument("");
System.out.println(name);
// 1、获取连接
String str = ws.sayHello(name) ;
System.out.println("res--->" + str);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
Test tc = new Test();
tc.testSend();
}
OK!发布好服务端,启动服务,可以测试了!
分享到:
相关推荐
拦截器类似于Servlet的Filter,可以在消息处理流程的各个阶段进行扩展。拦截器非线程安全,不应在其中定义实例变量,也不应直接调用下一个拦截器的方法,而是让InterceptorChain自动执行。 3. **前端(Front End)*...
总结起来,解决Java CXF Webservice接口的跨域问题,需要利用CORS机制,配置CORS Filter,可能涉及`java-property-utils-1.9.jar`库,以及在`web.xml`中设置相应的初始化参数。同时,如果项目使用Spring框架,还可以...
- 在web.xml中配置CXF的Servlet或Filter,指定服务的发布地址和服务类。 - 通过Spring集成,可以更灵活地配置服务端点和服务行为。 4. **测试与调用** - CXF提供了客户端API,可以方便地生成客户端代理类,调用...
2. **消息传递和拦截器**:拦截器是CXF的关键组件,类似于Servlet的Filter。它们在消息传递过程中起到处理和错误处理的作用。拦截器有handleMessage和handleFault两个主要方法。开发者应避免在拦截器中定义实例变量...
4. **CXF的web.xml**:在Web应用的部署描述符中,会配置CXF的Servlet或Filter,它们处理HTTP请求并调用相应的服务实现。 5. **测试代码**:可能包括JUnit或其他测试框架的测试类,用于验证Web服务的正确性。 通过...
拦截器类似于Servlet的Filter,可以拦截和处理消息流。拦截器链管理消息的传递顺序,handleMessage处理正常消息,handleFault处理错误。开发拦截器时,注意它们不是线程安全的,不应在拦截器中使用实例变量,且不应...
5. **集成与部署**:将CXF与TeamServer整合,通常涉及到修改TeamServer的配置文件(如web.xml),以便加载CXF的Servlet和Filter。此外,可能还需要编写Java代码来实现具体的Web服务接口,并将其部署在TeamServer上。...
3. **Web配置文件(web.xml)**: Web应用的部署描述符,定义了应用的初始化参数,Servlet和Filter配置等。 4. **pom.xml** (如果使用Maven): Maven项目对象模型文件,包含了项目的依赖管理和构建指令。 5. **lib目录...
- **拦截器**:在 CXF 中,拦截器类似于 JSP/Servlet 中的 Filter,用于在消息传递的过程中执行特定逻辑,如日志记录、安全验证等。拦截器的主要方法有 `handleMessage` 和 `handleFault`,分别用于处理正常消息和...
CXF支持使用Interceptor来扩展服务行为,类似于Servlet中的Filter。Interceptor可以用来处理请求和响应消息的预处理和后处理操作。 1. **定义Interceptor**: - 继承`AbstractPhaseInterceptor`。 - 实现`...
Spring Security的核心组件包括Authentication(认证)、Authorization(授权)和Filter Chain(过滤器链)。在Web应用中,它会通过一系列预定义的过滤器处理HTTP请求,这些过滤器负责登录验证、权限检查等任务。 ...
5. **webapp**:如果是Web应用,这里会包含Web相关的资源,如Web-INF下的web.xml,用于配置Servlet和Filter。 6. **cxf-servlet.xml**:Spring与CXF集成的配置文件,定义了CXF的前端控制器和服务 beans。 7. **pom....
Interceptor类似于Filter,可以在请求到达服务之前或者响应发送之前执行特定的操作,比如记录日志、验证用户身份等。 **客户端添加Interceptor**: ```java import org.apache.cxf.frontend....
其次,MyBatis 3是一个优秀的持久层框架,它解决了Java开发中的数据访问问题。MyBatis允许开发者将SQL语句直接写在XML配置文件或注解中,使得数据库操作更加直观,降低了DAO层的复杂性。它还支持动态SQL,可以根据...
Apache CXF是一个开源框架,专门用于构建和部署SOAP和RESTful Web服务。本教程将介绍如何利用CXF和Maven来创建一个基于SOAP协议的Web Service接口。 首先,为了使用CXF开发Web服务,我们需要在项目的pom.xml文件中...
这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。以HelloWorldService为例子。 参照网址:...
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> <param-name>singleSession <param-value>true </filter> ``` 通过以上配置,我们可以实现基于Flex的...
- **Filter**: Selects messages based on criteria. - **Message Patterns**: - **Content-Based Router**: Decides the destination of a message based on its content. - **Message Translator**: Translates...