2008-09-05 34 views

Trả lời

12

Quickie

Nếu bạn đang sử dụng quan điểm đồng bằng JSP (như là phổ biến nhất), sau đó chỉ cần thêm

<% response.setStatus(403); %> 

nơi nào đó trong tập tin nhìn của bạn. Ở trên cùng là một nơi tốt đẹp.

chi tiết

Trong MVC, tôi sẽ luôn đặt này trong giao diện, và trong nhiều trường hợp với mùa xuân-MVC, sử dụng SimpleMappingExceptionResolver để trình bày quan điểm đúng để đáp ứng với một ngoại lệ thời gian chạy ném.

Ví dụ: tạo và ném PermissionDeniedException trong bộ điều khiển hoặc lớp dịch vụ của bạn và có điểm giải quyết ngoại lệ cho tệp xem permissionDenied.jsp. Tệp xem này đặt trạng thái 403 và hiển thị cho người dùng một thông báo thích hợp.

Trong mùa xuân tập tin đậu XML của bạn:

<bean id="exceptionResolver" 
     class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
    <props> 
     <prop key="PermissionDeniedException">   
     rescues/permissionDenied 
     </prop> 
     ... set other exception/view mappings as <prop>s here ... 
    </props> 
    </property> 
    <property name="defaultErrorView" value="rescues/general" /> 
</bean> 

<bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/views/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

Nếu bạn cần phải thực hiện một cơ chế đăng nhập người dùng, hãy xem Spring Security (trước đây là Acegi Security).

+0

Tại sao response.setStatus lại cần thiết? Theo sau đáp ứng (trong Tomcat), có vẻ như có sự phát triển strage của mã phản hồi http của phản hồi - nó là 200 đầu tiên (mặc định), sau đó di chuyển đến 404 (vì lợi ích của đối số) khi Spring DispatcherServlet xử lý ngoại lệ xử lý, sau đó, khung nhìn được hiển thị và mã được đặt thành 500 (là lạ), và sau đó, setStatus thực sự khắc phục sự cố bằng cách hoàn nguyên mã phản hồi về 404. – Eugen

5

bạn có thể sử dụng response.setStatus (403) không?

+0

Điều đó có hiệu quả đối với tôi. – Jamesla

+0

@ John liên kết được cung cấp thật đáng buồn là không còn làm việc – BBerry

+0

@BBerry cảm ơn vì đã thông báo, nó đã bị xóa. 8 năm sẽ làm điều đó để liên kết. –

12

Sử dụng ExceptionResolver là một cách tuyệt vời để thực hiện, nhưng nếu bạn chỉ muốn tính năng này độc lập với chế độ xem, bạn có thể thực hiện cuộc gọi đến response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable"); trong Bộ điều khiển của mình.

17

Tạo ngoại lệ được chú thích với @ResponseStatus ví dụ: như thế này:

@ResponseStatus(HttpStatus.FORBIDDEN) 
public class ForbiddenException extends RuntimeException { 
} 

Bây giờ chỉ cần ném ngoại lệ đó trong phương pháp xử lý của bạn và phản ứng sẽ có tư cách 403.

19

Bạn cũng có thể chỉ cần ném

org.springframework.security.access.AccessDeniedException("403 returned"); 

này trả về một 403 trong phản ứng tiêu đề.

+1

Công cụ này hoàn hảo và cần câu trả lời được chấp nhận bởi vì nó linh hoạt nhất. – Heady

+0

@Heady: Không thực sự là câu trả lời hay nhất vì nó tạo ra sự phụ thuộc mạnh mẽ với Spring Security. Câu trả lời của Joe, để tạo ra Ngoại lệ của riêng bạn, là IMO tốt nhất. Tôi vẫn upvoted rằng một vì nó là một thay thế khá. –

+0

Điều này trả về 500 cho tôi. – heez

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