登陆验证模块的实现
登陆页面验证首先是验证账号, 验证码是否填写,密码长度是否符合要求,验证码是否正确。
这几个验证是通过自定义的几个$.fn扩展函数实现的($.fn.remote=Function(url,msg, msgCnt){})实现的,一般将这些自定义的函数放在一个js文件中,便于维护。
自定义函数一般包含相应的提示字符串,及节点对象$(“#id”)等参数。
通过函数对节点的var value = this.val();value是否为空或空字符串的判断,相应的改变节点text属性的值。
1验证码正确验证
1)验证码正确与否的验证是通过采用了Ajax技术的函数实现的。
对应的action的result 的属性为json(result要配置<param name="root">ok</param>的参数),action类要有布尔类型的名为ok的属性,通过返回值ok,更改相应的改变节点text属性的值。
如:
$.fn.remote=function(url,msg,msgCnt){
var value=this.val();//获得表单提交的数据,如你所填入的验证码/资费名称
var name=this.attr("name");//获得表单名称,如验证码文本框的name:verifiCode
var b=false;
$.ajax({url:url+"?"+name+"="+value,dataTyp e:"json",async:false,success:function(data){ if(data){
$(msgCnt).text("");
b=true;
}else{
$(msgCnt).text(msg);
}
}
});
return b;
};
2)验证码的点击更新是利用了result=stream的属性(要配置name="inputName",name="contentType"的参数),点击发送请求,对应的action(该类必须有InputStream类的属性,且名字要和result相应参数的属性值相同)生成验证码并存入session。
2账户和密码的验证
当前面一系列的验证结果都满足条件时,才能提交表单。
可定义一个函数实现:if(b1 && b2 && b4) {$("#loginForm").submit();}
相应action 接受到数据后,根据账户和密码调用DAO的相关方法,查询返回admin。
如果admin存在则转发到主页面(通过result在admin的不同状态下返回的字符串实现不同的type="redirectAction"),此时将admin存入session。
为后面的登陆检查验证做准备。
session.put(KEY_ADMIN, admin);
如果不存在就,还是停留在登陆页面。
3检查登陆验证。
为了防止未登录而访问数据,通过struts2的自定义拦截器功能实现登陆检查验证。
可通过实现接口Interceptor或者抽象类AbstractInterceptor,我选择继承AbstractIntercepto,相对较简洁。
在接口定义的方法intercept(ActionInvocation in)实现验证
逻辑。
通过ActionInvocatio n的getInvocationContext()方法获得action上下文对象ActionContext。
通过action上下问对象获得session对象,在session对象中获取admin对象:
Admin admin = (Admin)session.get(Constants.KEY_ADMIN);
如果admin为空,则通过return 返回字符串及全局result回到登陆页面。
如果admin不为空,则通过ActionInvocation对象调用invoke()方法,调用后面的action。
权限管理:
每个用户具有不同的角色,不同的角色具有不同的权限。
当用户登陆的时候,根据用户对象取得用户所具有的角色,根据角色id在privileges.xml(通过privilegereader类)文件中获得用户具有的所有权限,然后将此所有权限的集合存入session。
当用户每一次发送请求时都要通过拦截器,在拦截器中截取用户的请求路径(request.getServletPath()),并检查是否存在于session中的用户所具有权限中。
如果没有就返回到提示页面,如果有就调用invoke()方法执行后面的action,result。
拦截器的配置:
1.首先注册拦截器
<interceptor name="checklogin" class="ctoss.interceptor.CheckLoginInterceptor"> </interceptor>
2.然后定义拦截器栈,将默认拦截器栈也加进来。
<interceptor-stack name="loginStack">
<interceptor-ref name="checklogin"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
3.为当前package中所有Action指定默认的拦截器:
<default-interceptor-ref name="openSessionStack"/>
资费管理模块:
资费管的功能主要有资费信息的增加、管理、删除和修改等功能。
采用三大框架整合技术实现的。
在applicationContext.xml文件中配置连接池(用户名、密码、驱动包、连接路径),将连接池注入SessionFactory中,在SessionFactory中配置Hibernate框架参数:如方言dialect,show_sql等,指定映射描述。
然后开启组件扫描:
<context:component-scan base-package="ctoss">
</context:component-scan>
因为采用注解的形式,所以dao要继承HibernateDaoSupport,定义一个set方法调用父类的super.setSessionFactory(sf)方法,实例化HibernateTemplate。
在dao中利用getHibernateTemplate()实现一列的增删改查方法。
List list = getHibernateTemplate().find(hql,name);
关于事务:
在applicationContext.xml文件中定义事务管理Bean,然后定义通知<tx:advice transaction-manager="txManager">,可以在里面(<tx:attributes>)指定目标组件中的哪些方
法采用哪种事务管理方式。
然后定义<aop:config>,指定切入点<aop:pointcut >,将指定的dao当做目标。
然后关联通知和切入点:<aop:advisor advice-ref="txAdvice" pointcut-ref="servicepointcut"/>。
将dao用@Respository扫描进组件。