2012-01-03 20 views
6

Trong hành động điều khiển của tôi, tôi đã cố gắng đặt contentType của phản hồi như dưới đây.grails response.addHeader hoặc setHeader là không thể trong bộ lọc khi response.setContentType được chạm vào trong hành động điều khiển

class MyController { 
    def rss = { 
     response.setContentType('text/xml') 
     //I even tried setHeader('contentType') and also render(contentType:'text/xml',...) 
     render(template:'/displayRss', model:[:]) 
    } 
} 

Trong bộ lọc tôi đã cố gắng để thiết lập các tiêu đề cho tất cả các bộ điều khiển và hành động params

class Filter { 
    def filters = { 
     all(controller:'*', action:'*'){ 
     after = { 
      response.setHeader('Cache-Control', 'no-cache') 
     } 
     } 
    } 
} 

header được thêm vào cho tất cả các hành động khác trừ các hành động trong đó phản ứng contentType được sửa đổi. Có vẻ như response.isCommitted() được trả về là true trong hành động đó một mình. Tôi không hiểu cơ bản về kết xuất ...?

Ngoài ra đây không phải là trường hợp nếu tôi sử dụng render (xem: '/ abc') thay vì view (mẫu: '/ abc', mô hình: [:])

Cảm ơn trước

Trả lời

1

Dường như việc hiển thị mẫu sẽ gửi mẫu ngay lập tức khi được gọi, vì nó hiển thị như đã được cam kết trong bộ lọc. Vì nó cam kết các tiêu đề đã được gửi và thiết lập một tiêu đề sau khi thực tế không có ý nghĩa, do đó, setHeader trong Bộ lọc bị bỏ qua.

Tôi đoán đây là sự khác biệt khi hiển thị mẫu cụ thể và trong những trường hợp đó, bạn cần đặt tiêu đề bộ nhớ cache trong tác vụ điều khiển một cách rõ ràng hoặc sử dụng hiển thị chế độ xem thay thế.

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