基于javaweb+mysql的springboot在线选课系统(java+springboot+html+thymeleaf+ssm+redis+maven+mysql)
运行环境
Java≥8、MySQL≥5.7
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SpringBoot在线选课系统(java+springboot+html+thymeleaf+ssm+redis+maven+mysql)
基于javaweb+SpringBoot的在线选课系统(java+SpringBoot+semanticUI+thymeleaf+ssm+redis+maven+mysql)
项目介绍
后端技术包含springboot+mybatis+spring security+mysql+redis
前端技术包含 semanticUI + thymeleaf模板引擎
使用教程
-
下载项目之后 等待maven安装对应jar包 2. 自行下载redis 并按照资源包下的application.yml要求进行配置
-
自行安装MySQL数据库 执行资源包下的sql文件
使用说明
-
运行redis服务器 2. 启动项目 3. 访问localhost:8080
-
用户名:admin 密码:admin
注意事项
若导出信息时报错,则需要设置mysql,设置方式如下: SELECT @@sql_mode; 查看是否包含ONLY_FULL_GROUP_BY;若包含,则执行以下命令: SET GLOBAL sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’; SET SESSION sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’; 执行完成后,再通过SELECT @@sql_mode; 来查看;
注意:该方法仅用于临时修改,重启mysql后,以上设置失效。
System.out.println(new BCryptPasswordEncoder(4).encode("123456"));
}
@Bean
public LogoutSuccessHandler logoutSuccessHandler(){ //登出处理
return new LogoutSuccessHandler(){
@Override
public void onLogoutSuccess(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Authentication authentication) throws IOException, ServletException{
try{
SecurityUser user = (SecurityUser) authentication.getPrincipal();
logger.info("用户 : {} 登出成功 ! " , user.getUsername());
}catch(Exception e){
logger.error("printStackTrace" , e);
}
httpServletResponse.sendRedirect("/login");
}
};
}
@Bean
public SavedRequestAwareAuthenticationSuccessHandler loginSuccessHandler(){ //登入处理
return new SavedRequestAwareAuthenticationSuccessHandler(){
@Override
public void onAuthenticationSuccess(HttpServletRequest request , HttpServletResponse response , Authentication authentication) throws IOException, ServletException{
User userDetails = (User) authentication.getPrincipal();
logger.info("用户 : " + userDetails.getUsername() + " 登录成功! ");
super.onAuthenticationSuccess(request , response , authentication);
}
};
}
@Bean
@Override
public UserDetailsService userDetailsService(){ //用户登录实现
return new UserDetailsService(){
@Autowired
private UserService userService;
@Autowired
private AdminService adminService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
User user = null;
if("admin".equals(username)){
user = adminService.login(username);
}else{
@PreAuthorize("hasAuthority('student')")
public String info(){
return "studentInfo";
}
@GetMapping("/getCode")
@ResponseBody
public Object getCode(HttpServletRequest request) {
/* 生成验证码字符串 */
String verifyCode = VerifyCodeUtil.generateVerifyCode(4);
String uuid = UUIDUtil.GeneratorUUIDOfSimple();
HttpSession session = request.getSession();
session.setAttribute(uuid,verifyCode); //将验证码与生成的uuid绑定在一起
System.out.println("生成的验证码为:" + verifyCode);
int width = 111,height = 36;
try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
VerifyCodeUtil.outputImage(width, height, stream, verifyCode);
return Msg.msg("data",new ImgVO("data:image/gif;base64,"+ Base64Utils.encodeToString(stream.toByteArray()),uuid));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public User getUser() { //为了session从获取用户信息,可以配置如下
User user = new User();
SecurityContext ctx = SecurityContextHolder.getContext();
Authentication auth = ctx.getAuthentication();
if (auth.getPrincipal() instanceof UserDetails) user = (User) auth.getPrincipal();
return user;
}
public HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
}
package cn.gdpu.config.security.filter;
HSSFRow newRow2 = sheet.createRow(count);
count++;
}
//准备将Excel的输出流通过response输出到页面下载
//八进制输出流
response.setContentType("application/octet-stream");
//这后面可以设置导出Excel的名称,此例中名为student.xls
response.setHeader("Content-disposition" , "attachment;filename=student.xls");
//刷新缓冲
response.flushBuffer();
//workbook将Excel写入到response的输出流中,供页面下载
workbook.write(response.getOutputStream());
}
}
package cn.gdpu.controller;
/**
* @ClassName UserCourseController
*/
@RestController
@RequestMapping("usercourse")
@Api
public class UserCourseController{
public class SelectableCourseController{
@Autowired
SelectableCourseService selectableCourseService;
/**
* 获得全部课程
* @param page
* @param limit
* @param username
* @return
*/
@PostMapping("/getAll")
public Object getAll(@RequestParam(value = "page", defaultValue = "1") int page ,
@RequestParam(value = "limit", defaultValue = "10") int limit ,
@RequestParam(value = "username", required = false) String username){
return selectableCourseService.selectAll(page,limit,username);
}
/**
* 根据课程类别搜索课程
* @param page
* @param limit
* @param username
* @param type
* @return
*/
@PostMapping("/getCourseByType")
public Object getCourseByType(@RequestParam(value = "page", defaultValue = "1") int page ,
@RequestParam(value = "limit", defaultValue = "10") int limit ,
@RequestParam(value = "username", required = false) String username ,
@RequestParam("courseType") String type){
return selectableCourseService.selectCoursesByType(page,limit,type , username);
}
/**
* 根据课程所属学院名称搜索课程
* @param page
* @param limit
* @param username
* @param name
* @return
*/
@PostMapping("/getCourseByCollege")
public Object getCourseByCollege(@RequestParam(value = "page", defaultValue = "1") int page ,
@RequestParam(value = "limit", defaultValue = "10") int limit ,
@RequestParam(value = "username", required = false) String username ,
@RequestParam("college") String name){
return selectableCourseService.selectCoursesByCollege(page,limit,name , username);
}
/**
* 根据课程名称模糊搜索课程
/**
* @ClassName SelectableCourseController
*/
@RestController
@RequestMapping("/course")
@Api
public class SelectableCourseController{
@Autowired
SelectableCourseService selectableCourseService;
/**
* 获得全部课程
* @param page
* @param limit
* @param username
* @return
*/
@PostMapping("/getAll")
public Object getAll(@RequestParam(value = "page", defaultValue = "1") int page ,
@RequestParam(value = "limit", defaultValue = "10") int limit ,
@RequestParam(value = "username", required = false) String username){
return selectableCourseService.selectAll(page,limit,username);
}
/**
* 根据课程类别搜索课程
* @param page
* @param limit
* @param username
* @param type
* @return
*/
@PostMapping("/getCourseByType")
public Object getCourseByType(@RequestParam(value = "page", defaultValue = "1") int page ,
@RequestParam(value = "limit", defaultValue = "10") int limit ,
@RequestParam(value = "username", required = false) String username ,
@RequestParam("courseType") String type){
return selectableCourseService.selectCoursesByType(page,limit,type , username);
}
*/
public class UploadImage{
private static Logger logger = LoggerFactory.getLogger(UploadImage.class);
//上传图片
public static String uploadImage(HttpServletRequest request , MultipartFile file){
BufferedOutputStream stream = null;
if(!file.isEmpty()){
try{
String uploadFilePath = file.getOriginalFilename(); //获取文件原名称 C:\Users\ttaurus\Pictures\222.jpg
// 截取上传文件的文件名
String uploadFileName = System.currentTimeMillis() + "";
//System.out.println("multiReq.getFile()文件名为:" + uploadFileName);
// 截取上传文件的后缀
String uploadFileSuffix = uploadFilePath.substring(
uploadFilePath.indexOf('.') + 1 , uploadFilePath.length());
//System.out.println("uploadFileSuffix:文件后缀名为" + uploadFileSuffix);
//防止文件名重复 然后导致覆盖 使用字符串
String uuid = UUID.randomUUID().toString().replace("-" , "");
uploadFileName = uploadFileName + "_" + uuid;
String path = request.getServletContext().getRealPath("/img");
new File(path).mkdirs();
String dbPath = "/img/" + uploadFileName + "." + uploadFileSuffix;
stream = new BufferedOutputStream(new FileOutputStream(new File(
path , uploadFileName + "." + uploadFileSuffix))); //指定存入地址。。
byte[] bytes = file.getBytes();
stream.write(bytes , 0 , bytes.length);
logger.debug("文件上传成功 " + uploadFileName);
return dbPath;
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(stream != null){
public class AdminService{
@Autowired
AdminDAO adminDAO;
@Autowired
UserDAO userDAO;
@Autowired
SelectableCourseDAO selectableCourseDAO;
@Autowired
UserCourseDAO userCourseDAO;
//用户登录
public User login(String username){
return adminDAO.login(username);
}
//导出学生选课信息
public void excelOut(HttpServletResponse response) throws IOException{
int count = 0;
//表头数据
String[] header = {"学生id" , "姓名" , "学号" , "专业" };
//学生数据
List<User> users = userDAO.selectAll();
//已被选择的课程数据
List<SelectableCourse> courses = selectableCourseDAO.selectedCourses();
//学生的选课数据.
List<UserCourse> userCourses = userCourseDAO.selectAll();
//声明一个工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//生成一个表格,设置表格名称为"学生表"
HSSFSheet sheet = workbook.createSheet("学生选课表");
//设置表格列宽度为10个字节
sheet.setDefaultColumnWidth(10);
for(SelectableCourse cours : courses){
//创建第一行表头
HSSFRow headrow = sheet.createRow(count);
//创建一个单元格
HSSFCell cell = headrow.createCell(0);
//创建一个内容对象 (课程名称)
HSSFRichTextString text = new HSSFRichTextString("课程名称:"+cours.getCourseName()+" 任课老师:"+cours.getTeacher()+" 上课时间:"+cours.getAddress());
//将内容对象的文字内容写入到单元格中
cell.setCellValue(text);
count++;
//遍历添加表头(下面模拟遍历学生,也是同样的操作过程)
//创建第2行表头
HSSFRow row = sheet.createRow(count);
/**
* @ClassName AdminController
*/
@Controller
@Api
public class LoginController{
@Autowired
AdminService adminService;
@Autowired
UserService userService;
@RequestMapping("/login")
public String login(){
return "login";
}
@GetMapping("/")
public String index() {
return "success";
}
@GetMapping("/manager")
@PreAuthorize("hasAuthority('admin')")
public String manager(){
return "manager";
}
//@RequestMapping("/error")
//public String error(){
// return "error";
//}
@GetMapping("/info")
@PreAuthorize("hasAuthority('student')")
public String info(){
return "studentInfo";
}
@GetMapping("/getCode")
@ResponseBody
public Object getCode(HttpServletRequest request) {
@PreAuthorize("hasAuthority('admin') or hasAuthority('student')")
public Object studentInfo(@RequestParam(value = "page", defaultValue = "1") int page ,
@RequestParam(value = "limit", defaultValue = "10") int limit ,
@RequestParam("username")String username){
try{
Map<String,Object> map = new HashMap<>();
PageHelper.startPage(page , limit);
List<SelectableCourse> list = selectableCourseDAO.selectByUser(username);
if(list == null){
return Msg.fail();
}
//System.out.println("=="+username+"==");
PageInfo<SelectableCourse> pageInfo = new PageInfo<>(list);
map.put("totalPage" , pageInfo.getPages()); //总页数
map.put("totalCount" , pageInfo.getTotal()); //总条数
map.put("currentPage" , page); //当前页数。
map.put("data" , pageInfo.getList()); //获得的数据量
map.put("tCase",username);
return JSON.toJSON(map);
}catch(Exception e){
e.printStackTrace();
return Msg.fail();
}
}
//测试。
@PostMapping("cc")
public Object cc(){
Map<String,Object> map = new HashMap<>();
try{
selectableCourseDAO.updateMinCourseStock(1);
return true;
}catch(Exception e){
if(e instanceof DataIntegrityViolationException){
map.put("msg","该课程已经被抢完啦。");
}else{
map.put("msg","出现其他异常,选课失败!");
}
map.put("flag",false);
return JSON.toJSON(map);
/**
* @ClassName AdminController
*/
@Controller
@Api
public class LoginController{
@Autowired
AdminService adminService;
@Autowired
UserService userService;
@RequestMapping("/login")
public String login(){
return "login";
}
@GetMapping("/")
public String index() {
return "success";
}
@GetMapping("/manager")
@PreAuthorize("hasAuthority('admin')")
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
User user = null;
if("admin".equals(username)){
user = adminService.login(username);
}else{
user = userService.login(username);
}
if(user == null) throw new UsernameNotFoundException("Username " + username + " not found");
return new SecurityUser(user);
//String role = user.getRole();
//SimpleGrantedAuthority authority = new SimpleGrantedAuthority(role);
}
};
}
}
package cn.gdpu.controller;
/**
* @ClassName SelectableCourseController
*/
@RestController
@RequestMapping("/course")
@Api
public class SelectableCourseController{
@RequestParam(value = "description",defaultValue = "")String description){
try{
return selectableCourseService.addCourse(courseName,collegeId,courseType,teacher,score,stock,address,description);
}catch(Exception e){
e.printStackTrace();
return Msg.msg("出现异常,添加课程失败!");
}
}
}
package cn.gdpu.service;
/**
* @ClassName AdminService
*/
@Service
public class AdminService{
@Autowired
AdminDAO adminDAO;
@Autowired
UserDAO userDAO;
@Autowired
SelectableCourseDAO selectableCourseDAO;
@Autowired
UserCourseDAO userCourseDAO;
//用户登录
public User login(String username){
return adminDAO.login(username);
}
//导出学生选课信息
public void excelOut(HttpServletResponse response) throws IOException{
int count = 0;
//表头数据
}
//测试。
@PostMapping("cc")
public Object cc(){
Map<String,Object> map = new HashMap<>();
try{
selectableCourseDAO.updateMinCourseStock(1);
return true;
}catch(Exception e){
if(e instanceof DataIntegrityViolationException){
map.put("msg","该课程已经被抢完啦。");
}else{
map.put("msg","出现其他异常,选课失败!");
}
map.put("flag",false);
return JSON.toJSON(map);
}
}
}
package cn.gdpu.controller;
@RequestMapping("/login")
public String login(){
return "login";
}
@GetMapping("/")
public String index() {
return "success";
}
@GetMapping("/manager")
@PreAuthorize("hasAuthority('admin')")
public String manager(){
return "manager";
}
//@RequestMapping("/error")
//public String error(){
// return "error";
//}
@GetMapping("/info")
@PreAuthorize("hasAuthority('student')")
public String info(){
return "studentInfo";
}
@GetMapping("/getCode")
@ResponseBody
public Object getCode(HttpServletRequest request) {
/* 生成验证码字符串 */
String verifyCode = VerifyCodeUtil.generateVerifyCode(4);
String uuid = UUIDUtil.GeneratorUUIDOfSimple();
HttpSession session = request.getSession();
session.setAttribute(uuid,verifyCode); //将验证码与生成的uuid绑定在一起
System.out.println("生成的验证码为:" + verifyCode);
int width = 111,height = 36;
try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
VerifyCodeUtil.outputImage(width, height, stream, verifyCode);
return Msg.msg("data",new ImgVO("data:image/gif;base64,"+ Base64Utils.encodeToString(stream.toByteArray()),uuid));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//以下这句就可以控制单个用户只能创建一个session,也就只能在服务器登录一次
and().sessionManagement().maximumSessions(1).expiredUrl("/login");
http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class); //使每次验证之前必须走验证码过滤器
}
//认证。
//密码编码 passwordEncoder
//springboot security 新增了很多加密方法 且默认是需要密码加密的。也可设置不需要加密。
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{
//从数据库读去 用户及用户对应的权限。
auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder()); //对密码加密
auth.eraseCredentials(false);
//auth.authenticationProvider(authenticationProvider());
}
@Bean
public TokenBasedRememberMeServices tokenBasedRememberMeServices(){
return new TokenBasedRememberMeServices("springRocks" , userDetailsService());
}
@Bean
public BCryptPasswordEncoder passwordEncoder(){ //密码加密
return new BCryptPasswordEncoder(4);
}
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder(4).encode("123456"));
}
@Bean
public LogoutSuccessHandler logoutSuccessHandler(){ //登出处理
return new LogoutSuccessHandler(){
@Override
public void onLogoutSuccess(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Authentication authentication) throws IOException, ServletException{
try{
SecurityUser user = (SecurityUser) authentication.getPrincipal();
logger.info("用户 : {} 登出成功 ! " , user.getUsername());
}catch(Exception e){
logger.error("printStackTrace" , e);
}
httpServletResponse.sendRedirect("/login");
}
};
}
@Bean
public SavedRequestAwareAuthenticationSuccessHandler loginSuccessHandler(){ //登入处理
return new SavedRequestAwareAuthenticationSuccessHandler(){
@Override
public void onAuthenticationSuccess(HttpServletRequest request , HttpServletResponse response , Authentication authentication) throws IOException, ServletException{
User userDetails = (User) authentication.getPrincipal();
logger.info("用户 : " + userDetails.getUsername() + " 登录成功! ");
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//A、设置服务器端的编码
response.setCharacterEncoding("utf-8");
HttpSession session = request.getSession();
//B、通知浏览器服务器发送的数据格式
response.setContentType("text/html;charset=utf-8");
if(request.getRequestURI().equals("/login")&&request.getMethod().equalsIgnoreCase("post")){
try {
validate(request);
} catch (VerifyCodeException e) {
log.error("登录失败 [{}] ",e.getMessage());
request.getSession().setAttribute("login_msg",e.getMessage());
//request.getRequestDispatcher("/login?error=true");
response.sendRedirect("/login");
return;
}
}
// 3. 校验通过,就放行
filterChain.doFilter(request, response);
//清除session里的信息 且必须先准备好session对象 因为放行之后找不到对应的sessionid了
session.removeAttribute("login_msg");
}
private void validate(HttpServletRequest request) throws ServletRequestBindingException{
String captcha = ServletRequestUtils.getStringParameter(request, "captcha"); //拿到表单传进来的验证码数值
String code = (String) request.getSession().getAttribute(request.getParameter("uuid")); //拿到存放在session的验证码数值
if(!code.equalsIgnoreCase(captcha)){
request.getSession().removeAttribute(request.getParameter("uuid")); //清除session里的信息
throw new VerifyCodeException("验证码不正确!");
}
}
}
package cn.gdpu.util;
/**
* @ClassName UploadImage 上传图片工具类
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//A、设置服务器端的编码
response.setCharacterEncoding("utf-8");
HttpSession session = request.getSession();
//B、通知浏览器服务器发送的数据格式
response.setContentType("text/html;charset=utf-8");
if(request.getRequestURI().equals("/login")&&request.getMethod().equalsIgnoreCase("post")){
try {
validate(request);
} catch (VerifyCodeException e) {
log.error("登录失败 [{}] ",e.getMessage());
request.getSession().setAttribute("login_msg",e.getMessage());
//request.getRequestDispatcher("/login?error=true");
response.sendRedirect("/login");
return;
}
}
// 3. 校验通过,就放行
filterChain.doFilter(request, response);
//清除session里的信息 且必须先准备好session对象 因为放行之后找不到对应的sessionid了
session.removeAttribute("login_msg");
}
private void validate(HttpServletRequest request) throws ServletRequestBindingException{
String captcha = ServletRequestUtils.getStringParameter(request, "captcha"); //拿到表单传进来的验证码数值
String code = (String) request.getSession().getAttribute(request.getParameter("uuid")); //拿到存放在session的验证码数值
if(!code.equalsIgnoreCase(captcha)){
request.getSession().removeAttribute(request.getParameter("uuid")); //清除session里的信息
throw new VerifyCodeException("验证码不正确!");
}
}
}
package cn.gdpu.util;
/**
* @ClassName UploadImage 上传图片工具类
*/
public class UploadImage{
public class Msg {
public static Object empty(){
Map<String,Object> map = new TreeMap<>();
map.put("code", 0);
map.put("count", 0);
map.put("data", new ArrayList());
map.put("msg", "搜索结果为空");
return JSON.toJSON(map);
}
public static Object ok(){
JSONObject json = new JSONObject();
json.put("msg", "ok");
return JSON.toJSON(json);
}
public static Object fail(){
JSONObject json = new JSONObject();
json.put("msg", "fail");
return JSON.toJSON(json);
}
public static Object msg(String type, Object msg){
Map<String,Object> result = new HashMap<>();
result.put(type, msg);
return JSON.toJSON(result);
}
public static Object msg(Integer code,String type, Object msg){
Map<String,Object> result = new HashMap<>();
result.put(type, msg);
return JSON.toJSON(result);
httpServletResponse.sendRedirect("/login");
}
};
}
@Bean
public SavedRequestAwareAuthenticationSuccessHandler loginSuccessHandler(){ //登入处理
return new SavedRequestAwareAuthenticationSuccessHandler(){
@Override
public void onAuthenticationSuccess(HttpServletRequest request , HttpServletResponse response , Authentication authentication) throws IOException, ServletException{
User userDetails = (User) authentication.getPrincipal();
logger.info("用户 : " + userDetails.getUsername() + " 登录成功! ");
super.onAuthenticationSuccess(request , response , authentication);
}
};
}
@Bean
@Override
public UserDetailsService userDetailsService(){ //用户登录实现
return new UserDetailsService(){
@Autowired
private UserService userService;
@Autowired
private AdminService adminService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
User user = null;
if("admin".equals(username)){
user = adminService.login(username);
}else{
user = userService.login(username);
}
if(user == null) throw new UsernameNotFoundException("Username " + username + " not found");
return new SecurityUser(user);
//String role = user.getRole();
//SimpleGrantedAuthority authority = new SimpleGrantedAuthority(role);
}
};
}
}
package cn.gdpu.controller;
/**
* 一种成功的身份验证策略,通过ExceptionTranslationFilter,默认将DefaultSavedRequest
* 存储在session中
*
* 当这样的请求被截获并需要身份验证时,在身份验证过程开始之前存储请求数据以记录原始目的地(url)
* 并允许在重定向到相同的URL时重键请求,如果合适的话,这个类负责执行到原始URL的重定向。
*
* 在成功进行验证之后,它根据以下场景确定重定向目标:
*
* 1. 如果alwaysUseDefaultTargetUrl属性设置为true,则defaultTargetUrl将用于目标.
* 会话中存储的任何defaultSavedRequest将被删除。
* 2. 如果在请求中设置了targetUrlParameter,则该值将用作目标。defaultTargetUrl将再次被删除
* 3. 如果在RequestCache中找到SavedRequest(由ExceptionTranslationFilter所设置,在验证过程
* 开始之前记录原始目的地),将对原始目的地的Url执行重定向。当收到重定向请求时,SavedRequest对象
* 将保持缓存状态并被拾取(请参阅SavedRequestAwareWrapper)
* 4.如果找不到SavedRequest它将委托给基类(父类)。
*
* @since Jun 25, 2019 01:41:57 AM
*/
@Component
public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler{
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
// 会帮我们跳转到上一次请求的页面上
//super.onAuthenticationSuccess(request, response, authentication);
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
//PrintWriter writer = response.getWriter();
//writer.write("登录成功");
//writer.flush();
//writer.close();
}
}
package cn.gdpu.controller;
/**
* @ClassName AdminController
*/
@Controller
@Api
public class LoginController{
@Autowired
AdminService adminService;
@Autowired
UserService userService;
@RequestMapping("/login")
public String login(){
return "login";
}
@GetMapping("/")
public String index() {
return "success";
}
@GetMapping("/manager")
@PreAuthorize("hasAuthority('admin')")
public String manager(){
return "manager";
}
//@RequestMapping("/error")
//public String error(){
// return "error";
//}
@GetMapping("/info")
@PreAuthorize("hasAuthority('student')")
public String info(){
return "studentInfo";
}
/**
* 一种成功的身份验证策略,通过ExceptionTranslationFilter,默认将DefaultSavedRequest
* 存储在session中
*
* 当这样的请求被截获并需要身份验证时,在身份验证过程开始之前存储请求数据以记录原始目的地(url)
* 并允许在重定向到相同的URL时重键请求,如果合适的话,这个类负责执行到原始URL的重定向。
*
* 在成功进行验证之后,它根据以下场景确定重定向目标:
*
* 1. 如果alwaysUseDefaultTargetUrl属性设置为true,则defaultTargetUrl将用于目标.
* 会话中存储的任何defaultSavedRequest将被删除。
* 2. 如果在请求中设置了targetUrlParameter,则该值将用作目标。defaultTargetUrl将再次被删除
* 3. 如果在RequestCache中找到SavedRequest(由ExceptionTranslationFilter所设置,在验证过程
* 开始之前记录原始目的地),将对原始目的地的Url执行重定向。当收到重定向请求时,SavedRequest对象
* 将保持缓存状态并被拾取(请参阅SavedRequestAwareWrapper)
* 4.如果找不到SavedRequest它将委托给基类(父类)。
*
* @since Jun 25, 2019 01:41:57 AM
*/
@Component
public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler{
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
// 会帮我们跳转到上一次请求的页面上
//super.onAuthenticationSuccess(request, response, authentication);
}
//System.out.println("=="+username+"==");
PageInfo<SelectableCourse> pageInfo = new PageInfo<>(list);
map.put("totalPage" , pageInfo.getPages()); //总页数
map.put("totalCount" , pageInfo.getTotal()); //总条数
map.put("currentPage" , page); //当前页数。
map.put("data" , pageInfo.getList()); //获得的数据量
map.put("tCase",username);
return JSON.toJSON(map);
}catch(Exception e){
e.printStackTrace();
return Msg.fail();
}
}
//测试。
@PostMapping("cc")
public Object cc(){
Map<String,Object> map = new HashMap<>();
try{
selectableCourseDAO.updateMinCourseStock(1);
return true;
}catch(Exception e){
if(e instanceof DataIntegrityViolationException){
map.put("msg","该课程已经被抢完啦。");
}else{
map.put("msg","出现其他异常,选课失败!");
}
map.put("flag",false);
return JSON.toJSON(map);
}
}
}
package cn.gdpu.controller;
return "success";
}
@GetMapping("/manager")
@PreAuthorize("hasAuthority('admin')")
public String manager(){
return "manager";
}
//@RequestMapping("/error")
//public String error(){
// return "error";
//}
@GetMapping("/info")
@PreAuthorize("hasAuthority('student')")
public String info(){
return "studentInfo";
}
@GetMapping("/getCode")
@ResponseBody
public Object getCode(HttpServletRequest request) {
/* 生成验证码字符串 */
String verifyCode = VerifyCodeUtil.generateVerifyCode(4);
String uuid = UUIDUtil.GeneratorUUIDOfSimple();
HttpSession session = request.getSession();
session.setAttribute(uuid,verifyCode); //将验证码与生成的uuid绑定在一起
System.out.println("生成的验证码为:" + verifyCode);
int width = 111,height = 36;
try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
VerifyCodeUtil.outputImage(width, height, stream, verifyCode);
return Msg.msg("data",new ImgVO("data:image/gif;base64,"+ Base64Utils.encodeToString(stream.toByteArray()),uuid));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public User getUser() { //为了session从获取用户信息,可以配置如下
User user = new User();
SecurityContext ctx = SecurityContextHolder.getContext();
return JSON.toJSON(map);
}
}
}
package cn.gdpu.controller;
/**
* @ClassName AdminController
*/
@Controller
@Api
public class LoginController{
@Autowired
AdminService adminService;
@Autowired
UserService userService;
@RequestMapping("/login")
public String login(){
}
return null;
}
public User getUser() { //为了session从获取用户信息,可以配置如下
User user = new User();
SecurityContext ctx = SecurityContextHolder.getContext();
Authentication auth = ctx.getAuthentication();
if (auth.getPrincipal() instanceof UserDetails) user = (User) auth.getPrincipal();
return user;
}
public HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
}
package cn.gdpu.config.security.filter;
/**
* @ClassName VerifyCodeFilter
*/