Giáo trình Lập trình Java - Bài 8: Validation và Interceptor
Xây dựng SecurityInterceptor lọc tất cả các
action của 2 controller trên loại trừ các action
không tô màu vàng.
SecurityInterceptor phải chạy trước khi request
đến action và sẽ thực hiện công việc:
Kiểm tra xem trong session có attribute có tên là user
hay chưa? Nếu chưa có thì chuyển hướng sang
user/login.htm
Ở user/login.htm sau khi đăng nhập thành công cần
tạo một attribute user trong session
34 trang |
Chia sẻ: huongthu9 | Lượt xem: 796 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Lập trình Java - Bài 8: Validation và Interceptor, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH JAVA 5
BÀI 8: VALIDATION & INTERCEPTOR
MỤC TIÊU
Hiểu được tầm quan trọng của validation
Triển khai validation trong Spring MVC
Hiểu cơ chế hoạt động của Interceptor
Tạo và sử dụng Interceptor
Ứng dụng Interceptor để bảo vệ tài
nguyên riêng tư
GIỚI THIỆU KIỂM LỖI
Dữ liệu vào không hợp lệ sẽ gây các lỗi khó
lường. Vì vậy việc kiểm soát dữ liệu vào luôn
đóng vai trò quan trọng của ứng dung.
Các lỗi thường gặp
Để trống ô nhập
Không đúng định dạng email, creditcard, url
Sai kiểu số nguyên, số thực, ngày giờ
Giá trị tối thiểu, tối đa, trong phạm vi
Không giống mật khẩu, đúng captcha, trùng mã
Không như mong đợi của việc tính toán nào đó
MINH HỌA KIỂM LỖI
CASE STUDY
Kiểm các lỗi cho form
Không để trống họ và tên
Không để trống điểm
Điểm phải có giá trị từ 0 đến 10
Phải chọn ngành
DEMO
Chạy student/validate1.htm
+ Nhập dữ liệu không hợp lệ
+ Nhập dữ liệu hợp lệ
KIỂM LỖI BẰNG TAY
Đối số này nên là
đối số cuối cùng
rejectValue() cho
phép bổ sung
thông báo lỗi cho
thuộc tính mark
của bean student
Phương thức
hasErrors() cho
biết có thông báo
lỗi nào hay không?
HIỂN THỊ LỖI
Hiển thị lỗi thuộc tính name của bean
student
Thuộc tính element chỉ ra thẻ chứa thông
báo lỗi. Mặc định là
ĐỊNH DẠNG LỖI
Thông báo lỗi sinh ra có dạng
{thông báo lỗi}
Ví dụ
Hiển thị lỗi cho thuộc tính họ tên
CSS sau được sử dụng để định dạng cho các
thông báo lỗi
*[id$=.errors]{
color:red; font-style: italic;
}
Selector *[id$=.errors] sẽ chọn ra các thẻ có
thuộc tính @id kết thúc bởi chữ “.errors”
DEMO
Giải thích student/validate1.htm
+ Student1
+ Controller.validate1()
+ student1.jsp
KIỂM LỖI BẰNG ANNOTATION
Nạp các annotation lỗi vào các thuộc tính lớp bean
được sử dụng để nhận dữ liệu form
Annotation kiểm lỗi
@NotBlank: kiểm trường name rỗng
@NotNull: kiểm trường mark và major null
@DecimalMin(), DecimalMax(): kiểm khoảng số thực
STUDENTCONTROLLER
Chỉ cần bổ sung @Validated trước bean nhận
dữ liệu form thì các thuộc tính của bean sẽ được
kiểm lỗi theo các luật đã nạp vào các trường
bean
HIỂN THỊ LỖI TẬP TRUNG
được sử dụng để hiển
thị tất cả các lỗi
DEMO
Giải thích student/validate2.htm
+ Student2
+ Controller.validate2()
+ student2.jsp
THƯ VIỆN KIỂM LỖI
Để có thể sử dụng phương pháp kiểm lỗi bằng
annotation này cần bổ sung các thư viện sau
validation-api-1.0.0.GA.jar
hibernate-validator-4.2.0.Final.jar
log4j-1.2.16.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
slf4j-simple-1.6.1.jar
CÁC ANNOTATION KIỂM LỖI THƯỜNG DÙNG
javax.validation.constraints
: : : : : : : : :
Annotation Ý nghĩa Ví dụ
NotBlank Chuỗi không rỗng @NotBlank()
NotNull Không cho phép null @NotNull()
NotEmpty Chuỗi /tập hợp không rỗng @NotEmpty()
Length Độ dài chuỗi @Length(min=5, max=10)
Max Giá trị số nguyên tối đa @Max(value=“10”)
Min Giá trị số nguyên tối thiểu @Min(value=“0”)
Size, Range Phạm vi số nguyên tối @Size(min=0, max=10)
DecimalMax Giá trị số thực tối đa @DecimalMin(value=“5.5”)
DecimalMin Giá trị số nguyên tối thiểu @DecimalMax(value=“9.5”)
Future Thời gian trong tương lai @Future()
Past Thời gian trong quá khứ @Past()
Pattern So khớp biểu thức chính qui @Pattern(regexp="[0-9]{9,10}")
Email Đúng dạng email @Email()
CreditCardNumber Đúng dạng số thẻ tín dụng @CreditCardNumber()
URL Đúng dạng url @URL()
SafeHtml Không được chứa thẻ HTML @SafeHtml()
LẬP TRÌNH JAVA 5
PHẦN 2
GIỚI THIỆU INTERCEPTOR
Interceptor là một thành phần có nhiệm vụ tiền
và hậu xử lý các request đến phương thức action
CẤU TRÚC CỦA INTERCEPTOR
Kế thừa lớp HandlerInterceptorAdapter
Chạy TRƯỚC phương thức action
Chạy SAU phương thức action, TRƯỚC view
Chạy SAU view
false sẽ không chuyển yêu cầu đến action
QUI TRÌNH XỬ LÝ CỦA INTERCEPTOR
Nếu chúng ta muốn xử lý một công việc nào đó trước
khi action thực thi thì phải viết mã ở preHandle.
Nếu chúng ta muốn chuẩn bị một điều gì đó cho View
thì có thể viêt mã ở postHandle()
Action
View
preHandle()
postHandle()
afterCompletion()
request
response
XÂY DỰNG LOGGERINTERCEPTOR
KHAI BÁO INTERCEPTOR
Interceptor sau khi đã xây dựng xong cần phải
khai báo với hệ thống Spring để lọc các action
Khai báo sau đây LoggerInterceptor sẽ lọc tất cả
mọi action
CONTROLLER VÀ VIEW
PHÂN TÍCH KẾT QUẢ THỰC HIỆN
Chạy home/index.htm và xem kết xuất từ
Console
Qua kết quả chúng ta thấy thứ tự thực hiện
preHandle()=>index()=>postHandle()=>index.jsp=>afterCompletion()
Interceptor Interceptor InterceptorViewAction
DEMO
Chạy home/index.htm và giải thích
rõ hoạt động của LoggerInterceptor
CẤU HÌNH INTERCEPTOR
Đôi khi Interceptor được xây dựng ra chỉ để lọc
một số action chứ không phải lọc tất cả các
action
Cấu hình sau chỉ cho phép LoggerInterceptor lọc
action home/index.htm và home/about.htm
CẤU HÌNH INTERCEPTOR
Một tình huống khác là chúng ta muốn lọc tất cả
các action trong HomeController chỉ loại trừ
home/index.htm
Ở đây chúng ta thấy
được sử dụng để loại trừ các action không muốn
lọc còn ** là ký hiệu đại diện cho nhóm ký tự bất
kỳ
TÌNH HUỐNG SECURITY
Các action màu vàng của 2 controller sau chỉ
được phép truy cập sau khi đã đăng nhập
GIẢI QUYẾT TÌNH HUỐNG
Xây dựng SecurityInterceptor lọc tất cả các
action của 2 controller trên loại trừ các action
không tô màu vàng.
SecurityInterceptor phải chạy trước khi request
đến action và sẽ thực hiện công việc:
Kiểm tra xem trong session có attribute có tên là user
hay chưa? Nếu chưa có thì chuyển hướng sang
user/login.htm
Ở user/login.htm sau khi đăng nhập thành công cần
tạo một attribute user trong session
XÂY DỰNG SECURITYINTERCEPTOR
DEMOChưa đăng nhập:
+ Chạy user/register.htm
+ Chạy user/change-password.htm
Đã đăng nhập
+ Chạy user/change-password.htm
Giải thích
TÌNH HUỐNG NẠP DỮ LIỆU DÙNG CHUNG
Module giao diện này thuộc về layout nhưng lại
cần nạp dữ liệu từ CSDL.
Vấn đề: Viết mã ở đâu để cấp dữ liệu cho
module này?
1. Viết trong mọi action của mọi controller vì
view nào cũng cần dữ liệu này
2. Viết trong postHandle() của Interceptor lọc
tất cả mọi action. Rõ ràng phương án này rất
tối ưu
TỔNG KẾT NỘI DUNG BÀI HỌC
Tìm hiểu tầm quan trọng của Validation
Thực hiện kiểm lỗi bằng tay
Thực hiện kiểm lỗi bằng annotation
Tìm hiểu Interceptor
Xây dựng Interceptor
Cấu hình Interceptor để lọc action
Ứng dụng Interceptor để bảo vệ chức
năng riêng tư.
Các file đính kèm theo tài liệu này:
- giao_trinh_lap_trinh_java_bai_8_validation_va_interceptor.pdf