技术微信:375279829 欢迎来到【毕业设计资料-计算机毕业设计源码网】官网!
您的位置:您的位置:主页 > 作品中心 > Java毕业设计

基于ssl的在线考试系统

技术微信:375279829

本课题包括源程序、数据库、论文、运行软件、运行教程

毕业设计资料-计算机毕业设计源码网:我们提供的源码通过邮箱或者QQ微信传送,如果有啥问题直接联系客服

包在您电脑上运行成功

语言:Java

数据库:MySQL

框架:ssm、springboot、mvc

课题相关技术、功能详情请联系技术

作品描述
4.1类与类的关系
数据访问层,也称持久层,其功能主要是负责数据库的访问,实现DAO(Data Access Objects)数据访问对象对持久化类VO的基本CRUD(Create、Retrieve、Update、Delete)操作。本系统数据访问主要有TAdminDAO类、TFenshuDAO类、TJiaoyuanDAO类、TKechengDAO类、TShitiDAO类、TStuDAO类、TTeaDAO、TTimuDAO、TTimuShitiDAO等。
业务逻辑层在体系架构中的位置很关键,它处于数据访问层与表示层中间,起到了数据交换中承上启下的作用。对于数据访问层而言,它是调用者,对于表示层而言,它却是被调用者,针对具体问题的操作,对数据业务逻辑处理。本系统业务逻辑类主要有adminAction类、fenshuAction类、jiaoyuanAction类、kechengAction类、shitiAction类、stuAction类、teaAction类、timuAction类等。
实体类为Action类提供模型和DAO完成业务逻辑,并提供事务处理来提示系统性能和数据完整性。系统的实体类包括Fuzhu、Tadmin、TFenshu、TJiaoyuan、TKecheng、TShiti、Tstu、Ttea、Ttimu和TtimuShiti类。
4.1用户登录
系统用户包括学生、管理员和老师。下面对学生用户的添加流程进行说明:
步骤1:用户通过Web页面层URL访问链接stuAction跳转到添加页面;
步骤2:用户点击录入按钮时,Web页面端组件会调用处理添加的StuAction类中的stuAdd();
步骤3:在StuAction类的stuAdd()中将获取到学生实体属性数据,再继续调用业务层StuService类中的stuAdd(),参数为模型驱动获取到的Stu对象;
步骤4:业务层的stuAdd()中调用持久层StuDao类中的stuAdd(),参数为Stu对象,该方法通过getHibernateTemplate()的save()将数据保存到数据库中;
步骤5-6:步骤4和步骤3成功执行;
步骤7:Action类中将页面重定向到stuAdd.jsp;
关键代码:
public String stuAdd()
{
TStu stu=new TStu();
stu.setStuXuehao(stuXuehao);
stu.setStuRealname(stuRealname);
stu.setStuSex(stuSex);
stu.setStuAge(stuAge);
stu.setStuXueyuan(stuXueyuan);
stu.setStuZhuanye(stuZhuanye);
stu.setStuBanji(stuBanji);
stu.setLoginPw(loginPw);

stu.setDel("no");
stuDAO.save(stu);
this.setMessage("操作成功");
this.setPath("stuMana.action");
return "succeed";
}


用户信息录入后,可以使用用户名和密码进行登录,登录的流程如下:
步骤1:用户点击登录按钮时,Web页面端组件会调用处理登录的loginService类中的login();
步骤2:在loginService类的login()中将获取到输入的用户名和密码,再继续调用业务层loginService类中的login(),参数为模型驱动获取到的User对象;
步骤3:业务层中的login()调用持久层AdminDao类中的login(),参数为Admin对象,该方法通过静态方法getHibernateTemplate()的find()查询数据库Admin表中与参数Admin的账号或密码相匹配的对象集合;
步骤4:持久层将查询到集合中的第一个Admin对象返回给业务层;
步骤5:业务层将该Admin对象返回给loginService类;
步骤6:loginService类获取到该对象,并判断该对象是否为空,不为空则登录成功,并把它即当前用户信息存入到session中,页面重定向到主页index.jsp。
关键代码:
if(userType==0)//管理员
{
String sql="from TAdmin where userName=? and userPw=?";
Object[] con={userName,userPw};
List adminList=adminDAO.getHibernateTemplate().find(sql,con);
if(adminList.size()==0)
{
result="no";
}
else
{
WebContext ctx = WebContextFactory.get(); 
HttpSession session=ctx.getSession(); 
TAdmin admin=(TAdmin)adminList.get(0);
session.setAttribute("userType", 0);
             session.setAttribute("admin", admin);
             result="yes";
}
}
if(userType==1)//教师
{
String sql="from TTea where loginName=? and loginPw=?";
Object[] con={userName,userPw};
List teaList=teaDAO.getHibernateTemplate().find(sql,con);
if(teaList.size()==0)
{
result="no";
}
else
{
WebContext ctx = WebContextFactory.get(); 
HttpSession session=ctx.getSession(); 
TTea tea=(TTea)teaList.get(0);
session.setAttribute("userType", 1);
             session.setAttribute("tea", tea);
             result="yes";
}

}
if(userType==2)//学生
{
String sql="from TStu where stuXuehao=?  and loginPw=?";
Object[] con={userName,userPw};
List adminList=adminDAO.getHibernateTemplate().find(sql,con);
if(adminList.size()==0)
{
result="no";
}
else
{
WebContext ctx = WebContextFactory.get(); 
HttpSession session=ctx.getSession(); 
TStu stu=(TStu)adminList.get(0);
 
session.setAttribute("userType", 2);
             session.setAttribute("stu", stu);
             result="yes";
}
}
return result;
}
4.2学生在线考试
参加考试模块在本系统中主要有两个页面分别是考试试卷列表页面和学生考试页面。学生用户登陆系统后,点击导航上的参加考试,进入考试试卷列表页面。考试界面如图:
 
图4-9 在线考试
学生在考试试卷列表中,选中一个试卷参加考试,如果满足考试条件会进入学生考试页面。每份考试卷学生都只能参加一次,在学生第一次进入学生考试页面就会记录下学生的开始考试时间,学生交卷时会记录下学生的交卷时间。学生的成绩是否有效,将通过计算交卷时间和开始考试时间的差是否小于考试时长。

用户点击开始考试的代码实现流程如下:
步骤1:用户通过Web页面层URL访问链接timuByShiti_kaoshi.action查找到对应考试对象,同时跳转到该考试详情页面,利用struts标签将考试信息显示在页面上;
步骤2:用户点击交卷按钮时,Web页面端组件会调用处理交卷的jiaoyuanAction类中的jiaoyuanAdd ()方法;
步骤3:jiaoyuanAction类的jiaoyuanAdd ()方法调用HttpServletRequest方法的getSession ,把从session中获取当前用户编号,并从模型驱动使用的TTimuShiti对象中获取到考试编号作为参数;
步骤4:jiaoyuanAction类调用timuShitiDAO类中的查找方法,该方法通过getHibernateTemplate()的find()查询数据库TimuShiti表的试题列表;
步骤5:持久层将timuShitiList集合返回给业务层,循环查找到的集合,把用户输入的答案信息和题目ID赋给实体Tjiaoyuan;
步骤6:调用持久化jiaoyuanDAO类中的sava方法,并把模型数据保存到数据库中;并返回SUCCESS状态。
步骤7:如果返回的值为true,说明当前用户答题成功,并提示成功消息,否则,提示答题失败。
关键代码:
HttpServletRequest request=ServletActionContext.getRequest();
Map session= ServletActionContext.getContext().getSession();
TStu stu=(TStu)session.get("stu");

String sql="from TTimuShiti where shitiId=?";
Object con[]={shitiId};
List timuShitiList=timuShitiDAO.getHibernateTemplate().find(sql,con);
for(int i=0;i<timuShitiList.size();i++)
{
TJiaoyuan jiaoyuan=new TJiaoyuan();
jiaoyuan.setStuId(stu.getStuId());

TTimuShiti timuShiti=(TTimuShiti)timuShitiList.get(i);
jiaoyuan.setTimuId(timuShiti.getTimuId());
jiaoyuan.setShitiId(shitiId);

String[] timu1Daan=request.getParameterValues(timuShiti.getTimuId().toString());
if(timu1Daan.length==1)//danxuanti
{
jiaoyuan.setTimuDaan(timu1Daan[0]);
}
if(timu1Daan.length>1)//duoxuanti
{
String s="";
for(int j=0;j<timu1Daan.length;j++)
{
s+=timu1Daan[j];
}
jiaoyuan.setTimuDaan(s);
}
jiaoyuanDAO.save(jiaoyuan);
}


return ActionSupport.SUCCESS;

4.3教师阅卷
题库管理模块在系统中是非常重要的,也是用户用的比较多的页面。题库管理主要功能包括题库试题的显示、检索、添加、编辑和删除,因此设计一个题库试题列表页面和一个题库试题信息页面。列表页面提供显示、检索、删除功能,并提供编辑和添加链接,链接指向试题信息页面。试题信息页面提供试题的添加和编辑功能。
题库添加的界面如图4-7:

 
图4-7试题添加页面
老师点击阅卷的代码实现流程如下:
步骤1:老师点击阅卷,通过页面层URL访问链接yuejuan.action查找到对应对象,执行jiaoyuanAction类的yuejuan方法。
步骤2:yuejuan ()方法调用jiaoyuanDAO类中的查找方法,该方法通过getHibernateTemplate()的find()查询数据库jiaoyuan表的答题情况表;得到jaoyuanList答题情况的集合。
步骤3:循环jaoyuanList集合,把答题情况数据保存到对象timuList中,使用request.put方法保存timuList集合。
步骤4:在业务逻辑层jiaoyuanAction中,判断timuList的size是否为0,返回消息"该考生没有参加考试"。  
步骤5:并通过调用持久化fenshuDAO类中的find方法,查找阅卷结果list,判断老师是否已经阅卷的消息,返回消息"已经阅卷过。请重新选择"。
步骤6:在yuejuan.jsp页面中,得到yuejuan类返回的结果信息,判断是否可以阅卷。并把学生答题情况通过c:forEach标签显示到界面。
步骤7:在yuejuan.jsp页面中,老师根据显示答题情况,录入成绩,点击打分按钮,提交form到fenshuAction类中的fenshuAdd方法中。
步骤8:fenshuAdd方法中,首先设置TFenshu模型驱动中获取到的分数信息,即分数、试卷编号和学生编号。
步骤9:业务层调用持久层fenshuDAO中的save ()方法,通过getHibernateTemplate()的参数TFenshu对象保存到数据库中;
步骤10:fenshuAction类中将页面重定向到阅卷列表页面。
关键代码:
Map request=(Map)ServletActionContext.getContext().get("request");
List timuList=new ArrayList();

String sql="from TJiaoyuan where shitiId=? and stuId=?";
Object con[]={shitiId,stuId};
List jaoyuanList=jiaoyuanDAO.getHibernateTemplate().find(sql,con);
for(int i=0;i<jaoyuanList.size();i++)
{
TJiaoyuan jiaoyuan=(TJiaoyuan)jaoyuanList.get(i);
TTimu timu=timuDAO.findById(jiaoyuan.getTimuId());
timu.setTimuDaanAsStu(jiaoyuan.getTimuDaan());
timuList.add(timu);
}

if(timuList.size()==0)
{
request.put("msg", "该考生没有参加考试");
return "msg";
}

String sql11111="from TFenshu where shitiId=? and stuId=?";
Object con11111[]={shitiId,stuId};
List list=fenshuDAO.getHibernateTemplate().find(sql11111,con11111);//是否已经阅卷。并且打分
if(list.size()>0)
{
request.put("msg", "已经阅卷过。请重新选择");
return "msg";
}
request.put("timuList", timuList);
request.put("shitiId", shitiId);
request.put("stuId", stuId);
return ActionSupport.SUCCESS;

4.4分数查询
代码实现流程为:
步骤1:用户点击分数查询菜单,在Web页面层通过URL访问分数查询的链接fenshuByMe.action;
步骤2:在struts.xml配置文件中,执行fenshuAction类中的fenshuByMe方法;
步骤3:首先调用ServletActionContext 对象的getSession()方法,获取保存在服务器Session对象中的stu变量信息;也就是当前学生登录用户的个人信息;并把信息转递到实体类Tstu中。
步骤4:通过学生用户编号查找用户考试成绩,通过fenshuDAO方法调用静态方法getHibernateTemplate()的find(),参数为hql语句,返回一个成绩fenshuList对象集合;
步骤5:持久层把该fenshuList对象集合返回给业务层;
步骤6:业务层对fenshuList进行处理,通过for循环获取到实体对象Tfenshu信息,通过Tfenshu的试题编号查找试题名称,查找方法依然使用shitiDAO的getHibernateTemplate()的find()方法;
步骤7:把试题名称通过setShitiName方法保存到fenshu实体中;最终返回SUCCESS的状态信息,并把fenshuList通过request.put进行设置。
步骤8:Action动作类的execute()里把对象集合保存在值栈中,前台主页fenshuByMe.jsp通过struts迭代器标签<s:iterator></s:iterator>把每个考试成绩信息从值栈中取出来显示在页面上。
Map session= ServletActionContext.getContext().getSession();
TStu stu=(TStu)session.get("stu");
String sql="from TFenshu where stuId=?";
Object[] cc={stu.getStuId()};
List fenshuList=fenshuDAO.getHibernateTemplate().find(sql,cc);
for(int i=0;i<fenshuList.size();i++)
{
TFenshu fenshu=(TFenshu)fenshuList.get(i);
fenshu.setShitiName(shitiDAO.findById(fenshu.getShitiId()).getShitiName());
}
Map request=(Map)ServletActionContext.getContext().get("request");
request.put("fenshuList", fenshuList);
return ActionSupport.SUCCESS;

4.5 SSL协议
SSL是安全套接层, 其概念就不在描述,SSL协议主要是通过服务器的配置可以实现其安全控制。SSL和具体的代码、系统结构无关,任何一个系统,搭建到服务器后,都可以使用SSL证书进行配置。所以,在代码解释中,没有体现到SSL协议,SSL只能在代码实现后,单独进行配置说明。


4.6 SSL的配置
4.6.1创建服务器证书
本系统使用JDK自带的SSL证书工具进行生成证书,通过配置服务器可以实现系统的SSL管理。在实际使用中,HTTPS是由HTTP和SSL组成,在传统的HTTP协议上加了一层加密协议,进行对客户端的身份认证。防止在线考试系统的数据丢失。
系统使用JDK生成的证书为自签名证书,不是官方生成的,对于本系统来说,使用自签名证书完全可以实现其功能。
在jdk的安装目录中,打开keytool.exe,在CMD命令中,输入生成签名的证书。填写姓名、域名和密码信息。
4.6.2配置Tomcat服务器
在服务器中,找到安装目录,如conf目录下的server.xml中,设置证书的文件所在路径和设置密码信息。
其中设置的属性说明如下:
属性说明:
clientAuth:设置在线考试系统双向验证,设置为true的双向验证。设置clientAuth属性为True时,需要手动导入客户端证书才能访问。
keystoreFile: 在线考试系统服务器证书文件路径
keystorePass: 在线考试系统服务器证书密码
truststoreFile:用来验证在线考试系统客户端证书的根证书。
truststorePass: 在线考试系统根证书密码。 

4.6.3配置浏览器
由于是在线考试系统双向SSL认证,在线考试系统客户端也要验证服务器证书,因此,必须把在线考试系统服务器证书添加到浏览器的"受信任的根证书颁发机构"。
由于不能直接将keystore格式的证书库导入,必须先把服务器证书导出为一个单独的CER文件,使用如下命令:
keytool -keystore D:/keys/tomcat.keystore -export -alias tomcat7 -file D:/keys/server.cer
双击server.cer文件,按照提示安装证书,将证书填入到"受信任的根证书颁发机构"。
打开浏览器   - 工具  -  internet选项-内容- 证书-把中级证书颁发机构里的在线考试系统证书导出来-再把导出来的证书导入,受信任的根颁发机构。


如需定做或者获取更多资料,请联系QQ:375279829
在线客服
联系方式

技术微信

375279829

在线时间

周一到周日

客服QQ

375279829

二维码
线