# SelectiveSystem
# 基于 JavaWeb 的学生选课系统(个人开发)<br>
```
开发软件:idea、tomcat、mysql<br>
开发环境:spring、springMVC、Mybatis <br>
项目描述:使用java web为核心部位,使用SSM框架。后台传输json。并且设计了安全权限登录问题。前端分为学生端、教师端和管理员端,使用分页功能,优化了大量数据的效率<br>
项目功能:<br>
```
安全权限功能:在前端使用 js 进行密码加密,后端使用 shiro 权限管理,并且再次加密密码,使得数据库存储的用户密码为非对称密钥<br>
会话功能:对用户长时间不操作定时下线,防止用户离开被操作,禁止用户不同 ip 登录,导致用户数据出错<br>
选课功能:教师添加自己信息和给学生选课成绩打分,管理者负责课程、课程老师的选择并且可以修改学生选课成绩和课程,并生成对应选课信息,学生可以选择对应老师对应的课程,并且可以查看选课成绩<br>
![](https://www.writebug.com/myres/static/uploads/2021/12/2/70a01f4302f50200179390ab4cde001e.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/2/a0b1b46962a104056fb75d0ce5460094.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/2/f2dd0bb42560d77f090c7d7ade5d3936.writebug)
## 1.加密
对于用户的密码进行了加密,为了减轻服务器的负载优化性能,在前端采用了高强度的加密方式使得整体性能需求集中在用户身上,后端采用了较为低强度的加密方式,并且在加密方式使用加盐使得密码更加难以破解,而且整体都是使用单向加密方式,使得密码加密不可逆。
前端
```java
try {
var shaObj = new jsSHA("SHA3-512", "TEXT", {numRounds: parseInt("4096", 10)});
shaObj.update(encrypt_str);
encrypt_str = shaObj.getHash("HEX");
} catch (e) {
alert(e.message)
}
return hex_md5(encrypt_str);
```
后端
使用了 shiro 自带的加密模块,在 XML 文件中定义加密
```xml
<bean id="credentialsMatcher"
class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<property name="hashAlgorithmName" value="SHA-512"/>
<property name="hashIterations" value="1024"/>
</bean>
```
## 2.权限
采用了 shiro,Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存
在本项目中使用了
### 2.1. Authentication
身份认证/登录,验证用户是不是拥有相应的身份;
```java
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = upToken.getUsername();
Admin admin = userService.getAdminInfoById(username);
if (admin == null) {
throw new UnknownAccountException("没找到帐号");
}
//交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(
admin.getAno(),//principal,
admin.getPassword(),//credentials,
ByteSource.Util.bytes(admin.getAno()),//credentialsSalt,
getName()//realmName
);
```
### 2.2. Authorization
授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
```java
String username = (String) principals.getPrimaryPrincipal();
Admin admin = userService.getAdminInfoById(username);//从数据库获取信息
Set<String> roles = new HashSet<>();
if (admin != null) {
roles.add("admin");//赋予管理员权限
roles.add("teacher");//赋予教师权限
roles.add("student");//赋予学生权限
}
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
```
### 2.3. Session Manager
会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的;
```xml
<!-- Shiro去掉URL中的JSESSIONID -->
<property name="sessionIdUrlRewritingEnabled" value="false"/>
<property name="globalSessionTimeout" value="1500000"/><!-- 毫秒 -->
<property name="deleteInvalidSessions" value="true"/>
<property name="sessionValidationSchedulerEnabled" value="true"/>
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
<property name="sessionDAO" ref="sessionDAO"/>
<property name="sessionIdCookieEnabled" value="true"/>
<property name="sessionIdCookie" ref="sessionIdCookie"/>
```
### 2.4. Cryptography
加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
### 2.5. Caching
缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
### 2.6. Remember Me
记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。
### 2.4. Realm
可以有 1 个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是 JDBC 实现,也可以是 LDAP 实现,或者内存实现等等;由用户提供;在应用中都需要实现自己的 Realm;
## 3.模糊查询、表格显示
在 JSP 页面设置 table 控件
```html
<table id="grid-data" class="table table-condensed table-hover table-striped">
<thead>
<tr>
<th data-column-id="sno" data-identifier="true">学号</th>
<th data-column-id="sname">姓名</th>
<th data-column-id="ssex">性别</th>
<th data-column-id="sage">年龄</th>
<th data-column-id="sdept">系别</th>
<th data-column-id="commands" data-formatter="commands" data-sortable="false">修改</th>
</tr>
</thead>
</table>
```
在 js 部分设置好就可以通过 AJAX 来获取数据库的数据
```js
$("#grid-data").bootgrid({
ajax: true,
sorting :false,
post: function () {
/* To accumulate custom parameter with the request object */
return {
// id: "b0df252a-0d64-40e5-5555-c9e93b4befed"
};
},
url: "/admin/AllStudentUser",
formatters: {
"commands": function (column, row) {
return "<button type=\"button\" class=\"btn btn-info\" data-row-id=\"" + row.sno + "\" onclick=\"window.location.href='/admin/StudentInfo?sno=" + row.sno + "'\"><span class=\"fa fa-pencil\"></span></button>";
}
}
});
```
## 4.报表
本程序使用的是在前端使用 js 的方式生成报表,而不是后端生成。前端通过使用 tableExport 来实现出报表功能,我们通过调用 js 语句去触发
```js
$(".table").tableExport({
type:'xlsx',
fileName:tableTitle+"_"+getNowFormatDate(),
ignoreColumn:[length],
bootstrap: true,
});
```
而且在其中我们可以设置许多自定义的设置,包括了标题、格式、行数、列数、文件名等等的设置。
## 5.前端与后端的通信
### 5.1. 前端
第一种使用了 form 表单方式传递数据
```html
<form id="loginform" action="/login/signIn" method="post">
<input type="text" class="form-control" id="username" name="username" placeholder="请输入学号">
<input type="password" class="form-control" id="password" name="password" placeholder="请输入5~24位密码"/>
</form>
```
第二种采用了 AJAX 的方法,这是一种异步传输方式,可以只刷新局部页面,可以大大的减少页面资源的消耗
```js
$.ajax({
url: URL,
aysnc: false,
type: TYPE,
contentType: "application/json; charset=utf-5",
data: PARAMS,
success: function (data) {
// return data;
return true;
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("请求失败,消息:" + textStatus + " " + errorThrown);
return false;
}
});
```
### 5.2 后端
在 Spring MVC 应用程序中,RequestDispatcher (在 Front Controller 之下) 这个 servlet 负责将进入的 HTTP 请求路由到控制器的处理方法。
@RequestMapping()使用注解的方式可以将特定的请求或者请求模式映射到控制器上,然后通过简单的实
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
使用java web为核心部位,使用SSM框架。后台传输json。并且设计了安全权限登录问题。前端分为学生端、教师端和管理员端,使用分页功能,优化了大量数据的效率。安全权限功能:在前端使用 js 进行密码加密,后端使用 shiro 权限管理,并且再次加密密码,使得数据库存储的用户密码为非对称密钥。
资源推荐
资源详情
资源评论
收起资源包目录
基于JavaWeb(SSM)+MySQL实现的学生选课系统【100012686】 (172个子文件)
gradlew.bat 2KB
bootstrap.css 143KB
bootstrap.min.css 118KB
bootstrap-theme.css 26KB
bootstrap-theme.min.css 23KB
bootstrap-select.css 11KB
bootstrap-select.min.css 10KB
index.css 4KB
jquery.bootgrid.css 4KB
jquery.bootgrid.min.css 4KB
index.min.css 3KB
tableexport.css 2KB
tableexport.min.css 786B
glyphicons-halflings-regular.eot 20KB
.gitattributes 378B
build.gradle 5KB
settings.gradle 39B
gradlew 5KB
favicon.ico 4KB
WriteExcel.java 9KB
AdminController.java 8KB
LoginController.java 5KB
ReadExcel.java 5KB
InfoAdd.java 4KB
AdminRealm.java 4KB
StudentController.java 4KB
TeacherRealm.java 4KB
KickoutSessionControlFilter.java 4KB
UserServiceImpl.java 4KB
TeacherController.java 4KB
CourseServiceImpl.java 4KB
StudentRealm.java 3KB
PoiServiceImpl.java 2KB
SafeCode.java 2KB
Teacher.java 2KB
Sct.java 1KB
PageBean.java 1KB
Student.java 1KB
User.java 1KB
UserService.java 1KB
CourseList.java 1KB
CourseService.java 1KB
Course.java 924B
Department.java 641B
Admin.java 638B
PoiService.java 575B
SctMapper.java 560B
StudentMapper.java 478B
DepartmentMapper.java 442B
TeacherMapper.java 427B
CourseMapper.java 406B
AdminMapper.java 344B
CellRegion.java 223B
CourseListMapper.java 212B
preview2.jpg 968KB
preview3.jpg 309KB
preview.jpg 93KB
jquery.js 737KB
xlsx.core.min.js 446KB
bootstrap-select.js 122KB
tableExport.js 90KB
jquery.min.js 85KB
jquery.bootgrid.js 69KB
bootstrap.js 68KB
bootstrap-select.min.js 44KB
tableExport.min.js 37KB
bootstrap.min.js 36KB
jquery.bootgrid.min.js 23KB
popper.js 20KB
sha3.min.js 9KB
md5.js 9KB
checkinfo.js 7KB
md5.min.js 5KB
checkinfo.min.js 3KB
FileSaver.min.js 3KB
index.js 2KB
index.min.js 801B
jquery.bootgrid.fa.js 539B
npm.js 520B
jquery.bootgrid.fa.min.js 412B
TeacherInfo.jsp 8KB
StudentInfo.jsp 6KB
login.jsp 6KB
nav.jsp 5KB
score.jsp 5KB
studentuser.jsp 4KB
course.jsp 4KB
ChangePassword.jsp 4KB
teacheruser.jsp 4KB
studentuser.jsp 4KB
departmentInfo.jsp 3KB
500.jsp 3KB
nav.jsp 3KB
courseadd.jsp 3KB
nav.jsp 3KB
course.jsp 3KB
department.jsp 3KB
help.jsp 3KB
404.jsp 2KB
403.jsp 2KB
共 172 条
- 1
- 2
资源评论
神仙别闹
- 粉丝: 3861
- 资源: 7472
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功