SpringBoot中使用MySQL存用户信息, 日志的使用

news2024/11/15 8:48:52

SpringBoot中使用MySQL存用户信息

UserController类

package com.tedu.secboot.controller;
import com.tarena.mnmp.api.SendParam;
import com.tedu.secboot.entity.User;
import com.tedu.secboot.util.DBUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Random;

@Controller
public class UserController {
    private static Logger logger = LoggerFactory.getLogger(UserController.class);//导入日志

    @RequestMapping("/regUser")    
    /*之前写法
    public void reg(HttpServletRequest request, HttpServletResponse response){
        System.out.println("开始处理注册");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String nickname = request.getParameter("nickname");
        String ageStr = request.getParameter("age");
        int age = Integer.parseInt(ageStr);
        System.out.println(username+","+password+","+nickname+","+age);
    }*/

    /**
     * SpringMVC框架会根据先通过User的无参构造器实例化User
     * 并利用User对象的属性名去request中获取同名参数并利用User对象上对应属性的set方法将值设置到该属性上。
     *
     * 因此如果以自己定义的一个对象作为参数时,该对象的类要满足:
     * 1:属性名与浏览器传递过来的参数名一致
     * 2:类要有无参公开的构造器
     * 3:属性有set方法
     * 注:只要类设计符合JAVA_BEAN设计规范就可以。
     */
//    public void reg(User user,HttpServletResponse response){
//        System.out.println(user);
//    }

    //方法上的参数名要与原request.getParameter()方法传入的字符串内容一致(相当于与表单输入框名字一致)
    public void reg(String username,String password,String nickname,int age,String phone, HttpServletResponse response){
      //日志
        logger.debug("开始处理注册");//debug级别一般记录的是用于跟踪程序执行流程
        logger.info(username+","+password+","+nickname+","+age+","+phone);//info通常记录程序所用到的数据,当我们获取用户信息时可通过info记录
        //必要验证工作
        if(username==null||username.isEmpty()||password==null||password.isEmpty()||
                nickname==null||nickname.isEmpty()||phone==null||phone.isEmpty()||
                !phone.matches("[0-9]{11}")){
            //warn用于记录警告内容。例如:正常注册前端验证后通常不会进到这个if里,进来这里说明用户绕过了前端验证,这里要警告程序员。
            logger.warn("注册信息验证错误:"+username+","+password+","+nickname+","+age+","+phone);
            //要求浏览器查看错误提示页面
            try {
                response.sendRedirect("/reg_info_error.html");
            } catch (IOException e) {
                e.printStackTrace();
                //error用于记录程序实际出现的错误。
                logger.error(e.getMessage(),e);
            }
            return;
        }
        //2
        /*
            将该注册用户插入到数据库userinfo表中。
            插入成功后,响应注册成功页面
         */
        try (
                Connection conn = DBUtil.getConnection();
        ){
            String sql1 = "SELECT username FROM userinfo WHERE username=?";
            PreparedStatement ps = conn.prepareStatement(sql1);
            ps.setString(1,username);
            ResultSet rs = ps.executeQuery();
            if(rs.next()){//结果集若存在记录,该用户已存在。
                response.sendRedirect("/have_user.html");
                return;
            }

            String sql2 = "INSERT INTO userinfo(username,password,nickname,age) " +
                    "VALUES (?,?,?,?)";
            ps = conn.prepareStatement(sql2);
            ps.setString(1,username);
            ps.setString(2,password);
            ps.setString(3,nickname);
            ps.setInt(4,age);
            int sum = ps.executeUpdate();
            if(sum>0){
                response.sendRedirect("/reg_success.html");
                //发送短信
                String code = randomCode();//生成验证码
                System.out.println("验证码:"+code);
                //创建发送参数对象
                SendParam param = new SendParam.DefaultSendParam().defaultSendParam(code,phone);
                //借助Spring提供的RestTemplate
                new RestTemplate().postForObject(
                        "http://124.71.224.210:8082/send/sms",
                        param,
                        String.class
                );//向消息中台发送一个HTTP请求
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String randomCode(){
        Random random = new Random();
        StringBuilder builder = new StringBuilder(random.nextInt(1000000)+"");
        for(int i=builder.length();i<6;i++){//随机生成的验证码不足6位时前面补充若干个0达到6位
            builder.insert(0,"0");
        }
        return builder.toString();
    }

}

User

package com.tedu.secboot.entity;

/**
 * 该类的每一个实例用于表示一个注册用户信息
 */
public class User {
    private int id;
    private String username;
    private String password;
    private String nickname;
    private int age;

    public User(){}

    public User(int id, String username, String password, String nickname, int age) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.nickname = nickname;
        this.age = age;
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", nickname='" + nickname + '\'' +
                ", age=" + age +
                '}';
    }
}

日志的使用

Logger记录日志时常用的方法:

  • trace(): trace级别日志
    所有方法都会被记录到日志中
  • debug():debug级别日志
    debug级别一般记录的是用于跟踪程序执行流程
  • info():info级别日志
    info通常记录程序所用到的数据,当我们获取用户信息时可通过info记录
  • warn():warn级别日志
    warn用于记录警告内容。例如:正常注册前端验证后通常不会进到这个if里,进来这里说明用户绕过了前端验证,这里要警告程序员。
  • error():error级别日志
    error用于记录程序实际出现的错误。

日志级别:

 trace<debug<info<warn<error

例如:

  • 如果在application.properties下指定的日志级别为:trace
    那么上述所有方法都会被记录到日志中。

  • 如果在application.properties下指定的日志级别为:debug
    那么除了trace记录的不会保留,剩下的都会保留

具体实现

在这里插入图片描述
在这里插入图片描述

更多可以参考这篇文章: 跳转链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flink教程(2)-source- sink

一、flink可识别的source分类 Sources are where your program reads its input from. You can attach a source to your program by using StreamExecutionEnvironment.addSource(sourceFunction). Flink comes with a number of pre-implemented source functions, but you c…

[附源码]计算机毕业设计游戏商城平台论文Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计springboot线上评分分享平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Android App】人脸识别中OpenCV根据人脸估算性别和年龄实战(附源码和演示 超详细)

需要源码请点赞关注收藏后评论区留言私信~~~ 人脸蕴含的信息量巨大&#xff0c;不管是青春还是年少&#xff0c;还是老年沧桑&#xff0c;都能体现出来&#xff0c;不过从人脸估算年龄估算年龄全凭经验&#xff0c;毕竟计算机无法根据固定框架判断年龄&#xff0c;那么计算机的…

ZYNQ之FPGA学习----IIC协议驱动模块仿真实验

1 IIC通信协议简介 IIC通信协议基础知识学习&#xff1a;硬件设计基础----通信协议IIC 2 实验任务 设计IIC驱动模块&#xff0c;并进行仿真验证&#xff0c;观察仿真波形 3 实验设计 3.1 创建工程 新建工程&#xff0c;操作如图所示&#xff1a; 输入工程名和路径&#x…

C++I/O流详解

目录 一&#xff0c;引入 二&#xff0c;C中的输入输出 1&#xff0c;输入输出流分类 2&#xff0c;I/O流类的安全性和可扩展性 (1)I/O流类的安全性 (2)I/O流类的扩展性 三&#xff0c;流类库简介 1&#xff0c;I/O流类库 2&#xff0c;缓冲区类 四&#xff0c;标准输…

python入门基础

1 变量和简单数据类型 变量命名格式&#xff1a;变量名 “赋值” 1.1 变量使用规范 使用变量时&#xff0c;需要遵守一些规则。违反这些规则将引发错误。 ~变量名只能包含数字、字母、下划线。变量名不能以数字开头以及不能包含空格。 ~变量名不能将Python保留字和函数名…

SpringColud——Eureka注册中心

目录 1、SpringColud概述 1.1、什么是微服务 1.2、什么是SpringColud&#xff1f; 1.3、SpringColud的特点 2、SpringColud环境准备 2.1、创建父工程 2.2、修改pom.xml文件 2.3、服务提供者——创建子工程 2.4、编写启动类 2.5、编写User类 2.6、编写UserMapper接口…

永磁同步电机恒压频比(V/F)开环控制系统Matlab/Simulink仿真分析及代码生成到工程实现

文章目录前言一、 恒压频比&#xff08;V/F&#xff09;控制原理二、永磁同步电机恒压频比开环控制系统Matlab/Simulink仿真分析2.1.仿真电路分析2.1.1.恒压频比控制算法2.1.2.输出处理2.1.3.主电路2.2.仿真结果分析2.2.1.设定目标转速为1200r/min2.2.1.设定目标转速为变化值三…

消息中间件ActiveMQ入门概述

目录 举一反三 思考 背景 消息中间件的作用 MQ的定义 MQ的特点 MQ的缺点 消息中间件已经成为互联网企业应用系统内部通信的核心手段&#xff0c;是目前企业内主流标配技术&#xff0c; 它具有解耦、异步、削峰、签收、事务、流量控制、最终一致性等一系列高性能架构所需…

并发编程详解: 十三个工具类, 十大设计模式, 从理论基础到案例实战

前言 对于 Java 程序员而言&#xff0c;熟练掌握并发编程是判断其卓越性的重要标准之一。因为并发编程是 Java 语言中最晦涩的知识点&#xff0c;它涉及操作系统&#xff0c;内存&#xff0c;CPU&#xff0c;编程语言等的基本功&#xff0c;并且还测试了程序员的内功。 那么如…

【Android App】人脸识别中借助摄像头和OpenCV实时检测人脸讲解及实战(附源码和演示 超详细)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 一、借助摄像头实时检测人脸 与Android自带的人脸检测器相比&#xff0c;OpenCV具备更强劲的人脸识别功能&#xff0c;它可以通过摄像头实时检测人脸&#xff0c;实时检测的预览空间是JavaCameraView 常用方法说明如下 setCvC…

舵机应该如果选择?讲讲模拟舵机,数字舵机和总线舵机的区别

推荐视频&#xff1a;模拟舵机&#xff0c;数字舵机和总线舵机科普 &#xff1b;舵机从入门到放弃&#xff1b; 很多时候&#xff0c;我们购买舵机就只知道考虑扭矩以及控制方式。对舵机的分类有所耳闻&#xff0c;但是不清楚其中的区别。接下来我将详细说明模拟舵机&#xff0…

【机器学习】基于机器学习的反弹shell命令识别

引言 本文介绍一个基于机器学习识别反弹shell的项目。 在主机安全检测中&#xff0c;一般是采用基于原理的方式识别反弹shell, 通过判断socket通信相关特征&#xff0c;可以准确地识别到主机中的反弹shell。 但是在容器场景下&#xff0c;检测反弹shell 的能力&#xff0c;可能…

[附源码]计算机毕业设计springboot疫情物资管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2022年第十一届认证杯数学中国数学建模国际赛小美赛:C 题 对人类活动进行分类 建模方案及代码实现

2022年第十一届认证杯数学中国数学建模国际赛小美赛&#xff1a;C 题 对人类活动进行分类 建模方案及代码实现 1 题目 人类行为理解的一个重要方面是对日常活动的识别和监控。可穿戴活动识别系统可以在许多关键领域提高生活质量&#xff0c;如门诊监测、居家康复、跌倒检测等。…

[附源码]Python计算机毕业设计Django茂名特产销售商城网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[Java安全]—再探Filter内存马

前言 关于tomcat反序列化注入回显内存马问题中&#xff0c;就是通过filter内存马进行反序列化动态注册的&#xff0c;但filter内存马由于当时学的时候就没有学的很明白&#xff0c;所以打算重新回顾一下。 前置知识 Tomcat 与 Servlet 的关系 Tomcat中有四种类型的Servlet容…

[Python私活案例]24行代码,轻松赚取400元,运用Selenium爬取39万条数据

今天分享一单来自金主爸爸的私单&#xff0c;运用简单的爬虫技巧&#xff0c;可以有效的规避反爬机制&#xff0c;正所谓“你有张良计&#xff0c;我有过云梯”。这个案例也很好的体现了python语音的优势&#xff0c;规避了非常复杂的底层逻辑&#xff0c;所见即所得&#xff0…

你真的看懂扩散模型(diffusion model)了吗?(从DALL·E 2讲起,GAN、VAE、MAE都有)

本文全网原创于CSDN&#xff1a;落难Coder &#xff0c;未经允许&#xff0c;不得转载&#xff01; 扩散模型简单介绍 我们来讲一下什么是扩散模型&#xff0c;如果你不了解一些工作&#xff0c;你可能不清楚它究竟是什么。那么我举两个例子说一下&#xff1a;AI作画&#xff…