2016-03-22 25 views
8

Tôi có ứng dụng Spring-mvc và trong mỗi bộ điều khiển, tôi thêm biểu mẫu vào SessionAttributes để giữ lại thuộc tính khi lưu, xóa hoặc thực hiện yêu cầu nhận khác. Vấn đề chính xảy ra khi tôi cố gắng mở một số liên kết trong một tab trình duyệt khác và cố gắng gửi liên kết đầu tiên. Tôi đã thử giải pháp this nhưng khi tôi thực hiện chuyển hướng (trong bộ điều khiển tôi chỉ có 1 lần trả lại để xem và các phương thức khác thực hiện chuyển hướng), nó tạo cuộc trò chuyện mới và không thể tìm thấy cuộc hội thoại trước đó.SessionAttributes khi mở tab trình duyệt mới

Tôi có một câu hỏi khác về vấn đề này để sử dụng phiên họp mùa xuân, câu hỏi Đó là here nhưng tôi không biết liệu điều này có hiệu quả hay không.

Trả lời

5

Bạn có nhìn vào số RedirectAttributes của Spring không? Tôi đã không sử dụng nó bản thân mình, nhưng nó có vẻ như nó nên làm những gì bạn muốn. Các thuộc tính RedirectAttributes thường được sử dụng cho các mẫu GET/redirect/POST và at least one user dường như nghĩ rằng các thuộc tính session truyền qua theo cách này là thực hành không tốt, tuy nhiên chúng tiếp tục đề cập đến dường như không có giải pháp nào tốt hơn. Dù sao, ví dụ trình bày trong tài liệu hướng dẫn:

@RequestMapping(value = "/accounts", method = RequestMethod.POST) 
public String handle(Account account, BindingResult result, RedirectAttributes redirectAttrs) { 
    if (result.hasErrors()) { 
     return "accounts/new"; 
    } 
    // Save account ... 
    redirectAttrs.addAttribute("id", account.getId()).addFlashAttribute("message", "Account created!"); 
    return "redirect:/accounts/{id}"; 
} 

sẽ làm tăng thêm những "thông điệp" thuộc tính đến một RedirectModel, và nếu điều khiển của bạn chuyển hướng, sau đó bất cứ phương pháp xử lý chuyển hướng thể truy cập dữ liệu như vậy:

@RequestMapping(value = "/accounts", method = RequestMethod.POST) 
public String handleRedirect(Model model) { 
    String message = (String) model.asMap().get("message"); 
    return new ModelAndView(); 
} 

Vì vậy, việc thêm thuộc tính phiên phải có thể theo cùng một cách. Tham chiếu khác here.

EDIT Tôi đã xem qua tài liệu Spring và họ cũng đề cập đến chú thích này @SessionAttributes. Từ tài liệu:

Chú thích loại @SessionAttributes tuyên bố thuộc tính phiên được sử dụng bởi trình xử lý cụ thể. Điều này thường sẽ liệt kê tên của các thuộc tính mô hình hoặc các kiểu thuộc tính mô hình cần được lưu trữ trong suốt trong phiên hoặc một số lưu trữ đàm thoại, phục vụ như là bean sao lưu mẫu giữa các yêu cầu tiếp theo.

Đây có phải là những gì bạn cần không?

Và cũng có thể a link to documentation on flash attributes.

+0

Vấn đề chính của redirectAttributes là tôi cần phải đặt tất cả các biến trong các thuộc tính riêng biệt nếu chúng không ở dạng html. – Raider

2

Đây là giải pháp chúng tôi đã đưa ra, không có gì để làm với mùa xuân:

  1. Trên mỗi hình thức html của ứng dụng của bạn, bạn sẽ phải bao gồm một trường ẩn. Hãy đặt tên trường này là CSRF_TOKEN. Trường này phải có giá trị được tạo ngẫu nhiên. Giá trị này được đặt cả trong phiên và trường ẩn. Tên của thuộc tính phiên là SESSION_CSRF_TOKEN

  2. Khi biểu mẫu được gửi tới máy chủ, bạn kiểm tra xem giá trị trong phiên (SESSION_CSRF_TOKEN) có bằng giá trị được gửi trong tham số yêu cầu HTTP CSRF_TOKEN hay không. Nếu không, bạn hiển thị một số loại thông báo lỗi và bạn ngừng xử lý. Nếu chúng bằng nhau, hãy tiến hành.

Nếu người dùng mở một tab mới hoặc bản sao một tab, máy chủ sẽ lại hiển thị trang và một CSRF_TOKEN mới sẽ được tạo ra. Vì vậy, người dùng sẽ chỉ có thể gửi biểu mẫu từ tab mới được mở và không phải từ bản gốc.

Giải pháp này cung cấp thêm phần thưởng: Nó bảo vệ từ CSRF attacks.

Các vấn đề liên quan