`

spring security 3 实现异步登录

 
阅读更多

1》 实现过滤器

/**
 *
 */
package ******************;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
import org.springframework.security.web.context.HttpSessionContextIntegrationFilter;
import org.springframework.web.filter.OncePerRequestFilter;

import flexjson.JSONSerializer;

/**
 * function:
 *
 * @author LJ
 *
 */
public class LoginAjaxFilter extends OncePerRequestFilter {

    private static final Logger log = LoggerFactory
            .getLogger(LoginAjaxFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest request,
            HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        // 检查提交的变量中是否有ajax请求的变量,如果没有,则不是ajax的登录请求,则走默认的请求。

        if (!isAjaxRequest(request)) {
            filterChain.doFilter(request, response);
            return;
        }

        log.debug("AjaxSecurityFilter: Processing an AJAX call : "
                + request.getRequestURL());

        RedirectResponseWrapper redirectResponseWrapper = new RedirectResponseWrapper(
                response);

        filterChain.doFilter(request, redirectResponseWrapper);

        Map<String, String> map = new HashMap<String, String>();
        if (redirectResponseWrapper.getRedirect() != null) {

            String redirectURL = redirectResponseWrapper.getRedirect();

            HttpSession httpSession = request.getSession();

            if (redirectURL.indexOf("login") != -1) {
                // populate your reply in this case the json object
                // with what ever information needed to pop up your login window

                if (redirectURL.indexOf("login_error=1") != -1) {
                    // 登录失败
                    map.put("success", "false");
                }
            }
            // / your auth is successful the call is successful
            else {
                // you can return the user name and password in the reply so it
                // can be displayed for example in you app

                SecurityContext ctx = (SecurityContext) httpSession
                        .getAttribute(HttpSessionContextIntegrationFilter.SPRING_SECURITY_CONTEXT_KEY);
                if (ctx != null) {
                    Authentication auth = ctx.getAuthentication();
                    UserDetails user = (UserDetails) auth.getPrincipal();
                    if (user != null) {
                        map.put("username", user.getUsername());
                        map.put("success", "true");
                    } else {
                        // 登录失败
                        map.put("success", "false");
                        map.put("errorMsg", "error");
                    }
                } else {
                    map.put("success", "false");
                }
            }
            try {
                String outString = new JSONSerializer().serialize(map);
                log.debug("jsonString : "+outString);
                response.getWriter().write(outString);
            } catch (Exception e) {
                log.error("{}",e.getMessage());
            }
        }

    }

    /**
     * @param request
     *            the request object
     * @return true if this request is an ajax request. This is determined by a
     *         configured name/value pair that is applied to the request header
     */
    protected boolean isAjaxRequest(HttpServletRequest request) {
        // test with our ajax request pairs
        String ajax = request.getParameter("ajax");
        if ("".equals(ajax) || ajax == null) {
            return false;
        }
        return true;
    }
   
    protected class JsonFlag{
       
        String success;
        public String getSuccess() {
            return success;
        }
        public void setSuccess(String success) {
            this.success = success;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        String username;
    }

}

2》 web.xml

<!-- 异步登录过滤器 filter -->
    <filter>
        <filter-name>loginAjaxFilter</filter-name>
        <filter-class>com.book511.app.web.login.LoginAjaxFilter</filter-class>
    </filter>

 

<!-- 乱码处理 放置第一位filter-mapping -->
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
   
    <filter-mapping>
        <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
   
    <!-- 异步登录过滤器 map -->
    <filter-mapping>
        <filter-name>loginAjaxFilter</filter-name>
        <url-pattern>/j_spring_security_check</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

3 》 ajaxLogin.js

//弹出窗口
function openLoginDiv(){
    var htl = "<div id='loginFormDiv'><span class='span_error' id='login_error'></span><a href='javascript:void(0);' onclick='closeDiv();'>关闭窗口</a><form action='##' method='post'><table>"
        + "<tr><td colspan='2'><span style='color:#FF0000;' id='login_error'></span></td></tr>"
        + "<tr><td class='td_name'>用户名:</td><td class='td_text'><input type='text' name='j_username' id='j_username' /></td></tr>"
        + "<tr><td class='td_name'>密码:</td><td class='td_text'><input type='password' name='j_password' id='j_password' /></td></tr>"
        + "<tr><td colspan='2' class='td_but'><input type='button' id='login_button' onclick='doLogin();' value='登录' /></td></tr>"
        + "</table></form></div><div id='bg' class='bg' style='display: none;'></div>"+
        "<iframe id='popIframe' class='popIframe' frameborder='0'></iframe>";

if (!$(".loginDiv").hasClass(
        "loginDiv")) {
    //alert(htl);
    // 动态写一个div弹出层
    $("<div>", {
        "class" : "loginDiv",
        "id":"loginDiv"
    }).append(htl).appendTo("body");
}
document.getElementById('popIframe').style.display = 'block';
document.getElementById('bg').style.display = 'block';
}

// 关闭窗口
function closeDiv(){
    $("#loginDiv").remove();
    document.getElementById('bg').style.display='none';
    document.getElementById('popIframe').style.display='none';
    window.location.reload(true);
}
//登录操作
function doLogin(){
    var j_username = $("#j_username").val();
    var j_password = $("#j_password").val();
    var redirectURL = location.href;
    $.ajax({
            type : "POST",
            url : "/app/j_spring_security_check",
            data : "j_username="
                    + j_username
                    + "&j_password="
                    + j_password
                    + "&ajax=ajax"+ "&redirectURL="+redirectURL,
            success : function(msg) {
                eval("var jsonObj="+ msg);
                if (jsonObj.success == "true") {
                    // 如果登录成功,则跳转到。
                    alert("登录成功");
                   
                    window.location.reload(true);
                    //closeDiv();
                    //alert(111);
                } else if (jsonObj.success = "false") {
                    // 写入登录失败信息
                    var errors = "对不起,用户名或密码不正确!";
                    $("#login_error").html(errors);
                }
            }
        });
}

 

4 》

 

分享到:
评论

相关推荐

    springSecurity实现用户登录及异步执行无权限,重定向到登录页面

    springSecurity实现用户登录及异步执行无权限,重定向到登录页面,详细介绍文章地址:https://blog.csdn.net/tangshiyilang/article/details/142098869

    基于 Java 17 + Spring Boot 3 + Spring Security 6 + Vue 3 + E.zip

    开发过程中,开发者可以利用Spring Boot的自动配置和Spring Security的灵活性来实现复杂的业务逻辑和权限控制,同时Vue 3的组件化特性简化了前端开发。 在实际项目中,开发者还需要考虑数据库(如MySQL、PostgreSQL...

    Spring Security详细介绍及使用含完整代码(值得珍藏)

    - **WebAsyncManagerIntegrationFilter**:集成Security上下文与Spring Web中处理异步请求映射的WebAsyncManager。 - **SecurityContextPersistenceFilter**:加载与请求相关的安全上下文信息到...

    spring security 数据库存储资源信息 记住我 支持AJAX

    在提供的压缩包文件"springsecurity_database"中,可能包含了示例代码、配置文件和其他相关资源,可以帮助你理解和实现上述功能。在实际项目中,你需要根据自己的需求调整和扩展这些示例,以构建一个符合业务场景的...

    spring security ajax请求与html共存

    在这个主题“spring security ajax请求与html共存”中,我们将探讨如何在使用Spring Security的同时处理Ajax(异步JavaScript和XML)请求,并确保与HTML页面的正常交互。 1. **Spring Security基础** Spring ...

    spring security 参考手册中文版

    3. Spring Security 4.2的新特性 27 3.1 Web改进 27 3.2配置改进 28 3.3杂项 28 4.样品和指南(从这里开始) 28 5. Java配置 29 5.1 Hello Web安全Java配置 29 5.1.1 AbstractSecurityWebApplicationInitializer 31 ...

    Spring-Boot1.52 SpringSecurity4 Spring Data Jpa 整合例子

    本项目通过整合 Spring Boot 1.5.2、Spring Security 4 以及 Spring Data JPA,成功实现了用户认证、授权以及数据持久化的功能。这种集成方式不仅可以简化开发过程,还能提高代码质量和系统的安全性。对于希望快速...

    spring3+struts2+hibernate3+dwr3+spring security3+ajax完整实例

    这是一个基于Java技术栈的Web应用实例,整合了Spring 3、Struts 2、Hibernate 3、Direct Web Remoting (DWR) 3、以及Spring Security 3,并且利用Ajax进行异步通信,实现了数据库配置的权限管理。下面将详细阐述这些...

    基于 Java 17 Spring Boot 3 Spring Security 6 Vue 3 Eleme

    本文将详细讲解基于Java 17、Spring Boot 3、Spring Security 6、Vue 3以及Element-Plus构建的前后端分离单体权限管理系统的相关技术栈和关键知识点。 首先,我们来了解一下Java 17。Java 17是Oracle公司推出的长期...

    spring-framework-5.2.0+spring-security-5.3.1.pdf

    Spring Framework 5.2.0版提供了许多新特性,例如支持响应式编程模型Spring WebFlux,以处理异步非阻塞流和使用Reactive Streams的API。此外,Spring Framework 5.2.0还支持Kotlin编程语言,并加强了对Java 8及以上...

    Spring Security 5 for Reactive Applications

    Spring Security 5是该框架的最新版本,其支持最新的Spring 5特性,其中包括对响应式编程模型的支持,使得开发者能够在基于Spring WebFlux的应用程序中实现安全功能。 响应式编程是一种编程范式,它允许开发者构建...

    spring-security-config-3.1.6.RELEASE.zip

    Spring Security Config是Spring Security的核心部分,它允许开发者通过简单的XML或Java配置来实现复杂的安全策略。在3.1.6.RELEASE版本中,这个库提供了许多关键功能,包括身份验证、授权、会话管理以及CSRF(跨站...

    Spring学习笔记+学习源码.zip

    9. **Spring Integration**:提供了异步处理、消息驱动和企业服务总线(ESB)等集成解决方案。 10. **Spring Batch**:用于处理批量操作,如数据导入导出,适合大规模数据处理。 在学习笔记中,你可能会找到以下...

    Ajax登陆使用Spring Security缓存跳转到登陆前的链接

    关于使用Ajax进行登录并使用Spring Security缓存跳转回登录前的URL的实现方法,主要涉及的IT知识点如下: 1. **Ajax的定义与作用** Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个页面的情况下...

    togglz-spring-security-1.1.1.Final.zip

    Togglz 主要用于在应用程序中实现特性开关功能,而 Spring Security 是一个强大的安全管理框架,常用于Java Web应用的安全控制。 【描述】"evinceframework-build.zip" 是一个构建软件的工具包,其中包含了 dojo ...

    Spring Boot使用Spring的异步线程池的实现

    Spring Boot 使用 Spring 的异步线程池的实现 在软件开发中,异步线程池是一种非常重要的技术,能够帮助我们更好地处理系统性能和大用户量请求之间的矛盾。Spring Boot 提供了异步线程池的实现,可以帮助我们更好地...

    SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue人事管理系统源码

    在这个人事管理系统中,SpringSecurity负责用户登录验证、权限控制等安全相关的工作,确保只有授权的用户才能访问特定的资源。 JWT(JSON Web Token)是一种轻量级的身份验证机制,用于在客户端和服务器之间安全地...

    spring-security-3.0.8

    通过深入了解Spring Security 3.0.8的这些方面,开发者可以更好地掌握如何在实际项目中实现高效且安全的权限管理。随着技术的发展,Spring Security不断更新,但3.0.8版本的精髓依然适用于许多现有的应用程序。无论...

    spring3教程

    - 安全性:Spring Security(原Acegi)在Spring3中得到了增强,提供了一套全面的安全管理框架。 - 任务调度:Spring3的Task模块提供了定时任务调度功能,可以方便地进行异步任务处理。 - WebSocket支持:Spring3增加...

Global site tag (gtag.js) - Google Analytics