首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

《Spring Security3》第六章第四部分翻译(错误处理)

2012-10-15 
《Spring Security3》第六章第四部分翻译(异常处理)?理解和配置异常处理?我们能够看到ExceptionTranslationF

《Spring Security3》第六章第四部分翻译(异常处理)

?

理解和配置异常处理


?我们能够看到ExceptionTranslationFilter处理如下的场景:

<http auto-config="true" ...> <access-denied-handler error-page="/accessDenied.do"/></http>

?注意——还没完事呢,因为我们还没有将这个URL与任何的Spring MVC应用代码关联起来。我们需要在LoginLogoutController添加增强代码以处理这个URL,并推送一些有用的信息到model中供view展现给用户。

添加对AccessDeniedException处理的控制器

@Controllerpublic class LoginLogoutController extends BaseController{ // Ch 6 Access Denied @RequestMapping(method=RequestMethod.GET, value="/accessDenied.do"). public void accessDenied(ModelMap model, HttpServletRequest request) { AccessDeniedException ex = (AccessDeniedException) request.getAttribute(AccessDeniedHandlerImpl .SPRING_SECURITY_ACCESS_DENIED_EXCEPTION_KEY); StringWriter sw = new StringWriter(); model.addAttribute("errorDetails", ex.getMessage()); ex.printStackTrace(new PrintWriter(sw)); model.addAttribute("errorTrace", sw.toString()); }}

?注意的是,需要引用AccessDeniedHandlerImpl来获取request中指定名字的属性,它被用来临时存储当前request范围内的异常。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><jsp:include page="common/header.jsp"> <jsp:param name="pageTitle" value="Access Denied"/></jsp:include><h1>Access Denied</h1><p> Access to the specified resource has been denied for the following reason: <strong>${errorDetails}</strong>.</p><em>Error Details (for Support Purposes only):</em><br /><blockquote> <pre>${errorTrace}</pre></blockquote><jsp:include page="common/footer.jsp"/>

????????? 你可以看到我们使用了在控制器设置的模型属性errorDetails和errorTrace。尽管不是很漂亮,但是这个页面完成了它的任务即用通用的站点导航,将用户带到了站点的其它区域并给他们提供了导致出错的提示信息。

什么会触发AccessDeniedException

AccessDecisionManager,当配置的Voter投票拒绝访问——注意这可能在任何投票场景下

???????? 要记住的是,我们前面提到的ExceptionTranslationFilter是区分这两种类型异常的关键点,因为这关系到应用用户的请求和响应流程。

【注意过滤器链中在ExceptionTranslationFilter之前的那些过滤器。ExceptionTranslationFilter只会处理和响应过滤器链中在此之后的过滤器所抛出的异常。用户可能会感到迷惑,尤其是将自定义过滤器进行了不正确排序的时候,不明白为什么期望的行为与应用实际的异常处理不一致——在很多场景下,过滤器的顺序是原因所在。】

???????? 尽管内置的处理流程在大多数情况下是可预测且满足需要的,但有时候你会需要自定义异常处理,尤其是在引入基类异常的自定义子类时,这需要过滤器链的特殊处理。

AuthenticationEntryPoint的重要性

???????? AuthenticationEntryPoint(在ExceptionTranslationFilter我们看到它是工作流程中的一个辅助类)在处理未认证用户请求中很重要。当ExceptionTranslationFilter确定用户需要认证时,它请求AuthenticationEntryPoint以了解下一步要做什么。在基于form的认证中,o.s.s.web.authentication.LoginUrlAuthenticationEntryPoint负责将用户定向到登录form。

???????? 我们将会在后面的章节中看到AuthenticationEntryPoint被用在各种认证机制中,从而实现更个性化的行为——例如,在中心认证服务(CAS)单点登录中,AuthenticationEntryPoint要确保用户被定向到CAS门户进行认证。

???????? 在很多环境下,当实现SpringSecurity与第三方认证系统(独立于web应用)集成时,你需要实现自己的AuthenticationEntryPoint。

1 楼 shizhijie737 2011-10-31   “用户已经尚未登录”改成“用户尚未登录”

热点排行