您可以在拒绝访问处理程序中进行重定向。
通常你的配置中会有这样的东西:
<http ..... >
...
<intercept-url method="GET" pattern="/groups" access="hasRole('VIEW_GROUPS')" />
<intercept-url method="GET" pattern="/admin" access="hasRole('VIEW_ADMIN')" />
...
<access-denied-handler error-page="/access-denied" />
</http>
URL /access-denied 通常显示拒绝访问页面。您可以将控制器注册到该 URL,然后如果用户具有角色“VIEW_ADMIN”,则可以签入控制器并将他重定向到那里。如果您需要知道用户试图访问哪个 URL,它应该在 HttpServletRequest 对象中可用。
编辑:通过拦截器的解决方案:
您可以创建一个 Spring MVC 拦截器。扩展 HandlerInterceptorAdapter 并在 preHandle 方法中检查用户是否已通过身份验证并检查角色并执行重定向。
class MyRoleBasedRedirectorInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//do the authentication/role/URL checks
...
if (needsAdminRedirect) {
response.sendRedirect("admin");
return false;
}
return true;
}
}
在配置中:
<mvc:interceptors>
<bean class="com.example.MyRoleBasedRedirectorInterceptor" />
</mvc:interceptors>
如果您不喜欢原始控制器解决方案,您还可以实现自己的 AccessDeniedHandler 实现并在那里进行检查。您将使用
<access-denied-handler ref="com.example.MyAccessDeniedHandler" />
我仍然会选择 Controller / AccessDeniedHandler 解决方案,因为如果我理解正确,重定向仅在用户无权访问“组”页面时发生。