[Bài đọc] Session trong Spring MVC

10. Session&Cookie

1. @SessionAttributes Annotation

@SessionAttributes được sử dụng ở cấp độ lớp. Thông thường, nó được sử dụng trên lớp @Controller. Giá trị của ‘value’ là 1 kiểu String có tên phù hợp với tên được sử dụng trong @ModelAttribute ở cấp phương thức hoặc ở cấp tham số phương thức.

Xét đoạn mã sau:

@Controller
@SessionAttributes("visitor")
@RequestMapping("/trades")
public class TradeController {

    @ModelAttribute("visitor")
    public Visitor getVisitor (....) {
        return new Visitor(....);
    }
  ....
}

Trong đoạn mã trên, khi có yêu cầu, điều đầu tiên Spring sẽ làm là thông báo @SessionAttributes(‘visitor’) và sau đó cố gắng tìm giá trị của ‘visitor’ trong javax.servlet.http.HttpSession. Nếu nó không tìm thấy giá trị, thì phương thức với @ModelAttribute có cùng tên ‘visitor’ (phương thức getVisitor ()) sẽ được gọi. Giá trị được trả về từ phương thức đó sẽ được sử dụng để điền vào session có tên ‘visitor’.

Bây giờ, ‘visitor’ với giá trị của nó đã có trong HttpSession, xem xét đoạn mã sau:

@Controller
@SessionAttributes("visitor")
@RequestMapping("/trades")
public class TradeController {

    @RequestMapping("/**")
    public String handleRequestById (@ModelAttribute("visitor") Visitor visitor,
                                     Model model,
                                     HttpServletRequest request) {
        model.addAttribute("msg", "trades request, serving page " +
                request.getRequestURI());
        visitor.addPageVisited(request.getRequestURI());
        return "traders-page";
    }
   .......
}

Khi tìm thấy @ModelAttribute(“visitor”) trong phương thức xử lý, Spring sẽ lấy giá trị của ‘visitor’ từ session và sẽ gán giá trị cho tham số Visitor và sẽ gọi phương thức. Ở bước này, Spring chỉ yêu cầu @SessionAttributes(‘visitor’) , tham số phương thức xử lý với @ModelAttribute(“visitor”) và giá trị của ‘visitor’ trong HttpSession. Nếu Spring không thể tìm thấy nó trong session thì ngoại lệ sau sẽ được ném ra:

org.springframework.web.HttpSessionRequiredException: Expected session attribute 'visitor'

Sau đây là lớp Controller hoàn chỉnh:

@Controller
@SessionAttributes("visitor")
@RequestMapping("/trades")
public class TradeController {

    @RequestMapping("/**")
    public String handleRequestById (@ModelAttribute("visitor") Visitor visitor,
                                     Model model,
                                     HttpServletRequest request) {
        model.addAttribute("msg", "trades request, serving page " +
                request.getRequestURI());
        visitor.addPageVisited(request.getRequestURI());
        return "traders-page";
    }

    @ModelAttribute("visitor")
    public Visitor getVisitor (HttpServletRequest request) {
        return new Visitor(request.getRemoteAddr());
    }
}

2. @SessionAttribute Annotation

Nếu bạn cần quyền truy cập vào thuộc tính session có sẵn từ trước được quản lý toàn cục, tức là bên ngoài controller

(ví dụ: bằng filter), hãy sử dụng annotation @SessionAttribute trên một method parameter:

@RequestMapping("/")
public String handle(@SessionAttribute User user) {
    // ...
}

Leave a Reply

Your email address will not be published. Required fields are marked *