当用户没有查看特定页面的权限时,我希望我的控制器返回正确的 HTTP 响应代码。
5 回答
你也可以扔
org.springframework.security.access.AccessDeniedException("403 returned");
这将在响应标头中返回 403。
创建一个带有@ResponseStatus注释的异常,例如:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {
}
现在只需在您的处理程序方法中抛出该异常,响应将具有状态 403。
匆匆
如果您使用的是纯 JSP 视图(这是最常见的),那么只需添加
<% response.setStatus( 403 ); %>
在您的视图文件中的某处。顶部是一个不错的地方。
细节
在 MVC 中,我总是在视图中设置它,并且在大多数情况下使用 Spring-MVC,使用SimpleMappingExceptionResolver
来呈现正确的视图以响应抛出的运行时异常。
例如:PermissionDeniedException
在您的控制器或服务层中创建并抛出一个,并让异常解析器指向一个视图文件permissionDenied.jsp
。此视图文件设置 403 状态并向用户显示适当的消息。
在您的 Spring bean XML 文件中:
<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>
如果您需要实现用户登录机制,请查看Spring Security(以前称为 Acegi Security)。
使用 anExceptionResolver
是一个很好的方法,但如果你只想让它独立于视图,你当然可以response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");
在你的 Controller 中调用 to。
使用这个:
response.setStatus(403)
。