Thứ Hai, 22 tháng 4, 2019

Sử dụng Session trong Struts 2.x Framework

Mục đích: Trong bài này chúng ta sẽ tìm hiểu các sử dụng và vận dụng Session hỗ trợ phân quyền và xác thực trong Struts 2.x Framework. Qua việc tìm hiểu này, chúng ta sẽ vận dụng chúng vào việc xây dựng ứng dụng cơ bản xác thực người dùng để thực hiện các chức năng trong hệ thống

Các kiến thức yêu cầu của bài này

Tool sử dụng

    • Tools sử dụng ở đây là Netbeans 8.x
    • JDK 8 update 66, JDK 8 update 172
    • Server: Tomcat 8.x
    • DBMS: SQL Server 2005 đến SQL Server 2017
    • Thư viện hỗ trợ: Driver kết nối database SQLServer (sqljdbc.jar hay sqljdbc4.jar), Struts2 Framework taglib
    • Tool Netbeans phải hỗ trợ Struts2

Tổng quan về các sử dụng Session trong Struts 2

  • Bản chất Session trong Web
    • Một vùng nhớ được Container cấp phát cho từng người dùng riêng biệt khi có yêu cầu.
    • Vùng nhớ có thời gian tồn tại từ khi nó được Container cấp phát cho đến khi nó hết thời gian tồn tại (thông thường là 30 phút theo cấu hình mặc định trong file web deployment descriptor – web.xml) cho đến khi nó bị đóng lại bởi người dùng, hay ứng dụng bị ứng deploy, hay server bị crash, hay người ta đóng trình duyệt
    • Kiểu dữ liệu được cấp phát cho vùng nhớ này trên bộ nhớ là HttpSession
  • Session trong Struts 2 Framework
    • Session trong Struts 2 Framework bản chất có kiểu dữ liệu là Map bởi vì nó được xây dựng để đơn giản hóa cho người dùng và hạn chế việc cung cấp các phương thức của Servlet API cho người dùng theo nghĩa là loại bỏ các thành phần Scope trong ứng dụng web đi
      • Việc này về mức độ là tối ưu cho việc thực hiện viết Unit Testing cho từng chức năng hay component cho ứng dụng vì nó chỉ là object thông thường và không còn bị lệ thuộc và Container của Web nữa.
    • Struts 2 đã xây dựng các interceptor để inject các đối tượng trong Servlet API vào bên trong các Action Class với các thành phần có đuôi là chữ Aware như là
      • SessionAware: các class interceptor này chỉ cho truy cập các attribute trong HttpSession và nó hoàn toàn không được implement từ HttpSession và không thể lấy được HttpSession như bản chất web đã nêu ở trên
      • Tương tự như ApplicationAware, RequestAware…
      • Tuy nhiên, các interceptor này truy cập các thành phần trong các Scope của Web Container theo cơ chế chế là lazily và việc đồng bộ sẽ mất một khoảng thời gian delay nhất định tùy theo máy tính server.
    • Bên cạnh đó, ngoài việc sử dụng các interceptor hơi phức tạp thì Struts 2 cũng cung cấp việc truy cập được HttpServletRequest không cần sử dụng interceptor thông qua ActionContext hay cụ thể hơn là ActionServletContext.
      • Thông qua đối tượng này chúng ta có thể lấy được request Object hay request Scope và từ đó có thể truy cập Session một cách dễ dànng
      • Tuy nhiên, cách này sẽ làm chúng ta có thể không sử dụng Unit Testing khi thực hiện testing cho từng module của ứng dụng
  • Chúng ta sẽ vận dụng 02 nội dung nêu trên về Session trong việc xây dụng ứng dụng cho người dùng với mục tiêu chức năng trong hệ thống chỉ được sử dụng khi xác thực được người dùng và người dùng phải vẫn còn thông tin ở phía Container
    • Khi vận dụng với Session được cung cấp sẵn trong Struts2, chúng ta chỉ thực hiện theo nguyên lý đó là tạo attribute để lưu trữ thông tin cần thiết và xác thực mọi thứ thông qua các attributes được lưu trữ trong session. Và để không còn xác thực thì chúng ta đi hủy attribute đó đi nhưng không hủy được session ở phía Container
    • Khi vận dụng access HttpSession thông qua ActionServletContext của Struts2 thì chúng ta sẽ làm đúng khái niệm về quản lý session trong ứng dụng web và có thể hủy được session ở phía Web Container.
    • Khuyết điểm giữa 02 phương pháp này đã được nêu ở nội dung trên. Việc lựa chọn là tùy thuộc vào ý niệm và quan điểm của quí vị

Xây dựng ứng dụng xác thực người dùng để xử lý chức năng với các yêu cầu đơn giản như sau

  • Yêu cầu
    • Cho phép xác thực người dùng vào trong hệ thống và lưu thông tin định danh của người dùng
    • Với mỗi chức năng tương tác cần xác định định danh người dùng có còn tồn tại hay không thì mới cho phép thực hiện. Nếu không tồn tại thì trình bày trang thông tin để người dùng nhập thông tin để xác thực
    • Database thể hiện thông tin người dùng có cấu trúc như sau

    • Quí vị tự nhập liệu để có thể kiểm tra trong quá trình xây dựng ứng dụng
    • Giao diện ứng dụng thực hiện sẽ theo tuần tự như sau

Click SignOut, rồi click nút Back trên trình duyệt, rồi click nút Search

 

 

 

  • Các bước thực hiện như sau
    • Bước 1: Thực hiện tạo project web application có add Struts2 Framework

    • Bước 2: Thực hiện tạo giao diện để nạp giá trị từ DB vào trang mua hàng để người sử dụng có thể lựa chọn
      • Thực hiện tạo kết nối DB động, cùng với thư viện hỗ trợ kết nối DB

      • Thực hiện tạo DAO để tương tác với Table trong DB

      • Thực hiện chức năng Login
        • Tạo giao diện

        • Tạo Struts Action và thực hiện chức năng xác thực và lưu trữ thông tin người dùng
          • Cách 1: Sử dụng Session trong Struts2 dùng ActionContext

          • Cách 2: Sử dụng ActionServletContext để truy cập HttpSession

        • Chúng ta thực hiện mapping Action đến các Result tương tứng thông qua tập tin struts.xml

      • Để đảm bảo mỗi chức năng sẽ phải xác định người dùng đang vẫn tồn tại trong session thì mới thực hiện. Trong phần này chúng ta sử dụng chức năng search làm demo và tương tự cho các tính năng khác (Việc implement cụ thể các tính năng này, quí vị có thể tham khảo nội dung trong các bài tương tự) – việc ở đây là chúng ta bổ sung ngữ nghĩa nếu còn session thì thực hiện chức năng, nếu session không tồn tại thì thực hiện chuyển ra trang login
        • Cách 1: Sử dụng session trong Action Context
          • Giao diện chức năng Search

          • Search Action

        • Cách 2: Sử dụng HttpSession lấy từ ServletActionContext
          • Giao diện của chức năng Search – tương tự như cách 1 ngoại trừ chỗ lấy thông tin từ session

            • Nếu chúng ta sử dụng dòng 17 như cách 1 thì ở lần đầu tiên login thành công thì Welcome khoảng trắng vì nó là lazily đến khi thực hiện các chức năng khác hay nhấn F5 thì giá trị từ HttpSession mới cập nhật đến session
          • Search Action

      • Thực hiện mapping struts như thông thường

  • Thực hiện, clean and build và deploy project để test. Kết quả sẽ tương ứng với nội dung ở đầu bài giới thiệu
  • Chúng ta nhận thấy việc khác nhau khi sử dụng HttpSession và Session trong Action Context

Chúc mừng quí vị đã hoàn tất việc sử dụng session trong việc đảm bảo phân quyền cho các tính năng trong ứng dụng. Hẹn gặp quí vị ở chủ đề khác

Không có nhận xét nào:

Đăng nhận xét