Spring Security版本:2.0.5
重写org.springframework.security.ui.webapp.AuthenticationProcessingFilter:
package com.cay.core.web;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.Authentication;
import org.springframework.security.AuthenticationException;
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter;
import org.springframework.security.util.RedirectUtils;
import com.cay.utils.RenderUtils;
public class AjaxableAuthenticationProcessingFilter extends
AuthenticationProcessingFilter {
/**
* If true, causes any redirection URLs to be calculated minus the protocol
* and context path (defaults to false).
*/
private boolean useRelativeContext = false;
public void setUseRelativeContext(boolean useRelativeContext) {
this.useRelativeContext = useRelativeContext;
}
protected void onSuccessfulAuthentication(HttpServletRequest request,
HttpServletResponse response, Authentication authResult)
throws IOException {
super.onSuccessfulAuthentication(request, response, authResult);
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
Map<String, Object> message = new HashMap<String, Object>();
message.put("success", true);
message.put("status", "1");
RenderUtils.renderJSON(response, message);
}
}
protected void onUnsuccessfulAuthentication(HttpServletRequest request,
HttpServletResponse response, AuthenticationException failed)
throws IOException {
super.onUnsuccessfulAuthentication(request, response, failed);
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
Map<String, Object> message = new HashMap<String, Object>();
message.put("success", true);
message.put("status", "-1");
message.put("message", failed.getMessage());
RenderUtils.renderJSON(response, message);
}
}
protected void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url)
throws IOException {
// ignore redirect when request via ajax
if (!"XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
RedirectUtils.sendRedirect(request, response, url, useRelativeContext);
}
}
}
applicationContext-security.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">
<http entry-point-ref="authenticationProcessingFilterEntryPoint">
<intercept-url pattern="/pages/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/css/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/images/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/new/commons/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/new/core/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/new/extjs/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/favicon.ico" access="ROLE_ANONYMOUS" />
<intercept-url pattern="/**" access="ROLE_AUTHENTICATED" />
<!-- 定制AuthenticationProcessingFilter不能使用form-login标签与auto-config="true" -->
<!-- 同时必须使用logout、http-basic与anonymous标签 -->
<logout logout-success-url="/pages/login.jsp" />
<http-basic />
<anonymous />
<!--
<form-login login-page="/pages/login.jsp"
authentication-failure-url="/pages/login.jsp?error=true"
default-target-url="/index.do" />
-->
</http>
<authentication-provider user-service-ref="userDetailsService">
<password-encoder hash="md5" />
</authentication-provider>
<beans:bean id="authenticationProcessingFilter"
class="com.cay.core.web.AjaxableAuthenticationProcessingFilter">
<custom-filter position="AUTHENTICATION_PROCESSING_FILTER" />
<beans:property name="defaultTargetUrl" value="/index.do" />
<beans:property name="authenticationFailureUrl" value="/pages/login.jsp?error=true"/>
<beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>
<authentication-manager alias="authenticationManager"/>
<beans:bean id="authenticationProcessingFilterEntryPoint"
class="com.cay.core.web.handler.AjaxableAuthenticationProcessingFilterEntryPoint">
<beans:property name="loginFormUrl" value="/pages/login.jsp" />
</beans:bean>
<beans:bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename"
value="classpath:com/cay/security/messages" />
</beans:bean>
<beans:bean id="localeResolver"
class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />
</beans:beans>
参考链接:
http://forum.springsource.org/showthread.php?56167-Overriding-AUTHENTICATION_PROCESSING_FILTER
http://forum.springsource.org/showthread.php?57373-How-to-replace-form-login
http://loianegroner.com/2010/02/integrating-spring-security-with-extjs-login-page/
http://stackoverflow.com/questions/4885893/how-to-differentiate-ajax-requests-from-normal-http-requests
http://androider.iteye.com/blog/588379
分享到:
相关推荐
SpringBoot+SpringSecurity处理Ajax登录请求问题 SpringBoot+SpringSecurity处理Ajax登录请求问题是SpringBoot开发中的一個常见问题,本文将详细介绍如何使用SpringBoot+SpringSecurity处理Ajax登录请求问题。 ...
当Ajax请求被拒绝时,Spring Security默认会重定向到一个错误页面,但这对Ajax请求并不适用。因此,我们需要提供一个错误处理器,将错误信息作为JSON或其他适合Ajax响应的格式返回。 5. **HTML与Ajax共存** 在...
在提供的压缩包文件"springsecurity_database"中,可能包含了示例代码、配置文件和其他相关资源,可以帮助你理解和实现上述功能。在实际项目中,你需要根据自己的需求调整和扩展这些示例,以构建一个符合业务场景的...
在本“springsecurity前端素材”中,我们有两个主要的文件夹:templates和static,它们分别代表了前端展示层的不同方面。 **templates** 文件夹通常包含了应用的HTML模板文件,这些文件被用于构建用户界面。在...
3. **过滤器链(Filter Chain)**:Spring Security 使用一系列过滤器处理请求,如 `SecurityContextPersistenceFilter` 保存和恢复安全上下文,`UsernamePasswordAuthenticationFilter` 处理登录请求。理解过滤器链...
6. **CSRF防护**:为防止跨站请求伪造(Cross-Site Request Forgery)攻击,Spring Security提供了内置的CSRF保护,可以通过添加特定的token到表单或Ajax请求中来验证请求的合法性。 7. **AOP(面向切面编程)**:...
- **实现自定义登录页面:** 创建自定义的登录页面,替换Spring Security默认的登录界面。 - **修改配置文件:** 调整配置以使用自定义的登录页面。 - **登录页面中的参数配置:** 设置登录页面的请求参数,确保...
在本项目中,"SpringBoot项目+SpringSecurity+前端静态资源"是一个综合性的开发实践,主要涉及了Spring Boot和Spring Security这两个核心的Java框架,以及前端的静态资源管理。Spring Boot简化了Java应用的初始化和...
总的来说,Struts2、Spring和Ajax的整合使得用户登录功能更加高效、用户友好。Struts2处理请求和响应,Spring管理业务逻辑和数据访问,而Ajax则提供了流畅的用户体验。在实际开发中,开发者需要对这三个框架有深入...
Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...
更改了RedirectUtils类的 response.sendRedirect(response.encodeRedirectURL(finalUrl)); 改为了 StringBuffer str = new StringBuffer(); str.append("{"); str.append("status: \"true\",");...
总结来说,从给出的文件内容来看,实现Ajax登录后跳转到登录前的链接,需要对Spring Security的登录流程、请求缓存机制、前端与后端的数据交互(尤其是JSON数据的处理)以及Jackson库的使用有深入的理解。...
传统的Spring Security主要通过表单方式实现用户登录,但在现代的Web应用中,基于RESTful API的交互越来越多地采用JSON格式的数据。因此,如何在Spring Security中实现基于JSON的登录认证,成为了开发人员需要掌握的...
Architect solutions that leverage the full power of Spring Security while remaining loosely coupled. Implement various scenarios such as supporting existing user stores, user sign up, authentication, ...
这是一个基于Java技术栈的Web应用实例,整合了Spring 3、Struts 2、Hibernate 3、Direct Web Remoting (DWR) 3、以及Spring Security 3,并且利用Ajax进行异步通信,实现了数据库配置的权限管理。下面将详细阐述这些...
在这个主题中,我们将深入探讨如何在Spring Boot应用中使用Spring Security进行JSON数据库登录验证。 首先,`pom.xml`是Maven项目的核心配置文件,这里我们需要引入Spring Security的相关依赖,例如`spring-boot-...
- Spring Security默认提供的自动登录策略。 - **示例代码**: 在`spring-security.xml`中配置默认策略。 - **16.2 持久化策略** - 实现基于Cookie的自动登录策略。 - **示例代码**: 在`spring-security.xml`中...
在该项目中,Spring Security可能被用来进行用户身份验证、权限控制,以及实现登录和注销功能。它可以与Spring Boot无缝集成,为Web应用提供了一套完整的安全解决方案。 【标签】"java项目"表明这是一个基于Java...
Spring Security是Spring生态系统中的安全模块,提供了一套完整的身份验证和授权解决方案,包括登录、权限控制等功能。 在前后端分离的架构下,Spring Boot作为后端服务器,主要负责处理业务逻辑和数据操作。通过...
本项目是一个基于SSM(Spring、SpringMVC、MyBatis)框架的循环水能效管理系统,采用现代前端技术如Bootstrap、JSP、Ajax以及数据交换格式JSON,同时结合SpringSecurity进行安全控制。这个系统主要适用于高校计算机...