webservice用main方法发布https接口

来源:互联网 发布:网盘 数据库 编辑:程序博客网 时间:2024/06/08 12:43
 刚开始是用webservice发布http接口,但是需求更改,需要发布https,而且是要部署到服务器,这是一个单独的客户端,所以只好用main方法发布,没有使用tomcat。 起初本以为很简单,但发布的总会报很多bug,可是jar包的原因吧。 不废话了,上代码。
package com.topwalk.main;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.security.KeyStore;import javax.net.ssl.KeyManager;import javax.net.ssl.KeyManagerFactory;import javax.net.ssl.TrustManager;import javax.net.ssl.TrustManagerFactory;import org.apache.cxf.configuration.jsse.TLSServerParameters;import org.apache.cxf.configuration.security.ClientAuthentication;import org.apache.cxf.configuration.security.FiltersType;import org.apache.cxf.endpoint.Server;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory;import com.topwalk.service.DstServiceImpl;import com.topwalk.service.LoginServiceImpl;public class MyServer {        private static final int port = 12345;          private static final String address = "https://192.168.28.111:"+port+"/ws/ssl/loginService";          public static void main(String[] args) throws Exception {              System.out.println("Starting Server");              configureSSLOnTheServer();              JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();              factoryBean.setServiceClass(LoginServiceImpl.class);              factoryBean.setAddress(address);              Server server = factoryBean.create();              String endpoint = server.getEndpoint().getEndpointInfo().getAddress();              System.out.println("Server started at " + endpoint);              // 启动监听端口 30000            ServerSocket ss;            try {                ss = new ServerSocket(30000);                // 没有连接这个方法就一直堵塞                Socket s = ss.accept();                // 将请求指定一个线程去执行                System.out.println("执行Socket");                new Thread(new DstServiceImpl(s)).start();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        public static void configureSSLOnTheServer() {                      File file = new File(MyServer.class.getResource("/com/conf/test.jks").getFile());                     // System.out.println("file:"+"1122334==================="+file);                    try {                          TLSServerParameters tlsParams = new TLSServerParameters();                          KeyStore keyStore = KeyStore.getInstance("JKS");                          String password = "mypassword";                          String storePassword = "mypassword";                          keyStore.load(new FileInputStream(file), storePassword.toCharArray());                          KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());                          keyFactory.init(keyStore, password.toCharArray());                          KeyManager[] keyManagers = keyFactory.getKeyManagers();                          tlsParams.setKeyManagers(keyManagers);                          keyStore.load(new FileInputStream(file), storePassword.toCharArray());                          TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());                          trustFactory.init(keyStore);                          TrustManager[] trustManagers = trustFactory.getTrustManagers();                          tlsParams.setTrustManagers(trustManagers);                          FiltersType filtersTypes = new FiltersType();                          filtersTypes.getInclude().add(".*_EXPORT_.*");                          filtersTypes.getInclude().add(".*_EXPORT1024_.*");                          filtersTypes.getInclude().add(".*_WITH_DES_.*");                          filtersTypes.getInclude().add(".*_WITH_NULL_.*");                          filtersTypes.getExclude().add(".*_DH_anon_.*");                          tlsParams.setCipherSuitesFilter(filtersTypes);                          ClientAuthentication ca = new ClientAuthentication();                          ca.setRequired(true);                          ca.setWant(true);                          tlsParams.setClientAuthentication(ca);                          JettyHTTPServerEngineFactory factory = new JettyHTTPServerEngineFactory();                          factory.setTLSServerParametersForPort(port, tlsParams);                      } catch (Exception e) {                          e.printStackTrace();                      }                  }  }
这就是我发布的服务端,注意的是上面iP一定要与本机ip保持一致。

还有那个是socket判断客户端是否在线的,用的时候可以删掉。
至于那个秘钥,需要在本机生成。生成步骤就写在最下面吧。
接着看一下客户端调用的代码。

/**     * 解析https协议,需要知道密钥的密码信息     *      * @param obj     */    private static void configureSSLOnTheClient(Object obj) {        File file = new File(LandingMain.class.getResource("/com/conf/test.jks").getFile());        System.out.println(file);        Client client = ClientProxy.getClient(obj);        HTTPConduit httpConduit = (HTTPConduit) client.getConduit();        try {            TLSClientParameters tlsParams = new TLSClientParameters();            tlsParams.setDisableCNCheck(true);            KeyStore keyStore = KeyStore.getInstance("JKS");            String password = "mypassword";            String storePassword = "mypassword";            keyStore.load(new FileInputStream(file), storePassword.toCharArray());            TrustManagerFactory trustFactory = TrustManagerFactory                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());            trustFactory.init(keyStore);            TrustManager[] trustManagers = trustFactory.getTrustManagers();            tlsParams.setTrustManagers(trustManagers);            keyStore.load(new FileInputStream(file), storePassword.toCharArray());            KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());            keyFactory.init(keyStore, password.toCharArray());            KeyManager[] keyManagers = keyFactory.getKeyManagers();            tlsParams.setKeyManagers(keyManagers);            FiltersType filtersTypes = new FiltersType();            filtersTypes.getInclude().add(".*_EXPORT_.*");            filtersTypes.getInclude().add(".*_EXPORT1024_.*");            filtersTypes.getInclude().add(".*_WITH_DES_.*");            filtersTypes.getInclude().add(".*_WITH_NULL_.*");            filtersTypes.getExclude().add(".*_DH_anon_.*");            tlsParams.setCipherSuitesFilter(filtersTypes);            httpConduit.setTlsClientParameters(tlsParams);        } catch (Exception e) {            e.printStackTrace();        }    }

注意的是秘钥文件直接从客户端复制过来就好了。
记住写服务端的接口,直接把接口拿过来就行,然后直接调用。
看一下我的调用代码块

//调用webservice的接口                String address = "https://" + ip + ":12345/ws/ssl/loginService";                factoryBean.setAddress(address);                factoryBean.setServiceClass(LoginService.class);                Object obj = factoryBean.create();                LoginService loginService = (LoginService) obj;                configureSSLOnTheClient(loginService);

这样就调用成功了,我写的是一个exe程序进行登录的,
**//判断用户名密码IP是否一致 (为1代表正确)
if (loginService.uloginService(username, mdpsw, ip) == 1) {
JOptionPane.showConfirmDialog(jf, “登陆成功”, “提示”, JOptionPane.YES_NO_OPTION);
PropertyConfigurator.configure(“.\src\log4j.properties”);
logger.info(“username” + “//” + LandingMain.username + “//” + “—–//loginTime” + “//” + new Date()
+ “—–//ip//” + LoadClass.getLocalIp());**
这样就完成了调用。

再说一下生成秘钥文件的步骤吧,什么理论概念原理什么的就不多说了。

步骤1:win+R打开小黑窗口
步骤2:keytool -genkey -alias android.keystore -keyalg RSA -validity 36500 -keystore test.keystore

注:
-genkey 生成文件。
-alias 别名。
-keyalg 加密算法。
-validity 有效期。
-keystore 文件名。

步骤3:依次填写密钥库口令、确认口令、姓名与姓氏、组织单位、城市或区域、省/市/自治区、国家/地区代码,最后如果正确的话填“y”,如果错误的话直接“Enter”下去,重新再填
注意:密钥库口令一定要记住,以后还会用到。
步骤4:把生成的文件放到项目对应的目录下直接读取就行了。

最后还有很关键的一步,就是jar包,jar包。
jar包木有办法上传,没有的程序猿们可以加我扣扣(329946197)探讨。