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

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

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

一、單向認(rèn)證

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

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

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

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

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

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

結(jié)果:會生成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);
                //是否開啟雙向驗證
                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();        // 長連接則不關(guān)閉輸出流
//                        socket.shutdownInput();            // 長連接則不關(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ù)讀取的長度是否滿格判斷當(dāng)前文件是否已讀取完畢
                bufferedOutputStream1.close();
                break;
            }
        }
        System.out.println("接收完成第一個文件");
        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ù)讀取的長度是否滿格判斷當(dāng)前文件是否已讀取完畢
                bufferedOutputStream2.close();
                break;
            }
        }
        System.out.println("接收完成第二個文件");
        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ā)送消息,長連接實(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)會信任CA機(jī)構(gòu)頒發(fā)的證書,自定的證書需要手動的加載
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(PROVIDER);
                KeyStore keyStore = KeyStore.getInstance(STORE_TYPE);
                keyStore.load(null);
                //生成驗證工廠
                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è)置超時時間
                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)記就會失效
        bufferedInputStream.mark(909600000);
        byte[] b = new byte[4096];
        int i;
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream.write(b, 0, i);
            bufferedOutputStream.flush();                    // 第一次發(fā)送消息,長連接實(shí)現(xiàn)方式
        }
 
        bufferedInputStream.reset();
        Thread.sleep(1);                                // 必須加休眠,否則第二個文件流會發(fā)生錯亂
        characterMsgReader(inputStream);                    // 從服務(wù)端接收消息
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream.write(b, 0, i);
            bufferedOutputStream.flush();                    // 第二次發(fā)送消息,長連接實(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é)果:會生成client_ks.jks密鑰文件

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

2、生成客戶端證書

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

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

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

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

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

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

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

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

結(jié)果:會生成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);
                //是否開啟雙向驗證
                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();        // 長連接則不關(guān)閉輸出流
//                        socket.shutdownInput();            // 長連接則不關(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ù)讀取的長度是否滿格判斷當(dāng)前文件是否已讀取完畢
                bufferedOutputStream1.close();
                break;
            }
        }
        System.out.println("接收完成第一個文件");
        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ù)讀取的長度是否滿格判斷當(dāng)前文件是否已讀取完畢
                bufferedOutputStream2.close();
                break;
            }
        }
        System.out.println("接收完成第二個文件");
        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ā)送消息,長連接實(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)會信任CA機(jī)構(gòu)頒發(fā)的證書,自定的證書需要手動的加載
                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)記就會失效
        bufferedInputStream.mark(909600000);
        byte[] b = new byte[4096];
        int i;
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream.write(b, 0, i);
            bufferedOutputStream.flush();                    // 第一次發(fā)送消息,長連接實(shí)現(xiàn)方式
        }
 
        bufferedInputStream.reset();
        Thread.sleep(1);                                // 必須加休眠,否則第二個文件流會發(fā)生錯亂
        characterMsgReader(inputStream);                    // 從服務(wù)端接收消息
        while ((i = bufferedInputStream.read(b)) > 0) {
            bufferedOutputStream.write(b, 0, i);
            bufferedOutputStream.flush();                    // 第二次發(fā)送消息,長連接實(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é)

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

相關(guān)文章

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

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

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

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

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

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

    本文主要介紹了Maven打包后找不到class文件的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • 詳解spring cloud feign踩坑記錄

    詳解spring cloud feign踩坑記錄

    這篇文章主要介紹了spring cloud feign踩坑記錄,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    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)行加密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    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框架攔截的配置及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

时尚| 建宁县| 东港市| 定结县| 元朗区| 登封市| 安阳市| 子洲县| 明星| 垣曲县| 英吉沙县| 班玛县| 扎囊县| 冷水江市| 保德县| 湖北省| 宁国市| 香河县| 轮台县| 德格县| 山东省| 乌兰浩特市| 武鸣县| 灵川县| 桦甸市| 屏山县| 农安县| 揭西县| 吴桥县| 泸溪县| 东乡| 增城市| 台南县| 桃园市| 嵊州市| 咸阳市| 长春市| 湾仔区| 法库县| 南安市| 宜都市|