登陆验证模块的实现
登陆页面验证首先是验证账号
,
验证码是否填写,密码长度是否符合要求,验证码是否
正确。这几个验证是通过自定义的几个
$.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="com.tarena.netctoss.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="com.tarena.netctoss">
</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
扫描进组件
法采用哪种事务管理方式。然后定义
<aop:config>,
指定切入点
<aop:pointcut
>
,将指定的
dao
当
做
目
标
。
然
后
关
联
通
知
和
切
入
点
:
<aop:advisor
advice-ref="txAdvice"
pointcut-ref="servicepointcut"/>
。
将
dao
用
@Respository
扫描进组件。
法采用哪种事务管理方式。然后定义<aop:config>,指定切入点<aop:pointcut >,将指定的dao当做目标。然后关联通知和切入点:<aop:advisor advice-ref="txAdvice" pointcut-ref="servicepointcut"/>。将dao用@Respository扫描进组件。