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(现称为Spring Security)是一个强大的安全管理框架,提供了认证、授权等功能,可以实现用户登录、权限控制、会话管理等...
Struts、Spring、Hibernate、Velocity、Ajax、JOTM 和 Acegi 是一组常见的技术栈,它们在构建企业级Java Web应用程序时发挥着关键作用。这些技术各有专长,结合使用可以构建出高效、灵活且安全的系统。接下来,我们...
本文将深入探讨如何利用Spring、Acegi框架以及Ext2.0库,结合MySQL数据库,构建一个高效、安全的数据权限控制系统。 首先,Acegi Security(现已被Spring Security取代)是Spring框架的一个扩展,专门用于提供全面...
1. **异步通信**:Ajax 2 使用XMLHttpRequest对象发送异步请求,这意味着后台数据处理时,用户界面仍然保持活跃,提升了用户体验。 2. **JSON数据交换**:相比于XML,JSON(JavaScript Object Notation)在Ajax 2中...
- **问题提出**:解决DWR与Acegi的安全认证问题。 - **解决方案**:配置Acegi以兼容DWR。 #### 五、DWR中的JavaScript ##### 5.1 简单的回调函数 - **调用方法**:在客户端JavaScript中调用服务器端的方法,并...
- **用户认证和授权**:使用 Spring Security 或 Acegi 安全模块,实现用户的登录、权限控制。 - **库存管理**:包括商品入库、出库、盘点、库存预警等功能,使用 Hibernate 进行数据持久化。 - **供应商管理**:...
在现代Web应用中,许多操作通过AJAX异步请求完成。处理AJAX权限问题时,可以返回特定的状态码或错误信息,前端根据这些信息进行相应的处理,如显示错误提示或重定向。 五、Shiro框架 Apache Shiro是另一个流行的...
标题和描述概述的知识点主要集中在J2EE Web应用程序的分析与设计上,涉及到了Web应用程序的架构、技术栈的选择、框架应用(包括Struts、Spring、Hibernate、Acegi、Ajax等),以及如何通过这些框架和技术增强应用...
Spring Security(以前称为Acegi Security)是一个强大的安全框架,能够处理用户认证和授权。它允许开发者定义细粒度的访问控制规则,如基于角色的访问控制(RBAC),确保只有具有特定权限的用户才能访问特定资源。...
8. **AJAX与动态权限**:现代Web应用常使用AJAX技术实现异步更新,SSH框架支持与jQuery、Dojo等库集成,实现权限动态加载和页面局部刷新,提高用户体验。 9. **单元测试与集成测试**:SSH框架的模块化设计使得测试...
在后台,我们需要定义处理Ajax请求的控制器方法,返回JSON数据。在前端,通过EasyUI的API调用这些接口,实现页面的动态更新。 3. **页面布局**:EasyUI提供了多种布局方式,如流式布局、网格布局等,可以根据需求...
SSH2框架中的Spring Security(原Acegi)可以用来处理这些问题,它提供了用户认证和授权机制,确保只有合法用户才能发送和接收消息。 聊天记录的存储通常会使用数据库,如MySQL或Oracle,Hibernate可以通过ORM映射...
Acegi,作为Spring Security的前身,是一款专为基于J2EE的企业级应用程序提供安全服务的框架,尤其适用于使用Spring框架开发的项目。它提供了七个核心组件: 1. **Authentication对象**:封装了Principal、...
jQuery 是一个高效、简洁的JavaScript库,它极大地简化了DOM操作、事件处理、动画制作和Ajax交互。在前端,jQuery被用来提升用户体验,比如商品展示的动态加载、页面元素的交互效果,以及与后端的异步通信。 **5. ...
- ActiveMQ:消息中间件,用于异步处理邮件发送等任务。 - Log4j:日志记录框架,记录业务日志。 - **数据库和工具**: - MySQL:替换原项目中使用的HSQLDB作为生产环境的数据库。 - Eclipse及插件:开发环境和...
ICEfaces 是一个开源的JavaServer Faces (JSF) 框架,专为构建富互联网应用程序(Rich Internet Applications,RIA)...通过深入学习官方文档,你可以逐步提升在ICEfaces框架下的开发能力,为你的项目增添更多可能性。
- **权限控制**:可能涉及到Spring Security或Acegi安全框架,实现用户登录、权限验证和访问控制。 5. **页面渲染**: - **ExtJS组件**:使用诸如按钮、表格、窗体等组件构建用户界面,实现动态交互效果。 - **...
- **DWR与Acegi**:解决Acegi安全框架下DWR的权限问题。 #### DWR中的JavaScript - **简单的回调函数**:介绍如何使用DWR进行异步调用,并在调用完成后执行回调函数。 - **调用元数据对象**:元数据对象包含关于...
GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....