Quy tắc ký tự đại diện của AntPathMatcher

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ới duong/dan/file.jsp cũng như duong/dan/aile.jsp
  • duong/dan/*.jsp — khớp với tất cả các file .jsp trong thư mục duong/dan
  • duong/dan/**/index.jsp — khớp với tất cả các file index.jsp nằm trong duong/dan
  • org/springframework/**/*.jsp — khớp với tất cả các file .jsp nằm dưới org/springframework
  • org/**/service/abc.jsp — khớp với org/springframework/service/abc.jsporg/abc/service/abc.jsp
  • duong/dan/{tenfile:\\w+}.jsp sẽ khớp với duong/dan/test.jsp và gán giá trị test cho biến tenfile

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);
    }
}

Thẻ: Spring Framework AntPathMatcher path matching wildcard security configuration

Đăng vào ngày 18 tháng 7 lúc 15:27