最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)SSL Socket長(zhǎng)連接方式

 更新時(shí)間:2024年01月23日 14:53:01   作者:走馬川行雪  
這篇文章主要介紹了Java實(shí)現(xiàn)SSL Socket長(zhǎng)連接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、單向認(rèn)證

1、生成服務(wù)端密鑰(配置了jdk的環(huán)境變量即可用keytool命令)

命令:keytool -genkey -keystore server_ks.jks -storepass server_password -keyalg RSA -keypass server_password

結(jié)果:會(huì)生成server_ks.jks密鑰文件

操作:將生成的server_ks.jks密鑰文件配置到服務(wù)端

2、生成服務(wù)端證書

命令:keytool -export -keystore server_ks.jks -storepass server_password -file server.cer

結(jié)果:會(huì)生成server.cer證書文件

操作:將生成的server.cer證書文件配置到客戶端

3、服務(wù)端代碼

package com.ssl.server;
 
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
 
public class ServerTest {
 
    public static File writeToFile1 = new File("C:\\Users\\Li\\Desktop\\temp\\配置.txt");
    public static File writeToFile2 = new File("C:\\Users\\Li\\Desktop\\temp\\配置2.txt");
 
    public static void main(String[] args) {
        new Thread(new ServerOne()).start();
    }
 
    public static class ServerOne implements Runnable {
        //SSL協(xié)議版本
        private static final String TLS = "TLSv1.2";
        //KeyStore的類型
        private static final String PROVIDER = "SunX509";
        //秘鑰類型,java默認(rèn)是JKS
        private static final String STORE_TYPE = "JKS";
        //秘鑰的路徑
        private static final String KEY_STORE_NAME = "E:\\02-IDEA_Project\\Test02_HttpsServer\\server_ks.jks";
        //Server的端口
        private static final int DEFAULT_PORT = 8090; //自定義端口
        //秘鑰的密碼
        private static final String SERVER_KEY_STORE_PASSWORD = "server_password";
 
        @Override
        public void run() {
            SSLServerSocket sslServerSocket = null;
            try {
                //獲取SSLContext
                SSLContext sslContext = SSLContext.getInstance(TLS);
                //生成秘鑰的manager
                KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(PROVIDER);
                //加載秘鑰
                KeyStore keyStoreOne = KeyStore.getInstance(STORE_TYPE);
                keyStoreOne.load(new FileInputStream(KEY_STORE_NAME), SERVER_KEY_STORE_PASSWORD.toCharArray());
                //秘鑰初始化
                keyManagerFactory.init(keyStoreOne, SERVER_KEY_STORE_PASSWORD.toCharArray());
                //初始化SSLContext
                sslContext.init(keyManagerFactory.getKeyManagers(), null, null);
                //獲取SSLContext的SocketFactory
                sslServerSocket = (SSLServerSocket) sslContext.getServerSocketFactory().createServerSocket(DEFAULT_PORT);
                //是否開啟雙向驗(yàn)證
                sslServerSocket.setNeedClientAuth(false);
                System.out.println("服務(wù)器已開啟,等待連接 .....");
                while (true) {
                    Socket accept = sslServerSocket.accept();
                    accept.setKeepAlive(true);
                    System.out.println("客戶端 : " + accept.getInetAddress().getHostAddress());
 
                    try (
                            InputStream inputStream = accept.getInputStream();
                            OutputStream outputStream = accept.getOutputStream();
                    ) {
                        byteMsgReader(inputStream, outputStream);
//                        socket.shutdownOutput();        // 長(zhǎng)連接則不關(guān)閉輸出流
//                        socket.shutdownInput();            // 長(zhǎng)連接則不關(guān)閉輸入流
                    } catch (Exception e) {
                        System.out.println(e.toString());
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
 
                try {
                    if (sslServerSocket != null) {
                        sslServerSocket.close();
                        System.out.println("服務(wù)器關(guān)閉!");
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
 
    /**
     * 字節(jié)流-解析客戶端的消息
     */
    public static void byteMsgReader(InputStream inputStream, OutputStream outputStream) throws Exception {
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        FileOutputStream bufferedOutputStream1 = new FileOutputStream(writeToFile1, false);
        FileOutputStream bufferedOutputStream2 = new FileOutputStream(writeToFile2, false);
        byte[] b = new byte[4096];
        int i = 0;
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream1.write(b, 0, i);
            bufferedOutputStream1.flush();
            if (i < b.length) {    // 根據(jù)讀取的長(zhǎng)度是否滿格判斷當(dāng)前文件是否已讀取完畢
                bufferedOutputStream1.close();
                break;
            }
        }
        System.out.println("接收完成第一個(gè)文件");
        byteMsgWriter(outputStream);
        i = 0;
        byte[] b2 = new byte[4096];
        while ((i = bufferedInputStream.read(b2)) > 0) {
            bufferedOutputStream2.write(b2, 0, i);
            bufferedOutputStream2.flush();
            if (i < b2.length) {   // 根據(jù)讀取的長(zhǎng)度是否滿格判斷當(dāng)前文件是否已讀取完畢
                bufferedOutputStream2.close();
                break;
            }
        }
        System.out.println("接收完成第二個(gè)文件");
        byteMsgWriter(outputStream);
    }
 
    /**
     * 字節(jié)流-發(fā)送給客戶端回執(zhí)消息
     */
    public static void byteMsgWriter(OutputStream outputStream) throws Exception {
        BufferedOutputStream bufferedOutputStreamBack = new BufferedOutputStream(outputStream);
        bufferedOutputStreamBack.write("服務(wù)端已成功接收文件.".getBytes(StandardCharsets.UTF_8));
        bufferedOutputStreamBack.write("\n".getBytes(StandardCharsets.UTF_8));
        bufferedOutputStreamBack.flush();                // 第一次發(fā)送消息,長(zhǎng)連接實(shí)現(xiàn)方式
    }
 
}

4、客戶端代碼

package com.ssl.client;
 
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;
import java.io.*;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
 
public class ClientTest {
 
    public static File readFile = new File("C:\\Users\\Li\\Desktop\\temp\\sqlV2.0.sql");
 
    public static void main(String[] args) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(new ClientOne()).start();
    }
 
    public static class ClientOne implements Runnable {
 
        private static final String TLS = "TLSv1.2";
        private static final String PROVIDER = "SunX509";
        private static final String STORE_TYPE = "JKS";
        private static final String TRUST_STORE_NAME = "E:\\02-IDEA_Project\\Test01_HttpsClient\\server.cer";
 
        @Override
        public void run() {
            SSLSocket socket = null;
            try {
                SSLContext sslContext = SSLContext.getInstance(TLS);
                //生成信任證書Manager,默認(rèn)系統(tǒng)會(huì)信任CA機(jī)構(gòu)頒發(fā)的證書,自定的證書需要手動(dòng)的加載
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(PROVIDER);
                KeyStore keyStore = KeyStore.getInstance(STORE_TYPE);
                keyStore.load(null);
                //生成驗(yàn)證工廠
                CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
                //生成別名(可以隨便填寫)
                String certificateAlias = Integer.toString(0);
                //加載證書
                keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(new FileInputStream(TRUST_STORE_NAME)));
                //初始化
                trustManagerFactory.init(keyStore);
                //初始化
                sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
                socket = (SSLSocket) sslContext.getSocketFactory().createSocket("localhost", 8090);
                socket.setKeepAlive(true);
//                socket.setSoTimeout(10000);   //設(shè)置超時(shí)時(shí)間
                try (
                        InputStream inputStream = socket.getInputStream();
                        OutputStream outputStream = socket.getOutputStream();
                ) {
                    byteMsgWriter(outputStream, inputStream);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            } catch (Exception e) {
                e.printStackTrace();
 
                try {
                    if (socket != null) {
                        socket.close();
                        System.out.println("客戶端關(guān)閉");
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
 
    /**
     * 字節(jié)流-發(fā)送給服務(wù)端
     */
    public static void byteMsgWriter(OutputStream outputStream, InputStream inputStream) throws Exception {
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(readFile));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
        //mark后讀取超過readlimit字節(jié)數(shù)據(jù),mark標(biāo)記就會(huì)失效
        bufferedInputStream.mark(909600000);
        byte[] b = new byte[4096];
        int i;
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream.write(b, 0, i);
            bufferedOutputStream.flush();                    // 第一次發(fā)送消息,長(zhǎng)連接實(shí)現(xiàn)方式
        }
 
        bufferedInputStream.reset();
        Thread.sleep(1);                                // 必須加休眠,否則第二個(gè)文件流會(huì)發(fā)生錯(cuò)亂
        characterMsgReader(inputStream);                    // 從服務(wù)端接收消息
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream.write(b, 0, i);
            bufferedOutputStream.flush();                    // 第二次發(fā)送消息,長(zhǎng)連接實(shí)現(xiàn)方式
        }
        characterMsgReader(inputStream);                    // 從服務(wù)端接收消息
    }
 
    /**
     * 字符流-解析服務(wù)端的回執(zhí)消息-不間斷解析
     */
    public static void characterMsgReader(InputStream inputStream) throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println("服務(wù)端消息: " + line);
        }
    }
 
}

二、雙向認(rèn)證

1、生成客戶端密鑰

命令:keytool -genkey -keystore client_ks.jks -storepass client_password -keyalg RSA -keypass client_password

結(jié)果:會(huì)生成client_ks.jks密鑰文件

操作:將生成的client_ks.jks密鑰文件配置到客戶端

2、生成客戶端證書

命令:keytool -export -keystore client_ks.jks -storepass client_password -file client.cer

結(jié)果:會(huì)生成client.cer證書文件

3、將server端證書添加到serverTrust_ks.jks文件中

命令:keytool -import -keystore serverTrust_ks.jks -storepass client -file server.cer

結(jié)果:會(huì)生成serverTrust_ks.jks密鑰文件

操作:將生成的serverTrust_ks.jks密鑰文件配置到客戶端

4、將client端證書添加到clientTrust_ks.jks文件中

命令:keytool -import -keystore clientTrust_ks.jks -storepass server -file client.cer

結(jié)果:會(huì)生成clientTrust_ks.jks密鑰文件

操作:將生成的clientTrust_ks.jks密鑰文件配置到服務(wù)端

5、服務(wù)端代碼

package com.ssl.server;
 
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManagerFactory;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
 
public class Server {
 
    public static File writeToFile1 = new File("C:\\Users\\Li\\Desktop\\temp\\配置.txt");
    public static File writeToFile2 = new File("C:\\Users\\Li\\Desktop\\temp\\配置2.txt");
 
    public static void main(String[] args) {
        new Thread(new ServerOne()).start();
    }
 
    public static class ServerOne implements Runnable {
 
        //SSL協(xié)議版本
        private static final String TLS = "TLSv1.2";
        //KeyStore的類型
        private static final String PROVIDER = "SunX509";
        //秘鑰類型,java默認(rèn)是JKS,Android不支持JKS,只能用BKS
        private static final String STORE_TYPE = "JKS";
        //秘鑰的路徑
        private static final String KEY_STORE_NAME = "E:\\02-IDEA_Project\\Test02_HttpsServer\\server_ks.jks";
 
        private static final String TRUST_STORE_NAME = "E:\\02-IDEA_Project\\Test02_HttpsServer\\clientTrust_ks.jks";
        //Server的端口
        private static final int DEFAULT_PORT = 8090; //自定義端口
        //秘鑰的密碼
        private static final String SERVER_KEY_STORE_PASSWORD = "server_password"; //秘鑰的密碼
        private static final String SERVER_TRUST_KEY_STORE_PASSWORD = "server";//密碼
 
        @Override
        public void run() {
 
            SSLServerSocket sslServerSocket = null;
            try {
                //獲取SSLContext
                SSLContext sslContext = SSLContext.getInstance(TLS);
 
                //生成秘鑰的manager
                KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(PROVIDER);
                //加載信任的證書
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(PROVIDER);
                //加載秘鑰
                KeyStore keyStoreOne = KeyStore.getInstance(STORE_TYPE);
                KeyStore keyStoreTwo = KeyStore.getInstance(STORE_TYPE);
                keyStoreOne.load(new FileInputStream(KEY_STORE_NAME), SERVER_KEY_STORE_PASSWORD.toCharArray());
                keyStoreTwo.load(new FileInputStream(TRUST_STORE_NAME), SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray());
                //秘鑰初始化
                keyManagerFactory.init(keyStoreOne, SERVER_KEY_STORE_PASSWORD.toCharArray());
                trustManagerFactory.init(keyStoreTwo);
                //初始化SSLContext
                sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
                //獲取SSLContext的SocketFactory
                sslServerSocket = (SSLServerSocket) sslContext.getServerSocketFactory().createServerSocket(DEFAULT_PORT);
                //是否開啟雙向驗(yàn)證
                sslServerSocket.setNeedClientAuth(true);
                System.out.println("服務(wù)器已開啟,等待連接 .....");
                while (true) {
                    Socket accept = sslServerSocket.accept();
                    accept.setKeepAlive(true);
                    System.out.println("客戶端 : " + accept.getInetAddress().getHostAddress());
 
                    try (
                            InputStream inputStream = accept.getInputStream();
                            OutputStream outputStream = accept.getOutputStream();
                    ) {
                        byteMsgReader(inputStream, outputStream);
//                        socket.shutdownOutput();        // 長(zhǎng)連接則不關(guān)閉輸出流
//                        socket.shutdownInput();            // 長(zhǎng)連接則不關(guān)閉輸入流
                    } catch (Exception e) {
                        System.out.println(e.toString());
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
 
                try {
                    if (sslServerSocket != null) {
                        sslServerSocket.close();
                        System.out.println("服務(wù)器關(guān)閉!");
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
 
    /**
     * 字節(jié)流-解析客戶端的消息
     */
    public static void byteMsgReader(InputStream inputStream, OutputStream outputStream) throws Exception {
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        FileOutputStream bufferedOutputStream1 = new FileOutputStream(writeToFile1, false);
        FileOutputStream bufferedOutputStream2 = new FileOutputStream(writeToFile2, false);
        byte[] b = new byte[4096];
        int i = 0;
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream1.write(b, 0, i);
            bufferedOutputStream1.flush();
            if (i < b.length) {       // 根據(jù)讀取的長(zhǎng)度是否滿格判斷當(dāng)前文件是否已讀取完畢
                bufferedOutputStream1.close();
                break;
            }
        }
        System.out.println("接收完成第一個(gè)文件");
        byteMsgWriter(outputStream);
        i = 0;
        byte[] b2 = new byte[4096];
        while ((i = bufferedInputStream.read(b2)) > 0) {
            bufferedOutputStream2.write(b2, 0, i);
            bufferedOutputStream2.flush();
            if (i < b2.length) {       // 根據(jù)讀取的長(zhǎng)度是否滿格判斷當(dāng)前文件是否已讀取完畢
                bufferedOutputStream2.close();
                break;
            }
        }
        System.out.println("接收完成第二個(gè)文件");
        byteMsgWriter(outputStream);
    }
 
    /**
     * 字節(jié)流-發(fā)送給客戶端回執(zhí)消息
     */
    public static void byteMsgWriter(OutputStream outputStream) throws Exception {
        BufferedOutputStream bufferedOutputStreamBack = new BufferedOutputStream(outputStream);
        bufferedOutputStreamBack.write("服務(wù)端已成功接收文件.".getBytes(StandardCharsets.UTF_8));
        bufferedOutputStreamBack.write("\n".getBytes(StandardCharsets.UTF_8));
        bufferedOutputStreamBack.flush();        // 第一次發(fā)送消息,長(zhǎng)連接實(shí)現(xiàn)方式
    }
 
}

6、客戶端代碼

package com.ssl.client;
 
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;
import java.io.*;
import java.security.KeyStore;
 
public class Client {
 
    public static File readFile = new File("C:\\Users\\Li\\Desktop\\temp\\sqlV2.0.sql");
 
    public static void main(String[] args) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(new ClientOne()).start();
    }
 
 
    public static class ClientOne implements Runnable {
 
        private static final String TLS = "TLSv1.2";
        private static final String PROVIDER = "SunX509";
        private static final String STORE_TYPE = "JKS";
        private static final String TRUST_STORE_NAME = "E:\\02-IDEA_Project\\Test01_HttpsClient\\serverTrust_ks.jks";
        private static final String KEY_STORE_NAME = "E:\\02-IDEA_Project\\Test01_HttpsClient\\client_ks.jks";
        private static final String CLIENT_KEY_STORE_PASSWORD = "client_password"; //密碼
        private static final String CLIENT_TRUST_KEY_STORE_PASSWORD = "client";//密碼
 
        @Override
        public void run() {
 
            SSLSocket socket = null;
            try {
                SSLContext sslContext = SSLContext.getInstance(TLS);
                KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(PROVIDER);
                //生成信任證書Manager,默認(rèn)系統(tǒng)會(huì)信任CA機(jī)構(gòu)頒發(fā)的證書,自定的證書需要手動(dòng)的加載
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(PROVIDER);
                KeyStore keyStoreOne = KeyStore.getInstance(STORE_TYPE);
                KeyStore keyStoreTwo = KeyStore.getInstance(STORE_TYPE);
                //加載client端密鑰
                keyStoreOne.load(new FileInputStream(KEY_STORE_NAME), CLIENT_KEY_STORE_PASSWORD.toCharArray());
                //信任證書
                keyStoreTwo.load(new FileInputStream(TRUST_STORE_NAME), CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());
                keyManagerFactory.init(keyStoreOne, CLIENT_KEY_STORE_PASSWORD.toCharArray());
                trustManagerFactory.init(keyStoreTwo);
 
                //初始化
                sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
 
 
                //此種寫法代表客戶端信任所有證書
                /*TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
                    }
                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
                    }
                }};
                //初始化
                sslContext.init(keyManagerFactory.getKeyManagers(), trustAllCerts, null);*/
 
 
                socket = (SSLSocket) sslContext.getSocketFactory().createSocket("localhost", 8090);
                socket.setKeepAlive(true);
//                socket.setSoTimeout(10000);
                try (
                        InputStream inputStream = socket.getInputStream();
                        OutputStream outputStream = socket.getOutputStream();
                ) {
                    byteMsgWriter(outputStream, inputStream);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            } catch (Exception e) {
                e.printStackTrace();
 
                try {
                    if (socket != null) {
                        socket.close();
                        System.out.println("客戶端關(guān)閉");
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
 
    /**
     * 字節(jié)流-發(fā)送給服務(wù)端
     */
    public static void byteMsgWriter(OutputStream outputStream, InputStream inputStream) throws Exception {
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(readFile));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
        //mark后讀取超過readlimit字節(jié)數(shù)據(jù),mark標(biāo)記就會(huì)失效
        bufferedInputStream.mark(909600000);
        byte[] b = new byte[4096];
        int i;
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream.write(b, 0, i);
            bufferedOutputStream.flush();                    // 第一次發(fā)送消息,長(zhǎng)連接實(shí)現(xiàn)方式
        }
 
        bufferedInputStream.reset();
        Thread.sleep(1);                                // 必須加休眠,否則第二個(gè)文件流會(huì)發(fā)生錯(cuò)亂
        characterMsgReader(inputStream);                    // 從服務(wù)端接收消息
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream.write(b, 0, i);
            bufferedOutputStream.flush();                    // 第二次發(fā)送消息,長(zhǎng)連接實(shí)現(xiàn)方式
        }
        characterMsgReader(inputStream);                    // 從服務(wù)端接收消息
    }
 
    /**
     * 字符流-解析服務(wù)端的回執(zhí)消息-不間斷解析
     */
    public static void characterMsgReader(InputStream inputStream) throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println("服務(wù)端消息: " + line);
        }
    }
 
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Json字符串內(nèi)容比較超實(shí)用教程

    Json字符串內(nèi)容比較超實(shí)用教程

    這篇文章主要介紹了Json字符串內(nèi)容比較-超實(shí)用版,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Java通過Fork/Join優(yōu)化并行計(jì)算

    Java通過Fork/Join優(yōu)化并行計(jì)算

    這篇文章主要為大家詳細(xì)介紹了Java通過Fork、Join來優(yōu)化并行計(jì)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Maven打包后找不到class文件的問題

    Maven打包后找不到class文件的問題

    本文主要介紹了Maven打包后找不到class文件的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • springboot layui hutool Excel導(dǎo)入的實(shí)現(xiàn)

    springboot layui hutool Excel導(dǎo)入的實(shí)現(xiàn)

    本文主要介紹了springboot layui hutool Excel導(dǎo)入的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • 詳解spring cloud feign踩坑記錄

    詳解spring cloud feign踩坑記錄

    這篇文章主要介紹了spring cloud feign踩坑記錄,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java中sort排序函數(shù)實(shí)例詳解

    Java中sort排序函數(shù)實(shí)例詳解

    我們經(jīng)常使用java中的sort排序,確實(shí)好用,但是其中原理大多數(shù)人都是不了解的,下面這篇文章主要給大家介紹了關(guān)于Java中sort排序函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Java創(chuàng)建可執(zhí)行的Jar文件的方法實(shí)踐

    Java創(chuàng)建可執(zhí)行的Jar文件的方法實(shí)踐

    創(chuàng)建的可執(zhí)行Jar文件實(shí)際就是在原始Jar的清單文件中添加了Main-Class的配置,本文主要介紹了Java創(chuàng)建可執(zhí)行的Jar文件的方法實(shí)踐,感興趣的可以了解一下
    2023-12-12
  • java實(shí)現(xiàn)HmacSHA256算法進(jìn)行加密方式

    java實(shí)現(xiàn)HmacSHA256算法進(jìn)行加密方式

    這篇文章主要介紹了java實(shí)現(xiàn)HmacSHA256算法進(jìn)行加密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Security中的WebSecurityConfigurerAdapter詳解

    Security中的WebSecurityConfigurerAdapter詳解

    這篇文章主要介紹了Security中的WebSecurityConfigurerAdapter詳解,今天我們要進(jìn)一步的的學(xué)習(xí)如何自定義配置Spring?Security,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Swagger2不被SpringSecurity框架攔截的配置及說明

    Swagger2不被SpringSecurity框架攔截的配置及說明

    這篇文章主要介紹了Swagger2不被SpringSecurity框架攔截的配置及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論

黔东| 察隅县| 鄂托克旗| 邢台县| 孙吴县| 通江县| 建湖县| 莱西市| 涞水县| 肥西县| 杭锦后旗| 青阳县| 肇州县| 锦屏县| 英吉沙县| 垫江县| 泰来县| 抚松县| 黄大仙区| 湖南省| 三亚市| 象州县| 泊头市| 武强县| 中宁县| 浦东新区| 普宁市| 宾川县| 肥城市| 泰安市| 长白| 三原县| 囊谦县| 阳信县| 平泉县| 昆山市| 长治县| 华坪县| 南澳县| 务川| 合水县|