因为要做个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