TopDev

Ở code java để chặn f5 liên tục từ 1 ip thì viết code như thế nào

minhu 📖 2 phút đọc

Để chặn hành động nhấn F5 liên tục từ một IP trong JSP, bạn có thể sử dụng một trong hai cách phổ biến:

1. Sử dụng Session và thời gian giữa các yêu cầu#

Ý tưởng: Kiểm tra thời gian giữa các lần gửi yêu cầu từ người dùng. Nếu quá nhanh, sẽ chặn hành động.

Code mẫu:
` <%
// Lấy địa chỉ IP String userIp = request.getRemoteAddr();

// Lấy thời gian hiện tại
long currentTime = System.currentTimeMillis();

// Lấy thông tin từ session
Long lastAccessTime = (Long) session.getAttribute("lastAccessTime");
Integer requestCount = (Integer) session.getAttribute("requestCount");

// Khởi tạo giá trị nếu chưa có trong session
if (lastAccessTime == null) {
    lastAccessTime = currentTime;
    requestCount = 0;
}

// Kiểm tra thời gian giữa các yêu cầu
long timeDiff = currentTime - lastAccessTime;
if (timeDiff < 1000) { // Nếu yêu cầu quá nhanh (dưới 1 giây)
    requestCount++;
} else {
    requestCount = 1; // Reset đếm nếu qua thời gian chờ
    lastAccessTime = currentTime;
}

// Lưu lại thông tin vào session
session.setAttribute("lastAccessTime", lastAccessTime);
session.setAttribute("requestCount", requestCount);

// Giới hạn số lần nhấn F5 (ví dụ: 5 lần trong 5 giây)
if (requestCount > 5) {
    out.println("Bạn đã làm mới trang quá nhiều lần! Hãy thử lại sau.");
    return;
}

%> `

2. Sử dụng Filter#

Tạo một Filter để chặn truy cập từ IP nếu phát hiện spam.

Code Filter:
` import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException; import java.util.HashMap;

public class RateLimitingFilter implements Filter { private HashMap<String, Long> requestTimes = new HashMap<>(); private static final long TIME_LIMIT = 1000; // 1 giây private static final int MAX_REQUESTS = 5;

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    String userIp = httpRequest.getRemoteAddr();
    long currentTime = System.currentTimeMillis();

    synchronized (requestTimes) {
        if (!requestTimes.containsKey(userIp)) {
            requestTimes.put(userIp, currentTime);
        } else {
            long lastTime = requestTimes.get(userIp);
            if ((currentTime - lastTime) < TIME_LIMIT) {
                httpResponse.getWriter().println("Bạn đã gửi yêu cầu quá nhanh, hãy thử lại sau!");
                return;
            }
            requestTimes.put(userIp, currentTime);
        }
    }
    chain.doFilter(request, response);
}

@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}

} `

Cấu hình Filter trong web.xml:
<filter> <filter-name>RateLimitingFilter</filter-name> <filter-class>com.example.RateLimitingFilter</filter-class> </filter> <filter-mapping> <filter-name>RateLimitingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

Ghi chú:#

  • Cách dùng session phù hợp cho ứng dụng nhỏ hoặc kiểm soát từng người dùng.

  • Cách dùng Filter tốt hơn nếu muốn áp dụng kiểm soát toàn bộ ứng dụng.

  • Đảm bảo kiểm tra hiệu suất để tránh làm chậm ứng dụng.

Bài liên quan trong #Java

✓ Đã sao chép link