`
weina
  • 浏览: 144650 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

ajax 登陆 spring acegi

阅读更多

 如果希望用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;
}

分享到:
评论

相关推荐

    SSH + ajax + acegi

    SSH + AJAX + Acegi 是一个基于Java技术栈的Web应用开发框架组合,广泛应用于企业级应用的构建。SSH指的是Spring、Struts和Hibernate三个开源框架的首字母缩写,而Acegi则是Spring Security的前身,负责处理应用的...

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

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

    DWR2+EXTJS2.2+Hibernate3.3+Spring2+Acegi 综合管理系统(第三部分)

    Acegi是Spring框架的安全模块,后来被Spring Security(原名Spring Security Core)所取代。Acegi提供了基于角色的访问控制、会话管理、CSRF防护等功能,帮助开发者轻松实现应用的安全控制。在Spring2中,Acegi能够...

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

    通过Ajax技术,它能够与后台Spring服务进行异步通信,实现实时的数据更新和动态交互。 数据库方面,MySQL是一个广泛使用的开源关系型数据库管理系统,以其高性能、高可靠性而受到青睐。在本项目中,MySQL存储了用户...

    mavenSSH+Ajax2

    Spring Security(原名Acegi Security)是Java领域中广泛使用的安全框架,提供了全面的身份验证、授权和访问控制功能。Maven作为项目管理和构建工具,能够自动管理依赖、编译、测试、打包和部署等流程,极大地提高了...

    Practical Quick Start with Acegi Security

    Acegi安全框架作为Spring框架的一个重要子项目,提供了一套完整的安全解决方案,适用于基于Spring的企业级应用。本篇文章将根据提供的文件信息,深入探讨Acegi安全框架的核心功能与应用场景。 #### 二、为什么选择...

    Spring_Ext

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

    TsuyoshiYamamoto_Acegi On Grails

    What’s Acegi Security  How to use Acegi on Grails  using Grails Domain class  Beans to support Acegi on Grails  Grails Acegi Plugin ... Secure your Ajax  Secure your Service

    spring web flow demo

    • 与 Spring Security (原 Acegi Security )整合 只需将某个 flow 声明为“ secured ”,即可利用 Spring Security 来确定当前用户是否有权限运 行 flow 、激发事件等等。 • 更简洁的配置 官方的数据说同一个 ...

    spring mvc + maven+springsec

    **Spring Security (原名Acegi)** 是Spring生态中的一个安全框架,用于处理Web应用的安全问题,如认证、授权等。它提供了强大的功能,如支持多种认证方式(如用户名/密码、OAuth2等)、角色权限控制、CSRF防护等。...

    Hibernate+Struts+Spring

    在安全方面集成Spring的安全框架Acegi和最流行的Ajax技术。与其他框架相比,它提供了各种Web系统开发过程中都需要开发的一些功能,如登陆、用户密码加密,用户管理、根据不同的用户可以展现不同的菜单,同时还带有...

    Struts2.3.7+Spring3.2+Hibrenate4.1.8

    5. **Spring Security**: 前身是Acegi,提供身份验证和授权功能,保护应用程序安全。 **Hibernate4.1.8** Hibernate是一个流行的Java ORM(对象关系映射)框架,简化了数据库操作。在Hibernate4.1.8版本中: 1. **...

    spring-security-3.0.8

    - **AJAX支持**:对异步JavaScript和XML(AJAX)请求提供了全面的支持。 - **OAuth2整合**:支持OAuth2协议,便于与其他OAuth2服务提供商集成。 5. **最佳实践** - **最小权限原则**:确保用户只拥有完成任务所...

    spring hibernate struts实现的精品课程网

    spring+hibernate+struts+acegi+mysql实现,完整程序,包括前台、用户中心、后台,可以直接在tomcat下运行。数据库的表通过hibernate动态生成。此程序是我自己开发的,里面涉及到文件上传、分页、fckeditor编辑器、...

    Struts2 + Spring 2.5 + Hibernate 3.2 整合文档及事例程序

    例如,对于大型项目,可能还需要考虑Spring Security或Acegi进行权限控制,或者使用Quartz进行定时任务等。 通过学习和实践SSH整合,开发者可以掌握Java Web开发中的核心技术,为构建高效、稳定的企业级应用打下...

    AJAX学习资料之-DWR中文手册

    ### AJAX学习资料之-DWR中文手册 #### 一、引言与背景介绍 随着Web 2.0技术的兴起,Ajax作为一种重要的前端技术受到了广泛关注。它不仅提升了用户体验,还简化了开发过程。对于想要深入了解Ajax及其相关技术的...

Global site tag (gtag.js) - Google Analytics