Xử lý khi làm việc với SSL trong Java

Khi bạn làm việc với 1 server chạy SSL tương tác bằng Java thì nếu không được server tin tưởng bạn sẽ không thể làm việc tiếp được, dưới đây là một ví dụ về 1 class có tên SSLHandler.java có thể tham khảo để xử lý một số ngoại lệ khi làm việc với SSL trong Java.

Để làm được trước hết ta cần 1 file keystore hoặc #PKCS12, ví dụ với 1 Web server chạy SSL thì chỉ cần truy cập website tải chứng thư SSL của website về dưới dạng file .cer hoặc .crt sau đó dùng keytool của Java để đóng JKS, mình thường làm vậy.
Ở đây mình code Maven project nên sẽ đặt file example.jks trong thư mục src/main/resources, đường dẫn sẽ như sau src/main/resources/example.jks.

Tại đây mình cũng tạo một file truststoreconfig.properties và đường dẫn của nó như sau src/main/resources/truststoreconfig.properties.

File truststoreconfig.properties có nội dung dạng như sau:

ssl.trustStore=example.jks
ssl.trustStorePassword=123456
ssl.trustStoreType=JKS

File SSLHandler.java có nội dung dạng như sau:

package applications.util;

import java.io.File;
import java.io.InputStream;
import java.util.Properties;

/**
 * 
 * SSLHandler
 */
public class SSLHandler {

    private static final String trustStore;
    private static final String trustStorePassword;
    private static final String trustStoreType;
    
    // load properties file
    static {
        Properties props = new Properties();
        InputStream is = null;
        
        try {
            is = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("truststoreconfig.properties");
            if (is == null) {
                throw new RuntimeException("Cannot read truststoreconfig.properties file!");
            }
            
            props.load(is);
            trustStore = props.getProperty("ssl.trustStore");
            trustStorePassword = props.getProperty("ssl.trustStorePassword");
            trustStoreType = props.getProperty("ssl.trustStoreType");
        } catch (Exception e) {
            throw new RuntimeException("Cannot read truststoreconfig.properties file! detail:\r\n" + e);
        }
    }
    
    private static String _getTrustStorePath() {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        File file = new File(classLoader.getResource("truststoreconfig.properties").getFile());
        
        return file.getParentFile().getAbsolutePath();
    }
    
    /**
     * 
     * setSSL
     */
    public static void setSSL() {
        System.setProperty("javax.net.ssl.trustStore", _getTrustStorePath());
        System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
        System.setProperty("javax.net.ssl.trustStoreType", trustStoreType);
    }
    
}

Để sử dụng trước khi trao đổi với server chạy SSL chỉ cần gọi hàm setSSL trước xử lý của bạn:

SSLHandler.setSSL();
...

Tự động tải lại trang web sau khoảng thời gian không thao tác

Xin chào các bạn, trong bài viết này mình chia sẻ cho các bạn cách làm thế nào để tự động tải lại trang web khi mà người dùng truy cập trang đó không có bất kỳ hoạt động nào trên trang trong một khoảng thời gian nhất định. Ví dụ: 10 phút (không hề có lần di chuyển con trỏ chuột, click chuột, hay nhấn phím, … trên trang) thì ta sẽ tải lại trang đó.

Code Javascript

/* Auto refresh the page when user no activity for few seconds, using Javascript */
 
function setIdle(seconds, callback) {
    var timer,
        interval = (seconds * 1000);
    function refresh() {
        // Reset timer
        clearTimeout(timer);
        // Set timer
        timer = setTimeout(callback, interval);
    }
    // Add event to set timeout
    window.addEventListener("mousemove", refresh, true);
    window.addEventListener("click", refresh, true);
    window.addEventListener("keypress", refresh, true);
    // Invoke function "refresh" for first time
    refresh();
}
 
// Example, invoke function "setIdle"
setIdle(20, function() {
    window.location.reload(true);
});

Demo

Các bạn copy toàn bộ đoạn code trên thêm vào thẻ <script> trên trang web mà các bạn cần tải lại và sửa lại tham số 20 ở hàm setIdle nhé, mình để 20 ở đây có nghĩa là 20s. Ví dụ các bạn muốn để thời gian là 15 phút thì truyền 900 (60 * 15 = 900🙂 ), như vậy là cứ mỗi 15 phút mà người truy cập không có bất kỳ thao tác, hoạt động nào trên trang web, trang đó sẽ được tải lại.

Tránh spam server khi dùng keyup, keydown

Chắc hẳn khi bạn làm một thẻ input nhập nội dung để tìm kiếm và không cần nút bấm để submit, vậy thì việc submit sẽ là tự động sau khi nhập bất kỳ ký tự nào vào thẻ input. Khi này thì sẽ dùng sự kiện thích hợp nhất sẽ là keyup hoặc keydown của jQuery, mọi thứ đều diễn ra bình thường và gần như kết quả sẽ trả về ngay lập tức cho bạn. Nhưng có một vấn đề ở đây là bạn có chắc sau khi nhập các ký tự thì chỉ có duy nhất 1 request gửi đến server? Không! mỗi khi bạn nhập 1 bất kỳ thì sẽ là 1 lần gửi request đến server, việc này thật sự rất nghiêm trọng!

Sau đây là đoạn code mình dùng timeout của Javascript để xử lý chỉ gửi duy nhất 1 lần request đến server nhập xong từ khóa tìm kiếm.

Mã Javascript:

<script type="text/javascript">
    var timeout = null;
    $('#keyword').on('keyup keydown keypress', function(e) {
        // xóa sự kiện timeout lưu trước đó
        clearTimeout(timeout);
  
        timeout = setTimeout(function() {
            alert('Xử lý gửi dữ liệu lên server ở đây');
        }, 1000);
    });
</script>