图3-10 考试科目信息表
tb_ student用于保存所有学生考试信息以及成绩信息,该表结构如图3-11所示。
图3-11 学生信息表
tb_ Blank用于保存所有填空题信息,该表结构如图3-12所示。
图3-12填空题数据表
3.4.2 数据库的安全性、信息的保密性考虑
由于考试系统的特殊性,数据的安全与保密显得尤为重要。保密性是指用户在网上的所有信息应有一定的保密度,不同类型的用户之间的内容是互相保密的。安全性是指用户参加一次考试是一个过程,对于所有的用户,服务器都加以跟踪。为了确保其安全与保密性,采用如下方案:
一、考生的身份验证。凡进入在线考试的用户,都要通过用户身份验证才能进入。教师用户按权限进行操作,确保数据的公共性与私有性。不允许用户执行非法的操作,防止用户无意或有意进行的破坏。
9
二、在时间上加以严格控制。在用户登录后将用户的登陆时间存入到浏览器的cookies中,当用户断线重新连接后,进行的考试时间仍然是以最初登录考试系统的时间为参考点,而不是重新生成。
禁止用户查看试卷源文件及拷贝功能, 即用户不能下载试卷到本地,不能通过获取源代码得到试卷。
以下为禁止使用鼠标右键功能的javascript脚本语言代码:
//屏蔽F5刷新键
//屏蔽Enter键
10
4 在线考试系统的详细设计
4.1 公共类的设计和实现的功能
在开发项目中以类的形式来组织、封装一些常用的方法和事件,不仅可以提高代码的重复率,也可以方便代码的管理。本系统中创建了一个公共类HibernateSessionFactory类,其中包含getSession方法。具体代码如下:
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();//从ThreadLocal对象中
获得Session对象
if (session == null || !session.isOpen()) {//判断获得的Session对象是
否为空或者未打开
if (sessionFactory == null) {//如果没有创建SessionFactory对象,
则首先创建
}
//如果SessionFactory对象不为空,则调用其openSession方法创建
rebuildSessionFactory();
Session对象
null;
}
public static void rebuildSessionFactory() {
session = (sessionFactory != null) ? sessionFactory.openSession():
}
threadLocal.set(session);//在ThreadLocal对象中保存该Session对象
return session;
configuration.configure(configFile);//读取配置文件 sessionFactory =
configuration.buildSessionFactory();//根据配置文件创建
11
sessionFactory对象
}
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();//从ThreadLocal对象中
获得Session对象
除
}
public static org.hibernate.SessionFactory getSessionFactory() {//取得SessionFactory对象
}
return sessionFactory; if (session != null) { }
session.close();
threadLocal.set(null);//将当前线程Session对象从ThreadLocal对象中移
4.2登录和注册模块实现过程
4.2.1 登录模块
实现登录模块的具体步骤如下:
(1) 新建一个名为Login.jsp的网页,用于实现系统的登陆功能。 (2) 新建index.jsp和index.html分别放在student和teacher下面,用于登录时不同的角色界面。
(3) 新建register.jsp页面,当学生和管理员首次进入该系统,由于后台数据库中没有他们信息,进入register.jsp页面。 系统登录界面如下图4-1所示。
12
图 4-1 系统登录界面
登录界面关键代码如下:
public String execute() throws Exception {
if(\.equals(role)) {//如果以学生身份登录
if(studentService.allowLogin(id, password)) {
Student studentInfo =
studentService.getStudentInfo(id);
//保存学生记录到session范围 Map session =
ActionContext.getContext().getSession();
session.put(\, studentInfo); return \;
}else { }
addActionError(\该学生编号不存在,或者密码不正确!\); return this.INPUT;
}else {
if(teacherService.allowLogin(id, password)) {
return \;
}else {
13