Ở code java để chặn f5 liên tục từ 1 ip thì viết code như thế nào
Để 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.