`
weina
  • 浏览: 142732 次
  • 性别: 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;
}

分享到:
评论

相关推荐

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

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

    SSH + ajax + acegi

    本系统有更新版本,请用关键字struts spring hibernate acegi jotm等搜索新版本

    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 、激发事件等等。 • 更简洁的配置 官方的数据说同一个 ...

    Hibernate+Struts+Spring

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

    spring hibernate struts实现的精品课程网

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

    良葛格java学习笔记

    常見程式演算,電腦圖學入門,設計模式,C 語言,GTK,C++,Qt3,Qt4,,Java (上),Java (下),JSP/Servlet,JSF,Ajax,JUnit,Struts,Spring,Hibernate,Acegi

    Grails 中文参考手册

    11.4.1 Acegi 11.4.2 JSecurity 12 插件 12.1 创建和安装插件 12.2 理解插件的结构 12.3 提供基础的工件 12.4 评估规约 12.5 参与构建事件 12.6 参与运行时配置 12.7 运行时添加动态方法 12.8 参与自动重载 12.9 ...

    JAVA上百实例源码以及开源项目

    第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码...

    Grails权威指南

    第1章 寻找grails之旅  1.1 java的困惑  1.2 webc2.0时代  1.3 java的力量  1.4 什么是grails ... 11.5 在grails中使用acegi  11.6 使用xfire创建soap服务  11.7 本章小结

    Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    14.3 Grails对Ajax的支持 182 14.4 本章小结 184 第15章 实现Web Service 185 15.1 REST风格的Web Service 185 15.1.1 什么是REST 185 15.1.2 在Grails中实现REST 185 15.1.3 在Client端调用服务 187 15.2 基于SOAP...

    DWR中文文档.pdf

    web.xml配置 13 2.1 主要配置 13 2.2 常用参数列表 14 2.2.1 安全参数 14 2.2.2 Ajax服务器加载时保护参数 14 2.2.3 其他参数 15 2.3 日志配置 16 2.4 多个dwr.xml配置和J2EE角色定义 ...

    java开源包1

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包11

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包2

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包3

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包6

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包5

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

Global site tag (gtag.js) - Google Analytics