`

Acegi(十一): 借鉴Acegi的Exception的异常处理

阅读更多

   今天改项目中的一个问题时, 不由自住地想到了Acegi异常处理. 现在相比项目中的异常处理后, 很是感叹Acegi对异常的处理呀.
    先大致回忆下Acegi里的异常处理. 这里说Acegi的异常处理是指围绕ExceptionTranslationFilter展开的, 当然别的地方也有,暂时不做考虑.
     Acegi配置中在filterInvocationInterceptor前加了一个 exceptionTranslationFilter, 这样在整个方法调用栈里, exceptionTranslationFilter的doFilter是比filterInvocationInterceptor要低一层的, 而filterInvocationInterceptor的doFilter是很有可能抛出多种异常的, 这些异常即包含Acegi自身的认证时异常和权限不够异常,也包含Serlet规范中可能抛出ServletException或 IOException. 不过filterInvocationInterceptor自身并没有处理任何异常,  不管有什么异常都采取顺其自然的方式,而且它自己还抛出了AuthenticationException和AccessDeniedException 两个异常.
    异常由谁处理呢? 交给exceptionTranslationFilter来处理, 顾名思义, 这个Filter的本职工作就是来处理异常这些麻烦事的. 看源码, 我们知道, 这个filter除了异常处理外什么事都不做. 由handleException这个方法来专门跟来自filterInvocationInterceptor的异常打交道.
    这样做有什么好处? 好处大大的, 解耦合, "冲锋陷阵"的"冲锋陷阵",做"后勤"的做"后勤", 大家各司其职,有条不紊, 这样两方都能发挥出最大作用.最终的整体作战效果也会出奇地好.

    再看项目中的一个小例子, 看如下代码:
        

protected String sendAlertMessage(String to,String subject,String msg,String from) {
        SimpleMailMessage mailMessage = createMessage(to,subject, msg,from);
        try{
            mailEngine.sendEmail(mailMessage);
        }
        catch(MailException ex) {
            log.error(ex.getMessage());
            return ex.getMessage();
        }
        return "1";
}
 

   这段代码是用来发邮件的, 我们看下这里的异常处理. mailEngine的sendEmail会抛出异常的, 看了下文档它的抛出的异常为MailException, 而MailException有四个子类: MailAuthenticationException,MailParseException,MailPreparationException, MailSendException.而这里都给catch住了, 只把异常的message以String类型返回, 这样sendAlertMessage方法的调用者要想知道是邮件发送失败的原因就得烦些周折了. 本来MailException及其子类有很丰富的异常信息, 但由于sendAlertMessage方法的越俎代庖,画蛇添足了.
    现在假设这样一种情况, 程序要发邮件, 可收件人的地址不存在, 系统要求把报错信息反馈给终端用户, 即显示信息"由AAA发送给BBB的邮件,由于BBB的email不存在而发送失败", 这里为了更友好地显示, AAA用的是Ta的真名,而没有用Ta的邮件地址. 为了显示这样的报错信息, 调用sendAlertMessage就麻烦大了,因为这里是没有AAA的真名的.

    于是我们想,能不能像Acegi里处理异常那样用一个单独的方法来做呢?  这样的设计显然是行的通的.

-----------后记-------------
    1, 初学Java时, 知道OOP时异常处理的优势. 可项目中或自己写代码时,很少能全局地考虑异常处理, 大多情况下,发现IDE里显示有异常没处理了,想也没多想地给catch住了, 现在看来,异常处理时学问不小.
    2, 这篇也是钻研Acegi以来,除Security方面外,感觉对自己面向对象帮助最大也最明显的一次, 也让自己小小窃喜了下.
    3, 其实是昨天发现项目中sendAlertMessage方法的不妙的, 当时也想写下来, 可老是理不出思路来. 今天做完头给安排的工作后,趁着情绪高涨,再回头看这个问题时, 一下就想到Acegi时的异常处理. 于是有了这篇还算说得过去的记录. 头脑要清醒,否则要放一放了. 遇到问题,不要急也不要气馁, 办法总是有的, 静下心一遍两遍地去看,会有线索的. 呵呵, 有点想小学生作文.

    4,  不要只想着成功,更要想着失败后的信息的反馈.好像大多数情况下, 失败考虑的很少.

分享到:
评论

相关推荐

    实战Acegi:使用Acegi作为基于Spring框架的WEB应

    而Acegi Security是Spring社区早期的一个安全模块,它提供了全面的身份验证、授权和会话管理功能,为基于Spring的应用程序提供了强大的安全性支持。本实战教程将深入探讨如何将Acegi Security集成到Spring框架中,...

    敏捷Acegi、CAS构建安全的Java系统(part2)共四part

    JAVA开发专家:敏捷Acegi、CAS:构建安全的Java系统 pdf

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf

    《实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架》这本书提供了一个很好的起点,它详细介绍了如何设置和使用Acegi,以及如何解决实际开发中的安全问题。 总的来说,Acegi为基于Spring的Web应用提供...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.rar

    6. **异常处理**:当安全检查失败时,Acegi会抛出相应的安全异常,开发者可以自定义这些异常的处理方式,如重定向到错误页面或显示定制的错误信息。 7. **记住我(Remember Me)服务**:Acegi提供了“记住我”功能...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架

    Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目,全称为Acegi Security System for Spring,当前版本为 0.8.3。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和...

    acegi

    - **身份验证(Authentication)**:Acegi 提供了多种身份验证机制,如基于密码的认证、LDAP认证等,确保只有合法用户能够访问系统资源。 - **授权(Authorization)**:Acegi 提供细粒度的权限控制,允许开发者...

    Acegi学习笔记(JAVA系统安全编程时用到)

    5. 异常处理(Exception Handling):处理安全相关的异常,如未授权访问。 在开始使用 Acegi 之前,你需要从 Acegi 的官方网站下载对应的程序库,例如版本为 1.0.3。这个版本中包含了与 Spring 1.2.8 版本兼容的 ...

    基于java的ACEGI

    6. **处理异常**:配置Acegi的异常处理机制,当用户尝试访问未授权的资源或认证失败时,提供适当的反馈。 Acegi虽然已被Spring Security取代,但它的设计理念和核心功能在Spring Security中得以延续和强化。理解...

    使用acegi控制用户权限实例

    6. **异常处理**:当访问控制失败时,Acegi Security会抛出相应的异常,你可以自定义异常处理器来处理这些异常,如重定向到错误页面或显示定制的错误信息。 7. **与Spring集成**:作为Spring的扩展,Acegi Security...

    Acegi例子代码+一个很好的学习Acegi的网址

    4. **过滤器安全链(Filter Security Interceptor)**:Acegi的核心组件之一,它是一个Spring MVC的过滤器,会在请求被处理之前检查用户的权限。如果用户没有足够的权限,过滤器将阻止请求的进一步处理。 5. **频道...

    Acegi(四):Acegi初体验及初解剖

    这篇博客的标题"Acegi(四):Acegi初体验及初解剖"表明我们将深入探讨Acegi的基础用法和内部机制。尽管Acegi已经被Spring Security所取代,但它的设计理念和核心功能对理解现代Java应用安全依然有价值。 首先,Acegi...

    spring Acegi例子,很简单的一个acegi实例,容易理解

    7. **异常处理**:当安全规则不满足时,Acegi会抛出相应的安全异常,这些异常可以被捕获并自定义处理。 8. **记住我(Remember Me)**:Acegi还提供了一种“记住我”服务,允许用户在一段时间内无须重新登录,增强...

    spring acegi 详细文档

    首先,Acegi的主要目标是保护Spring应用免受非法访问,它提供了丰富的功能来实现用户认证、会话管理、权限控制以及安全相关的异常处理。Acegi的核心组件包括`AuthenticationManager`、`AccessDecisionManager`和`...

    权限Acegi的使用

    6. **事件监听**:Acegi允许监听和处理安全相关的事件,如登录成功、失败,或者权限被拒绝等,开发者可以自定义处理这些事件的行为。 在实际应用中,我们通常会遵循以下步骤来使用Acegi: 1. **集成Acegi**:将...

    acegi-sample.rar_acegi

    Acegi框架内建了对各种安全异常的处理,例如认证失败、授权失败等,开发者可以通过自定义异常处理逻辑来定制错误页面或行为。 7. **集成其他Spring组件**: 作为Spring家族的一员,Acegi与Spring的其他模块(如...

    acegi应用安全J2EE安全

    5. **异常处理(Exception Handling)**:当安全规则不被满足时,Acegi Security会抛出相应的异常,这些异常可以被捕获并进行自定义处理,如重定向到登录页面或显示错误信息。 6. **与Spring的集成**:Acegi ...

    菜鸟-手把手教你把Acegi应用到实际项目中(1.2)

    7. **异常处理**:处理Acegi抛出的安全异常,比如未授权或未认证的异常。这通常涉及到创建自定义的`ExceptionTranslationFilter`。 8. **测试和调试**:在开发过程中,确保对安全配置进行充分的测试。使用Acegi提供...

    acegi-security-1.0.4.jar.zip

    4. **异常处理(Exception Handling)**:Acegi Security处理与安全相关的异常,如未授权(Unauthorized)和未认证(Not Authenticated)异常,提供了一种统一的方式来处理这些问题。 5. **过滤器链(Filter Chain)...

    spring的acegi应用

    4. **处理异常**:设置安全相关的异常处理,如未授权访问时的错误页面。 5. **集成其他安全特性**:如CSRF防护、记住我功能、会话管理等。 至于“工具”标签,可能意味着在实现Acegi安全功能时会用到一些辅助工具,...

    acegi安全策略与CAS整合

    - AceGI:AceGi Security,一个用于Spring Web应用的安全框架。 - CAS:Central Authentication Service,中心认证服务,提供单一登录解决方案。 - SSO:Single Sign-On,单点登录,用户只需登录一次就能访问所有...

Global site tag (gtag.js) - Google Analytics