基于javaweb+mysql的springboot在线选课系统(java+springboot+html+thymeleaf+ssm+redis+maven+mysql)

基于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模板引擎

使用教程

  1. 下载项目之后 等待maven安装对应jar包 2. 自行下载redis 并按照资源包下的application.yml要求进行配置

  2. 自行安装MySQL数据库 执行资源包下的sql文件

使用说明

  1. 运行redis服务器 2. 启动项目 3. 访问localhost:8080

  2. 用户名: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
 */

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值