`

在Acegi认证框架下的ajax异步登录处理

    博客分类:
  • java
阅读更多
  JSF常用的开发框架JSF(myfaces/richfaces/a4j)+spring+(Hibernate+ibatis),系统的登录认证是通过spring中的acegi来实现的,acegi的认证要求登录表单的action路径包括特定的关键字符,例如:j_acegi_login,当然这个可以随意定义,只要acegi和登录表单中的一样就行了。acegi过滤器一旦发现访问的url中包括j_acegi_login,并会触发认证filter工作,认证的结果,会进行跳转成功或失败页面,页面会刷新跳转的。



      如果希望用ajax登录,也是通过acegi认证的方式处理,但认证结果不要求刷新跳转,而是通过ajax只刷新原登录页面上的部分信息就行,如何处理?下面讲解一下处理步骤:



第一步:增加AcegiAjaxFilter,用于截获登录表单的提交



public class AcegiAjaxFilter extends OncePerRequestFilter {
    private static final Log logger = LogFactory.getLog(AcegiAjaxFilter.class);
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain) throws ServletException, IOException {

        //检查提交的变量中是否有ajax变量,没有就直接交给acegi默认处理
        if (request.getParameter("ajax") == null;) {
            filterChain.doFilter(request, response);
            return;
        }

        RedirectResponseWrapper redirectResponseWrapper = new RedirectResponseWrapper(response);



        //acegi的filter chain处理认证,redirectResponseWrapper用于获取acegi认证处理后的跳转路径

        filterChain.doFilter(request, redirectResponseWrapper);

        if (redirectResponseWrapper.getRedirect() != null) {
            request.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain;charset=utf-8");

            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setHeader("Pragma", "no-cache");

            String redirectURL = redirectResponseWrapper.getRedirect();

            //创建JSONObject对象,用于返回认证结果,便于ajax页面局部刷新

            JSONObject json=new JSONObject();
           
            try{

                //在acegi认证失败跳转的url加上login_error=1

                //此外判断是否成功
                if (redirectURL.indexOf("login_error=1") == -1){
                    json.put("success",true);
                    //获取用户登录信息
                    LoginUser user= (User) request.getSession().getAttribute(Constant.ACEGI_SESSION_USER);
                   
                    if (user!=null ){
                        json.put("name",user.getName());
                        json.put("lastIp",user.getLastLoginIP());
                        json.put("lastTime",user.getLastLoginTime());
                        json.put("currIp",user.getCurrentIP());
                    }

                }else{//登录失败
                    json.put("success",false);
                    String errorMsg= ((AuthenticationException) request.getSession().getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage();
                    json.put("errorMsg",errorMsg);
                }

            }catch(JSONException e){
                logger.error("AcegiAjaxFilter JSONException");
                logger.error("message:"+e.getMessage());
            }catch(Exception e){
                logger.error("AcegiAjaxFilter Exception");
                logger.error("message:"+e.getMessage());
            }
            //把json数据写入response返回到页面
            response.getOutputStream().write(json.toString().getBytes("UTF-8"));

        }
    }
}



第二步:配置web.xml,确保acegiAjaxFilter的mapping在acegi filter的前面,mapping是有匹配顺序的



     <filter>
        <filter-name>acegiAjaxFilter</filter-name>
        <filter-class>com.aiplay.portal.web.filter.AcegiAjaxFilter</filter-class>
    </filter>



    <filter-mapping>
        <filter-name>acegiAjaxFilter</filter-name>
        <url-pattern>/j_acegi_security_check</url-pattern>
    </filter-mapping>

   ....



  <filter-mapping>
        <filter-name>Acegi Filter Chain Proxy</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>



第三步:修改acegi的配置文件



     authenticationProcessingFilter中的authenticationFailureUrl属性,在原来设定的url后面加上login_error=1,便于ajaxFilter捕获到;



   authenticationProcessingFilter中的filterProcessesUrl属性,要确保和acegiAjaxFilter的<filter-mapping>中设定的url-pattern,以及登录表单的action中的关键字符一样。



第四步:登录页面上利用jQuery和ajax进行处理



记得页面上要加载jquery.form.js库。



//用户登录 ajax实现
function ajaxLogin() {
     var options = {
        target:        '#loginMessage',   // target element(s) to be updated with server response
        beforeSubmit:  showWaitting,  // pre-submit callback
        success:       successHandler,  // post-submit callback
        dataType:  'json',        // 'xml', 'script', or 'json' (expected server response type)
        clearForm: true        // clear all form fields after successful submit
//        url:       'j_acegi_security_check'   // override for form's 'action' attribute
//        type:      'post',        // 'get' or 'post', override for form's 'method' attribute
//        resetForm: true        // reset the form after successful submit
//        timeout:   3000   // $.ajax options can be used here too, for example:
    };

    $('#loginForm').ajaxSubmit(options);
}

//提交之前执行,可以设定页面上出现等待符号

function showWaitting(formData, jqForm, options) {
    ....
    return true;
}

function successHandler(responseText, statusText, xhr, $form)  {



    //responseText是json object
    if(responseText.success){

        //登录成功处理

        ...
        $("#info1").html(responseText.name);
        $("#info2").html(responseText.lastIp);
        $("#info3").html(responseText.lastTime);

        $("#info3").html(responseText.currIp);


    }else{



       //登录失败处理
        ....
    }

}



第五步:登录表单中的配置



action中的url最后要包含和authenticationProcessingFilter中的filterProcessesUrl属性以及acegiAjaxFilter的<filter-mapping>中设定的url-pattern一样的字符,

这里假如设成:j_acegi_security_check



在表单中添加<input type="hidden" name="ajax"/>,上面第一步的AcegiAjaxFilter代码中有一段

if (request.getParameter("ajax") == null;) {
      filterChain.doFilter(request, response);
       return;
}

这是用于检查提交的表单是否要求acegiAjaxFilter来处理,毕竟有的系统中有多个登录页面,并不是所有的都要求ajax处理。

分享到:
评论

相关推荐

    SSH + ajax + acegi

    在SSH框架中,Ajax可以用于异步提交表单、实时更新数据等场景,提升应用的交互性。 Acegi(现称为Spring Security)是一个强大的安全管理框架,提供了认证、授权等功能,可以实现用户登录、权限控制、会话管理等...

    struts + spring + hibernate + velocity + ajax + jotm + acegi

    Struts、Spring、Hibernate、Velocity、Ajax、JOTM 和 Acegi 是一组常见的技术栈,它们在构建企业级Java Web应用程序时发挥着关键作用。这些技术各有专长,结合使用可以构建出高效、灵活且安全的系统。接下来,我们...

    mypro.rar_Acegi Appfuse2 _acegi_java 数据库_java 权限_数据权限控制

    本文将深入探讨如何利用Spring、Acegi框架以及Ext2.0库,结合MySQL数据库,构建一个高效、安全的数据权限控制系统。 首先,Acegi Security(现已被Spring Security取代)是Spring框架的一个扩展,专门用于提供全面...

    mavenSSH+Ajax2

    1. **异步通信**:Ajax 2 使用XMLHttpRequest对象发送异步请求,这意味着后台数据处理时,用户界面仍然保持活跃,提升了用户体验。 2. **JSON数据交换**:相比于XML,JSON(JavaScript Object Notation)在Ajax 2中...

    DWR中文文档--简单实用的小型Ajax框架

    - **问题提出**:解决DWR与Acegi的安全认证问题。 - **解决方案**:配置Acegi以兼容DWR。 #### 五、DWR中的JavaScript ##### 5.1 简单的回调函数 - **调用方法**:在客户端JavaScript中调用服务器端的方法,并...

    基于Java ssh框架开发的库存管理系统(Hibernate、 struts2、 spring、 jquery)

    - **用户认证和授权**:使用 Spring Security 或 Acegi 安全模块,实现用户的登录、权限控制。 - **库存管理**:包括商品入库、出库、盘点、库存预警等功能,使用 Hibernate 进行数据持久化。 - **供应商管理**:...

    JavaWeb开发权限问题

    在现代Web应用中,许多操作通过AJAX异步请求完成。处理AJAX权限问题时,可以返回特定的状态码或错误信息,前端根据这些信息进行相应的处理,如显示错误提示或重定向。 五、Shiro框架 Apache Shiro是另一个流行的...

    J2EEWeb应用程序的分析与设计

    标题和描述概述的知识点主要集中在J2EE Web应用程序的分析与设计上,涉及到了Web应用程序的架构、技术栈的选择、框架应用(包括Struts、Spring、Hibernate、Acegi、Ajax等),以及如何通过这些框架和技术增强应用...

    oa(关于权限部分)s2sh

    Spring Security(以前称为Acegi Security)是一个强大的安全框架,能够处理用户认证和授权。它允许开发者定义细粒度的访问控制规则,如基于角色的访问控制(RBAC),确保只有具有特定权限的用户才能访问特定资源。...

    Java ssh 权限系统 开发视频教程 第09讲(超清版).mp4

    8. **AJAX与动态权限**:现代Web应用常使用AJAX技术实现异步更新,SSH框架支持与jQuery、Dojo等库集成,实现权限动态加载和页面局部刷新,提高用户体验。 9. **单元测试与集成测试**:SSH框架的模块化设计使得测试...

    EasyUI框架实例

    在后台,我们需要定义处理Ajax请求的控制器方法,返回JSON数据。在前端,通过EasyUI的API调用这些接口,实现页面的动态更新。 3. **页面布局**:EasyUI提供了多种布局方式,如流式布局、网格布局等,可以根据需求...

    java聊天室 dwr推技术

    SSH2框架中的Spring Security(原Acegi)可以用来处理这些问题,它提供了用户认证和授权机制,确保只有合法用户才能发送和接收消息。 聊天记录的存储通常会使用数据库,如MySQL或Oracle,Hibernate可以通过ORM映射...

    Java相关技术

    Acegi,作为Spring Security的前身,是一款专为基于J2EE的企业级应用程序提供安全服务的框架,尤其适用于使用Spring框架开发的项目。它提供了七个核心组件: 1. **Authentication对象**:封装了Principal、...

    java c2c商城源码

    jQuery 是一个高效、简洁的JavaScript库,它极大地简化了DOM操作、事件处理、动画制作和Ajax交互。在前端,jQuery被用来提升用户体验,比如商品展示的动态加载、页面元素的交互效果,以及与后端的异步通信。 **5. ...

    Springside之开发bookstore心得

    - ActiveMQ:消息中间件,用于异步处理邮件发送等任务。 - Log4j:日志记录框架,记录业务日志。 - **数据库和工具**: - MySQL:替换原项目中使用的HSQLDB作为生产环境的数据库。 - Eclipse及插件:开发环境和...

    icefaces API

    ICEfaces 是一个开源的JavaServer Faces (JSF) 框架,专为构建富互联网应用程序(Rich Internet Applications,RIA)...通过深入学习官方文档,你可以逐步提升在ICEfaces框架下的开发能力,为你的项目增添更多可能性。

    Spring_Ext

    - **权限控制**:可能涉及到Spring Security或Acegi安全框架,实现用户登录、权限验证和访问控制。 5. **页面渲染**: - **ExtJS组件**:使用诸如按钮、表格、窗体等组件构建用户界面,实现动态交互效果。 - **...

    DWR2.0中文文档

    - **DWR与Acegi**:解决Acegi安全框架下DWR的权限问题。 #### DWR中的JavaScript - **简单的回调函数**:介绍如何使用DWR进行异步调用,并在调用完成后执行回调函数。 - **调用元数据对象**:元数据对象包含关于...

    java开源包1

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

Global site tag (gtag.js) - Google Analytics