Springboot练手----验证码、登陆、注册组件

Springboot练手----验证码、登陆、注册组件

Scroll Down

开始

设置验证码形式和登陆,注册的验证功能

验证码

创建工具类

由于之前在javaweb中有用到验证码,所以直接拿来用了,先创建一个工具类,用于生成验证码
本段代码参考了@孤傲苍狼

public class TextCodeUtils {
    //图片宽度为120像素
    public static final int WIDTH=120;
    //图片高度为30像素
    public static final int HEIGHT=30;
    //随机验证码的值
    private String randomsr=null; 

    /**
     * 判断验证码是否正确
     * @param validateCode 验证码
     * @param session 服务器的值
     * @return
     */
    public static boolean checkcode(String validateCode, HttpSession session){
        boolean bool=false;
        String clientCheckcodeM=validateCode.toUpperCase();
        String serverCheckcode=(String) session.getAttribute("checkcode");
        if (clientCheckcodeM.equals(serverCheckcode)) {//将客户端验证码和服务器端验证比较,如果相等,则表示验证通过
            bool = true;
        }
        return bool;
    }

    /**
     * 创建一个验证码
     * @return
     */

    public BufferedImage codes() {
        BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        Graphics2D dg = (Graphics2D) g;
        dg.setColor(Color.WHITE);//设置笔刷白色
        dg.fillRect(0, 0, WIDTH, HEIGHT);
        setBorder(g);
        drawRandomLine(g);
        randomsr = drawRandomNum((Graphics2D) g);
        return bi;
    }

    /**
     * 设置图片的边框
     * @param g
     */
    private void setBorder(Graphics g) {
        // 设置边框颜色
        g.setColor(Color.BLUE);
        // 边框区域
        g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
    }
    /**
     * 在图片上画随机线条
     * @param g
     */
    private void drawRandomLine(Graphics g) {
        // 设置颜色
        g.setColor(Color.GREEN);
        // 设置线条个数并画线
        for (int i = 0; i < 5; i++) {
            int x1 = new Random().nextInt(WIDTH);
            int y1 = new Random().nextInt(HEIGHT);
            int x2 = new Random().nextInt(WIDTH);
            int y2 = new Random().nextInt(HEIGHT);
            g.drawLine(x1, y1, x2, y2);
        }
    }
    /**
     * 画随机字符
     * @param g
     * @return
     */

    private String drawRandomNum(Graphics2D g) {
        // 设置颜色
        g.setColor(Color.RED);
        // 设置字体
        g.setFont(new Font("宋体", Font.BOLD, 20));
        //数字和字母的组合
        String baseNumLetter = "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";
        return createRandomChar(g, baseNumLetter);
    }
    /**
     * 创建随机字符
     * @param g
     * @param baseChar
     * @return 随机字符
     */
    private String createRandomChar(Graphics2D g,String baseChar) {
        StringBuffer sb = new StringBuffer();
        int x = 5;
        String ch ="";
        // 控制字数
        for (int i = 0; i < 4; i++) {
            // 设置字体旋转角度
            int degree = new Random().nextInt() % 30;
            ch = baseChar.charAt(new Random().nextInt(baseChar.length())) + "";
            sb.append(ch);
            // 正向角度
            g.rotate(degree * Math.PI / 180, x, 20);
            g.drawString(ch, x, 20);
            // 反向角度
            g.rotate(-degree * Math.PI / 180, x, 20);
            x += 30;
        }
        return sb.toString();
    }

    public String getRandomsr() {
        return randomsr;
    }
}
public BufferedImage codes()

用于生成一个验证码图片,并将验证码的值传给randomsr,外部类可以通过getRandomsr来获取验证码。

public static boolean checkcode(String validateCode, HttpSession session);

用来判断传入的值是否与验证码相等,相等返回ture,不相等返回false

验证码控制器

创建一个验证码的控制类,代码如下

@Controller
public class TextCodeController {
    private TextCodeUtils textCodeUtils=new TextCodeUtils();
    @RequestMapping("/code")
    public void code(HttpServletRequest request, HttpServletResponse response) throws IOException {

        BufferedImage bi=textCodeUtils.codes();
        //7.将随机数存在session中
        request.getSession().setAttribute("checkcode", textCodeUtils.getRandomsr());
        //8.设置响应头通知浏览器以图片的形式打开
        response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type", "image/jpeg");
        //9.设置响应头控制浏览器不要缓存
        response.setDateHeader("expries", -1);
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        //10.将图片写给浏览器
        ImageIO.write(bi, "jpg", response.getOutputStream());
    }
}

将验证码的值保存Session,并将图片输出给浏览器,选择"/code"作为前端路径
前端只要在验证图片路径上选择"/code"即可

自此验证码设置完毕

登陆注册控制

登陆控制器

创建一个登陆控制器代码如下

@Controller
public class LoginController {
    @Autowired
    UserService userService;

    @PostMapping("/user/login")
    public String longin(@RequestParam("username") String username,
                         @RequestParam("password") String password,
                         @RequestParam("validateCode") String validateCode,
                         Map<String,Object> map, HttpSession session){
        if (!TextCodeUtils.checkcode(validateCode,session)){
            map.put("msg","验证码错误");
            return "user/login";
        }

        String userpassword= userService.getPassword(username);
        if(password.equals(userpassword)){
            session.setAttribute("loginuser",username);
            return "redirect:/hello";
        }else {
            map.put("msg","用户名密码错误");
            return "user/login";
        }
    }
}

前端接口为/user/login,请求为post请求。进行两次判断,
第一次判断验证码是否正确

TextCodeUtils.checkcode("表单中的验证的值",Session)

第二次判断密码是否正确

password.equals("数据库中的用户密码")

当判断成功时登陆,并在Session(cookie)当然如果用cookie也行。

msg为错误信息前端通过msg进行弹窗,js代码如下

var fal="[[${msg}]]";
if (fal!=""){
    alert("[[${msg}]]");
}

注册控制器

创建一个注册控制器,代码如下

@Controller
public class RegisterController {
    @Autowired
    UserService userService;
    @PostMapping("user/register")
    public String register(@RequestParam("username") String username,
                           @RequestParam("password") String password,
                           @RequestParam("birthday") String birthday,
                           @RequestParam("validateCode") String validateCode,
                           Map<String,Object> map, HttpSession session){
        if (!TextCodeUtils.checkcode(validateCode,session)){
            map.put("msg","验证码错误");
            return "user/register";
        }
        user user=new user(username,password,birthday);
        try {
            userService.insertUser(user);
        } catch (Exception e) {
            map.put("msg","注册失败,已有该用户名");
            return "user/register";
        }
        map.put("msg","注册成功快登陆吧");
        return "user/login";
    }
}

和登陆一样的是优先进行验证码判断,以及传送msg错误信息。

当验证码无误时,创建一个user,并将其添加到数据库中

user user=new user("用户名","密码","生日");

user是一个结构体,用于表征用户,具体代码如下:

public class user {
    private int id; //用户ID
    private String username; //姓名
    private String password; //密码
    private String birthday; //生日
    private String Creation_time; //创建时间

    public user(){}

    public user(String username, String password) {
        this.username = username;
        this.password = password;
    }


    public user(String username, String password, String birthday) {
        this.username = username;
        this.password = password;
        this.birthday = birthday;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public void setCreation_time(String creation_time) {
        Creation_time = creation_time;
    }

    public int getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getBirthday() {
        return birthday;
    }

    public String getCreation_time() {
        return Creation_time;
    }
}

当注册失败时返回注册界面,注册成功时候返回登陆界面。并设置弹窗信息。

自此,登陆界面完成