Để phân biệt, ta cần nhớ rằng JDK là một gói các công cụ pháttriển phần mềm dựa trên Java, trong khi JRE là gói công cụ sử dụng để chạy Java code.. JRE có thể được sử dụng như một thành
Trang 1BỘ TÀI NGUYÊN VÀ MÔI TRƯỜNG TRƯỜNG ĐẠI HỌC TÀI NGUYÊN VÀ MÔI TRƯỜNG
KHOA: HỆ THỐNG THÔNG TIN VÀ VIỄN THÁM
ĐỒ ÁN MÔN HỌC BẢO MẬT MẠNG MÁY TÍNH VÀ HỆ THỐNG NGHIÊN CỨU GIẢI PHÁP ĐẢM BẢO AN TOÀN CHO RESTFUL API VỚI SPRING BOOT TRÊN CƠ SỞ DỮ LIỆU MONGODB.
………
Giảng viên hướng dẫn: ThS Phạm Trọng Huynh
Sinh viên thực hiện: Hà Thị Thùy Trang
Phạm Lê Nhật Quang
Lớp: 08_DHCNPM
Khóa: 08
TP Hồ Chí Minh, tháng 10 năm 2022
Trang 2BỘ TÀI NGUYÊN VÀ MÔI TRƯỜNG TRƯỜNG ĐẠI HỌC TÀI NGUYÊN VÀ MÔI TRƯỜNG
KHOA: HỆ THỐNG THÔNG TIN VÀ VIỄN THÁM
ĐỒ ÁN MÔN HỌC BẢO MẬT MẠNG MÁY TÍNH VÀ HỆ THỐNG NGHIÊN CỨU GIẢI PHÁP ĐẢM BẢO AN TOÀN CHO RESTFUL API VỚI SPRING BOOT TRÊN CƠ SỞ DỮ LIỆU MONGODB.
………
Giảng viên hướng dẫn: ThS Phạm Trọng Huynh
Sinh viên thực hiện: Hà Thị Thùy Trang
Phạm Lê Nhật Quang Trần Bá Thiện
Lớp: 08_DHCNPM
Khóa: 08
TP Hồ Chí Minh, tháng 10 năm 2022
Trang 3MỞ ĐẦU
Trang 4LỜI CẢM ƠN
Em xin chân thành cảm ơn thầy Phạm Trọng Huynh, Giảng viên môn bảo mật mạng máytính và hệ thống trường Đại học Tài nguyên và Môi trường Thành phố Hồ Chí Minh đãcung cấp cho tôi những kỹ năng cơ bản và kiến thức cần thiết để hoàn thành nhiệm vụ dự
án này
Tuy nhiên, trong quá trình làm đề tài, do kiến thức chuyên môn còn hạn chế của em, chắcchắn sẽ không tránh khỏi những thiếu sót trong việc nêu và đánh giá vấn đề Em rất mongđược sự đóng góp ý kiến, đánh giá của các thầy cô giáo bộ môn để khóa luận của emđược hoàn thiện hơn Chân thành cảm ơn!
Trang 5NHẬN XÉT
ĐIỂM
Trang 7Chương 1 Giới thiệu đồ án
1.1 Định nghĩa vấn đề
Ngày này hệ thống Internet ngày càng phát triển, phần mềm sử dụng hệ thống internet ngày càng nhiều Các phần mềm đa dạng dẫn đến có rất nhiều yêu cầu cần được đáp ứng Một số phần mềm đòi hỏi về lượng thông tin lớn, dữ liệu lớn… nhưng không thể lưu dữ liệu đó tại thiết bị sử dụng, một số loại yêu cầu được cập nhật realtime (theo thời gian thực) để đảm bảo sự đúng đắn của thông tin (chứng khoán, tiền tệ ), một số phần mềm đòi hỏi xử lý nhanh và mạnh, mà các thiết bị lại không thể thực hiện được
do cấu hình không đủ Thông thường, để sử dụng các dịch vụ đó thì người dùng cần dùng trình duyệt, truy cập website và thực hiện Nhưng người dùng chỉ có thể sử dụng các giao diện mà nhà cung cấp đã thiết kết sẵn tuy nhiên chúng không đáp ứng những mong muốn của người dùng Để giải quyết vấn đề trên chúng ta cần xây dựng một ứng dụng có các tính năng như các dịch vụ đó nhưng giao diện thân thiện hơn Vì vậy cần phải sử dụng những dịch vụ riêng biệt để tương tác với hệ thống cung cấp các dịch
vụ nói trên Một hệ thống như vậy được gọi là API.
1.2 Phạm vi của đồ án
1.3 Mục tiêu, sự cần thiết của đề tài, tại sao lại chọn đề tài này?
Trang 8Chương 2 Tìm hiểu JDK 8, Gradle, Spring Boot, Spring data mongodb
2.1 JDK là gì?
Java Development Kit (JDK) là một trong ba gói công nghệ cốt lõi được sử dụng
trong lập trình Java, cùng với JVM (Máy ảo Java - Java Virtual Machine) và JRE (JavaRuntime Environment - Môi trường Java Runtime) Việc phân biệt giữa ba công nghệnày, cũng như hiểu được cách chúng kết nối với nhau là rất quan trọng
JVM là thành phần Java nền tảng để chạy các chương trình
JRE là phần on-disk của Java, phần tạo ra JVM
JDK cho phép các developer tạo các chương trình Java, trong đó các chương trình
có thể được JVM và JRE xử lý và chạy
Các developer khi mới sử dụng Java thường dễ nhầm lẫn Java Development Kit với JavaRuntime Environment Để phân biệt, ta cần nhớ rằng JDK là một gói các công cụ pháttriển phần mềm dựa trên Java, trong khi JRE là gói công cụ sử dụng để chạy Java code
JRE có thể được sử dụng như một thành phần độc lập để chạy các chương trình Java, dùvậy, JRE vẫn là một phần của JDK JDK đòi hỏi bộ công cụ JRE vì chạy các chươngtrình Java là một phần của việc phát triển chúng
Chia sẻ JDK theo 2 cách như sau:
Định nghĩa chuyên ngành: JDK là một hệ tiêu chuẩn trong việc triển khai nền tảng Java,
bao gồm các trình thông dịch dịch và thư viện lớp
Định nghĩa thông thường: JDK là gói phần mềm bạn tải xuống để tạo các ứng dụng dựa
trên Java
2.2 IDK 8
Java Development Kit 8 (JDK – Bộ công cụ cho người phát triển ứng dụng bằng ngônngữ lập trình Java) là một tập hợp những công cụ phần mềm được phát triển bởi Sun
Trang 9Microsystems dành cho các nhà phát triển phần mềm, dùng để viết những applet Java haynhững ứng dụng Java – bộ công cụ này được phát hành miễn phí gồm có trình biên dịch,trình thông dịch, trình giúp sửa lỗi (debugger, trình chạy applet và tài liệu nghiên cứu).
Kể từ khi ngôn ngữ Java ra đời, JDK là bộ phát triển phần mềm thông dụng nhất choJava Ngày 17 tháng 11 năm 2006, hãng Sun tuyên bố JDK sẽ được phát hành dưới giấyphép GNU General Public License (GPL), JDK trở thành phần mềm tự do Việc này đãđược thực hiện phần lớn ngày 8 tháng 5 năm 2007 và mã nguồn được đóng góp choOpenJDK
Java Development Kit 8 là một bộ bao gồm các công cụ cần thiết trong quá trình pháttriển các ứng dụng Java + JRE Các công cụ đó là: javac.exe, java.exe, applet viewer,…vai trò của từng công cụ như sau:
Javac.exe – giúp biên dịch các file nguồn viết bằng ngôn ngữ Java (*.java) thành
mã máy (byte code)
Java.exe – gọi tới JRE, tải nạp các file mã máy đã được biên dịch và gọi tớimethod main để thực thi các mã đó
Applet Viewer – để chạy các ứng dụng viết bằng applet
Như vậy JDK cung cấp tới bạn bộ công cụ trọn gói để phát triển các ứng dụng Java baogồm: phát triển (kết quả là các file java) –> biên dịch (kết quả là các file class) –> thựcthi ứng dụng
Yêu cầu phần mềm / Cấu hình:
Windows XP/Vista/7/8
Trang 102.3 Giới thiệu Gradle
Trong quá trình phát triển phần mềm, việc tự động hóa quá trình build và quản lý các thưviện rất quan trọng, nhằm tối ưu hóa công đoạn biên dịch, đóng gói; thuận tiện hơn choviệc phát triển phần mềm, cũng như maven và gradle cũng là một trong những công cụ đó
Năm 2000, Apache Ant ra đời như là một trong những tool đóng gói hiện đại vànhanh chóng được sử dụng trong các dự án sử dụng ngôn ngữ Java Ant cho phépnhà phát triển mô tả meta-data của dự án cũng như các hoạt động trong quá trìnhbuild thông qua bộ cú pháp XML Tuy nhiên những đoạn mã viết theo tiêu chuẩncủa Ant quá dài và phức tạp
Năm 2004, Apache Maven ra đời và đưa ra các cải thiện so với Ant Bằng việcđưa ra một cấu trúc dự án tiêu chuẩn, Maven cho phép nhà phát triển sử dụng mộttrong các plugin của mình thay vì phải viết toàn bộ các dòng code mô tả quá trìnhđóng gói Ngoài ra Maven còn cho phép tải về các thư viện phụ thuộc thông quainternet, điều này giúp cho việc chia sẻ cũng như quản lý phiên bản trở nên dễdàng hơn Đổi lại, nhà phát triển sẽ mất khá nhiều công sức để tùy chỉnh nếu cấutrúc dự án hiện tại không tuân theo Maven Standard Directory Layout Và việc vẫn
sử dụng XML làm cho file POM (Project Object Model) trở nên dài dòng và phứctạp để nắm bắt logic
Gradle kết hợp các ưu điểm của Ant và Maven đồng thời thêm vào các cải thiệnmới và sử dụng Groovy trong việc giải quyết bài toán đóng gói
2.4 Các ưu điểm của gradle
Gradle kết hợp các ưu điểm của Ant và Maven đồng thời đem lại các cải thiện mớithông qua việc sử dụng Groovy (một trong những ngôn ngữ JVM) trong việc giảiquyết bài toán đóng gói Nhờ vậy build script viết bằng Gradle trở nên ngắn gọn
và trực quan dễ đọc hơn
Trang 11 Ngoài việc sử dụng Groovy làm DSL, Gradle cũng chú ý hỗ trợ thêm snhiều tínhnăng khác để cải thiện quá trình đóng gói cũng như tăng năng suất cho nhà pháttriển Đối với các dự án lớn, việc có nhiều module bên trong phụ thuộc lẫn nhau làhết sức phổ biến Khi sử dụng Maven, quá trình build diễn ra lâu do quá trìnhclean toàn bộ các artifact và sau đó là quá trình đóng gói lại từ đầu, đồng thời thờigian chạy các đoạn Unit Test cũng tiêu tốn khá nhiều thời gian Đối với Gradle, domột task build (một đơn vị logic của một quá trình build) đều được định nghĩainput và output, nên khi có sự thay đổi nhỏ trong source code, Gradle sẽ chỉ thựchiện build lại một phần cần thiết Đặc biệt, Gradle sẽ tự tìm kiếm các task khác lệthuộc task này và thực hiện quá trình build lại Như vậy, tốc độ build của Gradle
sẽ được rút ngắn Hơn thế nữa, Gradle cho phép chạy parallel các đoạn code testnhờ đó rút ngắn thời gian của quá trình build Trong tương lai, Gradle cho phépthực hiện việc phân phối các đoạn code test qua nhiều machine khác nhau để giảmthiểu thời gian chờ đợi Đồng thời điểm khác biệt lớn so với Maven là thay vìdừng quá trình build ngay khi gặp lỗi, Gradle sẽ thực thi hết tất cả các task có thể
và tổng hợp toàn bộ các lỗi gặp phải trong một lần đóng gói Nhà phát triển sẽkhông phải chờ đợi quá lâu để build và gặp lỗi, sửa lỗi và build lại
2.4.1 Build cho nhiều ngôn ngữ.
Gradle hỗ trợ build cho nhiều ngôn ngữ lập trình khác nhau bao gồm Java, Scala,Python, C/C++, Android, iOS
Được thiết kế để chạy trên JVM, Gradle hỗ trợ mạnh mẽ cho các dự án viết bằngJava và các ngôn ngữ JVM khác như Scala, Groovy, với việc hỗ trợ nhiều loạiứng dụng và công cụ phát triển thiết yếu như test frameworks (JUnit, TestNG,Spock), application frameworks (Java EE, Grails, Play!), embedded web servers(Jetty) and code analysis cops (Checkstyle, CodeNarc, FindBugs, JDepend, PMD,JaCoCo, Sonar)
Trang 12 Tích hợp với Android Studio hỗ trợ quản lý dependency, multi-project Đồng thờitích hợp các test services phổ biến như AppThwack, TestDroid và Manymo Ngoài
ra, có thể tạo nhiều APK từ 1 module và upload chúng lên Google Play và các appstore khác với các phiên bản khác nhau (free, paid, )
Hỗ trợ compiler, assembler và linker; cho phép phân phối các thư viện, file thựcthi với nhiều loại (debug, release), platforms (x86, x86_64), phiên bản(community, enterprise) khác nhau Tích hợp GCC, CLANG, XCODE, VISUALC++ …
Tích hợp công cụ: Từ các IDE (Integrated Development Environment) đến các CI(Continuous Integration) hay các công cụ deploy, Gradle tích hợp với tất cả mọithứ mà bạn có thể nghĩ đến tham khảo: https://gradle.org/why/integrates-with-everything/
Trang 13exclude group: 'org.hamcrest'
2.4.3 Giải pháp dependency tối ưu
Không bao giờ tải 1 artifact nhiều lần
Cache
Xác minh qua checksum
Track nguồn gốc dependency đảm bảo tính hợp lệ và ngăn chặn lỗi
2.5 So sánh với maven
2.5.1 Maven:
quá trình build diễn ra lâu do quá trình clean toàn bộ các artifact và sau đó là quátrình đóng gói lại từ đầu
các đoạn Unit Test cũng tiêu tốn khá nhiều thời gian
dừng quá trình build ngay khi gặp lỗi
Trang 142.7 Tạo và triển khai CRUD trong project Spring Boot
Ở thời điểm hiện tại Spring Boot có lẽ đang là framework nổi tiếng và được sử dụngnhiều bậc nhất trong phát triển các ứng dụng sử dụng ngôn ngữ Java Được xây dựng trênnền tảng Spring framework, nó có tất cả các tính năng của Spring cộng thêm những tiệních mà nó mang lại như giảm thiểu các bước cấu hình phức tạp, nhúng server container(Tomcat, Jetty hoặc Undertow) tự động vào ứng dụng giúp chúng ta có thể khởi chạy mộtứng dụng ngay lập tức, quản lý dependence thông minh,…
Trang 15Tất cả điều này đã tạo nên một sức lôi cuốn vô cùng lớn đối với cộng đồng developer trênkhắp thế giới, các công ty cũng đang dần chuyển sang dùng Spring Boot cho các dự ántiếp theo Lựa chọn học Spring Boot ở thời điểm hiện tại là một quyết định đúng đắn vìthị trường việc làm của nó đang rất nhiều Không chỉ vậy, hiện tại có nhiều công ty cũngđang dần chuyển từ Spring qua Spring Boot cho các dự án cũ và các dự án mới sẽ dùnghẳn Spring Boot.
Khởi tạo project spring boot
Để khởi tạo một project Spring Boot nhanh chóng các bạn có thể truy cập vào trangSpring Initializr và lựa chọn các thông số cấu hình cho dự án, cũng như các dependencycần thiết hoặc khởi tạo project maven với các dependency như sau:
Lưu ý: Nếu dùng Spring Initializr, các bạn có thể thêm các dependency này bằng cáchchọn “Add dependencies” ở tab “Dependencies”
Trang 16Cấu trúc project Spring Boot
Trong một project Spring Boot thường sẽ có các layer chính:
Domain: chứa các ánh xạ database – entity
Repository: định nghĩa các DAO (Data access object) class dùng để làm việc vớidatabase
Service: chứa các business logic class
Controller: nhận request từ client
Mapper: dùng để convert qua lại giữa entity và dto (không có cũng được)
Exception Hanlder: xử lý các exception xảy ra trong quá trình thực thi yêu cầu củaclient
Trang 17Dự án sau khi được hoàn thành sẽ có cấu trúc như thế này Bây giờ, chúng ta sẽ bắt đầu
đi từng phần một
Domain layer
Đối với hầu hết các dự án, chúng ta thường bắt đầu với domain layer trước, sau khi đãphân tích thiết kế cơ sở dữ liệu xong, chúng ta sẽ đến bước định nghĩa các entity ánh xạcác table tương ứng dưới database
Trong bài viết này, chúng ta dùng H2 database, các bạn có thể linh hoạt sử dụng cácdatabase khác như SQL, MySQL, Mariadb tùy ý Vì sử dụng JPA và JPA provider bêndưới là Hibernate nên có thể dễ dàng chuyển đổi qua lại giữa các database mà code
Trang 18không bị ảnh hưởng Trong khuôn khổ bài viết này, định nghĩa một User entity có thểlàm như sau:
Các entity class phải được chú thích với @Entity annotation, ngoài ra các annotationkhác của lombok được mình sử dụng để giảm thiểu việc triển khai các method getter,setter, constructor, …
Repository Layer
Đây là layer chúng ta định nghĩa các DAO class dùng để thao tác với database Tuynhiên, trong phần này, chúng ta không cần phải triển khai các method cơ bản như làfindById (), findAll, save (), delete(), update() vì chúng đã được triển khai thông qua mộttầng abstraction được đặt ở trên JPA implementation Để sử dụng các tính năng cơ bảnnày, chúng ta chỉ cần khai báo một Repository class thừa kế từ CrudRepository
Service Layer
Trang 19Như đã đề cập trước đó, Service layer sẽ là nơi chứa các business chính của dự án, là cầunối giữa Controller layer và Repository layer Với một ứng dụng CRUD thì chúng ta cần
ít nhất các method dùng cho việc thêm, sửa, xóa, cập nhật và tìm kiếm Trước tiên, chúng
ta cần định nghĩa một UserService Interface và một UserServiceImpl class dùng để triểnkhai các method định nghĩa trong UserService
và
Các bạn thấy cách làm này có “kỳ cục” không? Tại sao chúng ta không tạo luônUserService class rồi triển khai code trong đó? Điều này hoàn toàn được, tuy nhiên cácbạn cần phải biết đây là một cách làm giúp tăng tính mở rộng code
Giả sử, hiện tại chúng ta đang có UserService và UserServiceImpl hoạt động ổn Về saunày, chúng ta cần chỉnh sửa một số tính năng trong UserServiceImpl để tăng performancehoặc adapt cho phù hợp với business mới Nhưng do UserServiceImpl đã được phát triểnqua một thời gian dài, nên việc sửa code trong này rất khó khăn, lúc đó, chúng ta có thểtạo ra một UserServiceImplNew mới cũng như implement UserService và triển khai codetách bạch khỏi UserServiceImpl Sau đó, chúng ta chỉ cần thay đổi việc sử dụngUserServiceImplNew thay vì UserServiceImpl mà không cần chỉnh sửa code ở nhữngchỗ khác
Trang 20Những chỗ khác đang sử dụng UserServiceImpl mà không có nhu cầu chỉnh sửa thì vẫn
có thể sử dụng, do không có chỉnh sửa gì trên UserServiceImpl nên chúng ta yên tâm làcác tính năng sẽ vẫn hoạt động như cũ
Trang 21Với hàm update(), client cần truyền cho chúng ta ID của user muốn cập nhật và một Userobject chứa các thông tin được cập nhật.