AntPathMatcher sử dụng các quy tắc ký tự đại diện để so khớp đường dẫn. Đây là một công cụ mạnh mẽ trong Spring Framework cho việc xử lý các mẫu đường dẫn.
Các quy tắc ký tự đại diện
AntPathMatcher hỗ trợ các quy tắc sau:
?khớp với một ký tự duy nhất*khớp với không hoặc nhiều ký tự**khớp với không hoặc nhiều thư mục trong một đường dẫn{tenbien:[regex]}khớp với biểu thức chính quy và gán giá trị cho biến đường dẫn
Ví dụ minh họa
duong/dan/?ile.jsp— khớp vớiduong/dan/file.jspcũng nhưduong/dan/aile.jspduong/dan/*.jsp— khớp với tất cả các file .jsp trong thư mụcduong/danduong/dan/**/index.jsp— khớp với tất cả các fileindex.jspnằm trongduong/danorg/springframework/**/*.jsp— khớp với tất cả các file .jsp nằm dướiorg/springframeworkorg/**/service/abc.jsp— khớp vớiorg/springframework/service/abc.jspvàorg/abc/service/abc.jspduong/dan/{tenfile:\\w+}.jspsẽ khớp vớiduong/dan/test.jspvà gán giá trịtestcho biếntenfile
Lưu ý: Để hai mẫu khớp với nhau, cả mẫu và đường dẫn đều phải tuyệt đối hoặc tương đối. Do đó, người dùng nên chuẩn hóa các mẫu bằng cách thêm dấu "/" ở đầu khi cần thiết.
Các trường hợp đặc biệt
/**— chuỗi đặc biệt, khớp với mọi đường dẫn**— chuỗi đặc biệt, khớp với mọi đường dẫn/thu_muc/**— khớp với mọi đường dẫn bắt đầu bằng/thu_muc/
Ví dụ về AntPathRequestMatcher
public AntPathRequestMatcher(String mau, String phuongThucHttp, boolean phanBietChuHoa, UrlPathHelper troGiupDuongDan) {
KiemTra.kiemTraText(mau, "Mẫu không được null hoặc rỗng");
this.phanBietChuHoa = phanBietChuHoa;
if (!mau.equals("/**") && !mau.equals("**")) {
if (mau.endsWith("/**") && mau.indexOf(63) == -1 && mau.indexOf(123) == -1 && mau.indexOf(125) == -1 && mau.indexOf("*") == mau.length() - 2) {
this.matcher = new AntPathRequestMatcher.SubpathMatcher(mau.substring(0, mau.length() - 3), phanBietChuHoa);
} else {
this.matcher = new AntPathRequestMatcher.SpringAntMatcher(mau, phanBietChuHoa);
}
} else {
mau = "/**";
this.matcher = null;
}
this.mau = mau;
this.phuongThucHttp = StringUtils.coText(phuongThucHttp) ? HttpMethod.valueOf(phuongThucHttp) : null;
this.troGiupDuongDan = troGiupDuongDan;
}
Áp dụng trong cấu hình bảo mật
Để bỏ qua kiểm tra CSRF cho các đường dẫn bắt đầu bằng /ngoai/:
public class CauHinhBaoMat extends WebSecurityConfigurerAdapter {
@Override
public void cauHinh(HttpSecurity http) throws Exception {
http.httpBasic().disable();
http.csrf().boQuaCacMauAnt("/ngoai/**")
.va().uyQuyenYeuCau().antMatchers("/**").phepToanBo();
super.cauHinh(http);
}
}