Chào mọi người,
Tiếp nối từ bài viết trước, hôm nay mình sẽ chia sẻ chi tiết về các loại Filter trong Spring Boot và lý do tại sao nên sử dụng OncePerRequestFilter
cho xác thực JWT, thay vì sử dụng các lớp implement Filter
thông thường hay kế thừa từ GenericFilterBean
.
1. Tại sao không nên sử dụng Filter
?
Filter
là interface cơ bản trong Java Servlet API, cung cấp các phương thức như init
, doFilter
, và destroy
. Tuy nhiên, việc tự triển khai Filter
yêu cầu bạn quản lý toàn bộ luồng xử lý và logic để tránh việc xử lý lặp lại trong cùng một request.
Nhược điểm:
- Dễ dẫn đến lỗi khi filter xử lý lặp lại trong các trường hợp như forward hoặc error dispatch.
- Mã nguồn phức tạp hơn vì bạn phải tự viết các logic kiểm tra và quản lý.
Ví dụ một Filter bình thường:
java
@Component
public class JwtFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// Kiểm tra và xử lý JWT
// Lặp lại không kiểm soát khi có forward
chain.doFilter(request, response);
}
}
2. Tại sao không nên sử dụng GenericFilterBean
?
Mặc dù GenericFilterBean
giúp bạn bỏ qua việc viết các phương thức init
và destroy
, nhưng nó không đảm bảo rằng filter chỉ được thực thi một lần cho mỗi request. Bạn vẫn sẽ cần viết thêm logic kiểm tra để đạt được điều đó.
Demo sử dụng GenericFilterBean
:
java
@Component
public class JWTAuthFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// Logic xác thực JWT
chain.doFilter(request, response);
}
}
3. Tại sao nên sử dụng OncePerRequestFilter
?
OncePerRequestFilter
được thiết kế để đảm bảo logic xử lý chỉ được thực hiện một lần cho mỗi request, ngay cả khi request được forward, include hay error dispatch. Điều này thực sự quan trọng trong xác thực JWT.
Lợi ích của OncePerRequestFilter
:
- Xử lý một lần duy nhất cho mỗi request: Không bao giờ bị lặp lại trong các tình huống phức tạp.
- Cung cấp phương thức
doFilterInternal
: Giúp bạn dễ dàng triển khai mà không cần phải lo về các phương thức khác.
Demo sử dụng OncePerRequestFilter
cho xác thực JWT:
java
@Component
public class JWTAuthorizationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// Logic xác thực JWT ở đây
filterChain.doFilter(request, response);
}
}
Kết luận
Sử dụng OncePerRequestFilter
trong Spring Boot là lựa chọn tối ưu cho việc triển khai xác thực JWT. Nó đảm bảo xử lý một lần duy nhất cho mỗi request và giúp đơn giản hóa logic xử lý. Nếu bạn có thắc mắc hay muốn mình đi sâu hơn vào một phần nào đó, hãy để lại câu hỏi trong phần bình luận nha!
Cảm ơn các bạn đã đọc bài viết này!
source: viblo