因为要做个Https访问WebService的功能,所以做例子,对于技术本来就不怎么样的我,这个痛苦啊,幸好,最后还是出来了。。
上步骤:
1. 新建Web工程,Maven依赖如下,因为有别的例子,所以对这个来说可能多了,不一一弄了,直接上全版
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf</artifactId>
<version>2.7.10</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.7.10</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.7.10</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>2.7.10</version>
</dependency>
<dependency>
<groupId>javax.xml.rpc</groupId>
<artifactId>javax.xml.rpc-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.2.8</version>
</dependency>
</dependencies>
2. 生成密钥文件
由于SSL需要密钥文件,所以要先生成一个.keystore文件。
生成方法:(1)在cmd中输入命令:
keytool -genkey -alias tomcat-server -keyalg RSA -keypass changeit -storepass
changeit -validity 3600
(2)按照提示一次输入相应的内容,最后一步输入“y”即可。
(3)在运行命令的目录下就生成了.keystore文件。密码为:changeit。修改文件名,例如,hello.keystore,否则程序不识别。
将hello.keystore文件拷贝到刚刚建好的Web工程根目录下。
3.Tomcat添加SSL支持
\apache-tomcat-7.0.40\conf\server.xml中,默认8443的Port被注释掉,这里需要放开,并添加keystore文件属性,添加后如下
<Connector SSLEnabled="true" clientAuth="false" keystoreFile="F:\WorkSpace\cxf-web\hello.keystore" keystorePass="changeit" maxThreads="150" port="8443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS"/>
添加后启动Tomcat,访问https://localhost:8443/,出现“
此网站的安全证书有问题。”
就表示已经接近配置成功,大胆的点击
继续浏览此网站(不推荐)。
后出现Tomcat页面,证明配置成功!~
4. 在Web工程中新建接口Hello
package com.uuzz.sporttery;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public interface Hello {
String SayHi(@WebParam(name = "text") String text);
String SayHiToUser(User user);
String[] SayHiToUserList(List<User> userList);
}
5. 添加接口实现
package com.uuzz.sporttery;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.jws.WebService;
@WebService(endpointInterface = "com.uuzz.sporttery.Hello", serviceName = "Hello")
public class HelloImpl implements Hello {
Map<Integer, User> users = new LinkedHashMap<Integer, User>();
public String SayHi(String text) {
return "Hello " + text;
}
public String SayHiToUser(User user) {
users.put(users.size() + 1, user);
return "Hello " + user.getUserName();
}
public String[] SayHiToUserList(List<User> userList) {
String[] result = new String[userList.size()];
int i = 0;
for (User u : userList) {
result[i] = "Hello " + u.getUserName();
i++;
}
return result;
}
}
6. 配置XML文件,加载服务,在/WEB-INF下新建sun-jaxws.xml
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
version="2.0">
<endpoint name="HelloImplWS" implementation="com.uuzz.sporttery.HelloImpl"
url-pattern="/helloImpl" />
</endpoints>
并在web.xml中添加以下代码
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>helloImpl</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloImpl</servlet-name>
<url-pattern>/helloImpl</url-pattern>
</servlet-mapping>
7. WebService部分实现完成,使用Maven打包后,将WebService.war包放入Tomcat的webapps后,启动Tomcat,访问https://localhost:8443/WebService/helloImpl?wsdl,出现WSDL,表示WebService的服务正式发布成功啦!
8. 然后就只剩调用了,新建Java工程,先上Maven依赖
<dependencies> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-kernel</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-adb</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf</artifactId> <version>2.7.5</version> <type>pom</type> </dependency> <dependency> <groupId>ws-commons</groupId> <artifactId>axiom-api</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging-api</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-jaxws</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-java2wsdl</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>ant</groupId> <artifactId>ant-apache-log4j</artifactId> <version>1.6.5</version> </dependency> </dependencies>
然后就是调用类啦,使用Service类调用,新建Class类,具体如下
package com.uuzz.sporttery.client;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.encoding.XMLType;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class HelloClientHttps {
public static void main(String[] args) throws ServiceException,
RemoteException {
System.setProperty("javax.net.ssl.keyStore",
"F:\\WorkSpace\\cxf-web\\hello.keystore");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.setProperty("javax.net.ssl.trustStore",
"F:\\WorkSpace\\cxf-web\\hello.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Service _service = new Service();
Call _call = (Call) _service.createCall();
_call.setTimeout(1000);
_call.setTargetEndpointAddress("https://localhost:8443/WebService/helloImpl");
QName opAddEntry = new QName("http://sporttery.uuzz.com/", "SayHi");
_call.setOperationName(opAddEntry);
_call.addParameter("text", XMLType.XSD_STRING, ParameterMode.IN);
_call.setReturnType(XMLType.XSD_STRING);
Object result = _call.invoke(new String[] { "My Friend" });
System.out.println(result);
}
}
9. 然后直接run就可以啦,执行结果:Hello My Friend
本文介绍了一个基于HTTPS访问WebService的实际案例,包括配置SSL、创建WebService接口及其实现、配置XML文件等步骤,最后通过Java客户端实现了对WebService的成功调用。
7601

被折叠的 条评论
为什么被折叠?



