【SSM】登录和注册

框架

  • controller 控制层

  • dao 持久层

  • interceptor 拦截器

  • model 实体层

  • uils 工具类

  • service 业务层

  • resources 资源文件层

    • mapper 放编写sql语句的文件,与持久层的文件对应

具体代码

@Controller
//控制层
public class UserController {
//用于调用Service层方法@Autowiredprivate IUserService userService;
//注册@RequestMapping(value = "/register",method = RequestMethod.POST)@ResponseBodypublic Result register(@RequestBody User user){return userService.register(user);}
//登录@RequestMapping(value = "/login",method = RequestMethod.POST)@ResponseBodypublic Result login(@RequestBody User user){return userService.login(user);}
//注销@RequestMapping(value = "/logout")@ResponseBodypublic Result logout(@RequestHeader("token") String token){return userService.logout(token);}
//用于展示首页@RequestMapping(value = "/show")@ResponseBodypublic Result show(){return Result.ok("成功","首页");}}
//持久层
//状态码方法
public interface TokenMapper {
//保存到数据库int insert(@Param("token") String token, @Param("userid") int id);
//查看Integer selectByToken(String token);
//删除void deleteByToken(String token);
}
//用户数据库
public interface UserMapper {
//插入数据,也就是注册的int insert(User user);
//通过username查询,用于注册查重User findUserByUsername(String username);
//登录方法User findUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
}
//拦截器
@Controller
public class UserInterceptor implements HandlerInterceptor {
//调用持久层的方法@Autowiredprivate TokenMapper tokenMapper;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取状态码String token = request.getHeader("token");//如果状态码不为空或者空字符串if (token!=null&&token!=""){Integer id = tokenMapper.selectByToken(token);//如果不为空且查到存在状态码返回trueif (id!=null&&id>0){return true;}}//反之就是权限不够String string = JSON.toJSONString(Result.error(500, "权限不够"));response.getWriter().println(string);return false;}
//后置@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}
//最终@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}
public class Result<T> implements Serializable {
//返回状态private static final long serialVersionUID = 1L;/*** 成功标志*/private boolean success = true;/*** 返回处理消息*/private String message = "操作成功!";/*** 状态码*/private Integer code = 0;/*** 返回数据对象 data*/private T result;public static long getSerialVersionUID() {return serialVersionUID;}public boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public T getResult() {return result;}public void setResult(T result) {this.result = result;}public long getTimestamp() {return timestamp;}public void setTimestamp(long timestamp) {this.timestamp = timestamp;}/*** 时间戳*/private long timestamp = System.currentTimeMillis();public Result() {}public Result<T> success(String message) {this.message = message;this.code = 200;this.success = true;return this;}public static Result<Object> ok() {Result<Object> r = new Result<Object>();r.setSuccess(true);r.setCode(200);r.setMessage("成功");return r;}public static Result<Object> ok(String msg) {Result<Object> r = new Result<Object>();r.setSuccess(true);r.setCode(200);r.setMessage(msg);return r;}public static Result<Object> ok(String msg,Object obj) {Result<Object> r = new Result<Object>();r.setSuccess(true);r.setCode(200);r.setMessage(msg);r.setResult(obj);return r;}public static Result<Object> ok(Object data) {Result<Object> r = new Result<Object>();r.setSuccess(true);r.setCode(200);r.setMessage("成功");r.setResult(data);return r;}public static Result<Object> error(String msg) {return error(500, msg);}public static Result<Object> error(int code, String msg) {Result<Object> r = new Result<Object>();r.setCode(code);r.setMessage(msg);r.setSuccess(false);return r;}public Result<T> error500(String message) {this.message = message;this.code = 500;this.success = false;return this;}/*** 无权限访问返回结果*/public static Result<Object> noauth(String msg) {return error(555, msg);}
}
//user实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {/*** 这是id*/private int id;/*** 这是昵称*/private String nickname;/*** 这是用户名*/private String username;/*** 这是密码*/private String password;/*** 这是年龄*/private int age;/*** 这是手机号*/private String phone;
}
//service接口
public interface IUserService {Result register(User user);Result login(User user);Result logout(String token);
}
//实现service接口
@Service
@Transactional
public class UserService implements IUserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate TokenMapper tokenMapper;/*** 注册* */@Overridepublic Result register(User user) {//用户名校验String username = user.getUsername();if (username != null && username != "") {boolean check = RegUtils.check(username, "^(?=[a-zA-Z])(?!.*[\\-_]{2})[a-zA-Z0-9\\-_]{8,12}$");if (!check){return Result.error("用户名格式不正确");}}else {return Result.error("用户名不能为空");}
//        是否被注册过User user1 = userMapper.findUserByUsername(username);if (user1!=null){return Result.error("用户名已存在,请重新输入");}
//        密码校验String password = user.getPassword();if (password != null && password != "") {boolean check = RegUtils.check(password, "^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]).{8,}$");if (!check){return Result.error("密码格式不正确");}}else {return Result.error("密码不能为空");}
//        年龄校验int age = user.getAge();if(age>120||age<18){return Result.error("年龄不符合要求");}//手机号的校验String phone = user.getPhone();if (phone != null && phone != "") {boolean check = RegUtils.check(phone, "^(1[3-9]\\d{9}$)");if (!check){return Result.error("手机号格式不正确");}}else {return Result.error("手机号不能为空");}
//        写入数据库user.setPassword(MD5Utils.encrypt(password));int insert = userMapper.insert(user);return insert > 0 ? Result.ok("注册成功") : Result.error("注册失败");}/*** 登录*/@Overridepublic Result login(User user) {String username = user.getUsername();if (username != null && username != "") {boolean check = RegUtils.check(username, "^(?=[a-zA-Z])(?!.*[\\-_]{2})[a-zA-Z0-9\\-_]{8,12}$");if (!check) {return Result.error("用户名格式不正确");}} else {return Result.error("用户名不能为空");}String password = user.getPassword();if (password != null && password != "") {boolean check = RegUtils.check(password, "^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]).{8,16}$");if (!check) {return Result.error("密码格式不正确");}} else {return Result.error("密码不能为空");}password = MD5Utils.encrypt(password);User user1 = userMapper.findUserByUsernameAndPassword(username, password);if(user1!=null){String uuid = UUID.randomUUID().toString();String token = uuid.replace("-", "");tokenMapper.insert(token, user1.getId());return Result.ok("登录成功", token);}return Result.error("登录失败");}
//注销@Overridepublic Result logout(String token) {if(token!=null && token!=""){tokenMapper.deleteByToken(token);}return Result.ok("注销成功");}
}
//正则表达式
public class RegUtils {public static boolean check(String target,String regex) {// 正则表达式Pattern pattern = Pattern.compile(regex);// 匹配器Matcher matcher = pattern.matcher(target);// 匹配if (matcher.matches()) {return true;}return false;}
}//MD5
public static String encrypt(String password){MessageDigest md = null;String s = null;try {md = MessageDigest.getInstance("MD5");md.update(password.getBytes());s = new BigInteger(1, md.digest()).toString(16);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return s;}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xinzhi.dao.TokenMapper"><insert id="insert">insert into token (token,userid) values (#{token},#{userid})</insert><delete id="deleteByToken">delete from token where token=#{token}</delete><select id="selectByToken" resultType="java.lang.Integer">select id from token where token=#{token}</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.LiMou.dao.UserMapper"><sql id="userAll">id,nickname,username,password,age,phone</sql><insert id="insert">insert into user (nickname,username,password,age,phone) values (#{nickname},#{username},#{password},#{age},#{phone})</insert><select id="findUserByUsername" resultType="com.xinzhi.model.User">select <include refid="userAll"/> from user where username=#{username}</select><select id="findUserByUsernameAndPassword" resultType="com.xinzhi.model.User">select <include refid="userAll"/> from user where username=#{username} and password=#{password}</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--加载properties文件--><context:property-placeholder location="classpath:db.properties"/><!--数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${name}"/><property name="password" value="${password}"/></bean><!--开启bean注解扫描--><context:component-scan base-package="com.LiMou"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!--事务管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--开启注解式事务--><tx:annotation-driven transaction-manager="txManager"/><!--整合mybatis到spring中--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="typeAliasesPackage" value="com.xinzhi.model"/><property name="mapperLocations" value="classpath:mapper/*.xml"/><!--分页插件--><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><props><prop key="helperDialect">mysql</prop><prop key="reasonable">true</prop></props></property></bean></array></property></bean><!--映射扫描--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.LiMou.dao"/></bean></beans>

db.properties//连接数据库的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.xinzhi.controller"/><mvc:annotation-driven ><!-- 消息转换器 --><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes" value="text/plain;charset=UTF-8"/></bean></mvc:message-converters></mvc:annotation-driven><!--    视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/page/"/><property name="suffix" value=".jsp"/></bean><!--    多媒体解析器--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="UTF-8"/><property name="maxUploadSize" value="500000"/></bean><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="/register"/><mvc:exclude-mapping path="/login"/><bean class="com.xinzhi.interceptor.UserInterceptor"/></mvc:interceptor></mvc:interceptors></beans>

//依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xinzhi</groupId><artifactId>conformity1</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>conformity1 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.3</version></dependency><!--mysql环境--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version></dependency><!--spring整合jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!--spring整合mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.3</version></dependency><!--druid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency><!--分页插件坐标--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version></dependency><!--springmvc环境--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version></dependency><!--jackson相关坐标3--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency><!--servlet环境--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><!--junit单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--spring整合junit--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.4</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin></plugins><finalName>conformity1</finalName></build>
</project>

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

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

相关文章

Linux设备驱动之gpio-keys

Linux设备驱动之gpio-keys 前两个章节介绍了Linux字符设备和platform设备的注册&#xff0c;他们都是比较基础的&#xff0c;让大家理解Linux内核的设备驱动是如何注册、使用的。但在工作中&#xff0c;个人认为完全手写一个字符设备驱动的机会比较少&#xff0c;更多的都是基…

你的第1个 Unity 游戏!!!

简介 首先新建一个方块添加重力!!!总结首先 首先,你要先打开 U n i t y Unity Unity

Linux 挂载

挂载需要挂载源和挂载点 虚拟机本身就有的挂源 添加硬件 重启虚拟机 操作程序 sudo fdisk -l //以管理员权限查看电脑硬盘使用情况sudo mkfs.ext4 /dev/sdb //以管理员身份格式化硬盘sudo mkdir guazai //创建挂载文件夹 sudo mount /dev/sdb/guazai //将挂载源接上挂载点 s…

嵌入式C语言知识复习和提高

文章目录 前言基础知识main函数防BUG注释&#xff08;重要&#xff09;关键字标识符命名&#xff08;驼峰命名&#xff09;常量类型变量printf1.输出不同类型数据2.输出不同宽度数据3.不同类型数据长度归类 scanf函数运算符sizeof&#xff08;运算符&#xff0c;优先级2&#x…

欧拉操作系统在线安装mysql8数据库并用navicat premium远程连接

网上太多安装教程&#xff0c;但是没有一个教程能够一站式解决安装问题&#xff0c;而我不一样&#xff0c;我写的每一个博客&#xff0c;都是我自己试验过很多次&#xff0c;能够确保一站式解决&#xff0c;才会发上去&#xff0c;希望能够帮助到大家 第一步&#xff1a;升级…

Java手写背包问题算法应用拓展案例

Java手写背包问题算法应用拓展案例 1. 0-1背包问题 实际案例&#xff1a;购物问题 假设你是一个购物爱好者&#xff0c;你去商场购物&#xff0c;商场里有很多商品&#xff0c;每个商品有自己的重量和价值。你只有一个背包&#xff0c;它的容量是有限的。你希望在购物过程中…

恒合仓库 - 仓库管理系统搭建

仓库管理系统搭建 文章目录 仓库管理系统搭建一、项目介绍1.1 项目描述1.2 技术选型1.3 模块划分 二、搭建前端环境三、搭建后端环境3.1 创建springboot项目 - 划分包层次3.2 导入依赖3.3 启动类配置3.4.配置文件配置 一、项目介绍 1.1 项目描述 项目搭球为满足日益扩大的仓库…

Matlab图像处理-区域描述

一旦一幅图像的目标区域被确定&#xff0c;我们往往用一套描述子来表示其特性。选择区域描述子的动机不单纯为了减少在区域中原始数据的数量&#xff0c;而且也应有利于区别带有不同特性的区域。因此&#xff0c;当目标区域有大小、旋转、平移等方面的变化时&#xff0c;针对这…

2023 亲测好用版VScode配置文件

tasks.json {"tasks": [{"type": "cppbuild","label": "g++",// 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc 和launch中preLaunchTask保持一致// "command": "D:/Users/Downloads/ming…

力扣 -- 394. 字符串解码

解题方法&#xff1a; 参考代码&#xff1a; class Solution{ public:string decodeString(string s){stack<string> sst;stack<int> dst;//防止字符串栈为空的时候再追加字符串到栈顶元素sst.push("");int n s.size();int i 0;while(i<n)//最好不…

高级运维学习(九)块存储、文件系统存储和对象存储的实现

块存储基础 块设备存取数据时&#xff0c;可以一次存取很多。字符设备只能是字符流 [rootceph1 ~]# ll /dev/sda brw-rw---- 1 root disk 8, 0 Dec 12 13:15 /dev/sda # b表示block&#xff0c;块设备[rootceph1 ~]# ll /dev/tty crw-rw-rw- 1 root tty 5, 0 Dec 12 13:31 /d…

工业机器人仿真参考

最近有一些朋友看到我做的关于Unity3d仿真机器人的项目&#xff0c;本次我在平台做以分享&#xff0c;希望的朋友或者有需要在此基础做开发的可以参考下。 开发工具&#xff1a; 下位机&#xff1a;Unity3D 上位机&#xff1a;Visual Studio 机械臂模型&#xff1a;TH6-QKM…

从零开始:使用Python创建GUI驱动的简易国际象棋游戏

第一部分&#xff1a;国际象棋的基础 1. 介绍 国际象棋&#xff0c;一个古老而又充满策略的游戏&#xff0c;历经数世纪的发展&#xff0c;至今仍然广受喜爱。那么&#xff0c;如何使用Python来创建一个简单的国际象棋游戏&#xff0c;并给它加上一个图形界面(GUI)呢? 这篇文…

Python图像处理初探:Pillow库的基础使用

图像处理在许多领域都有广泛的应用&#xff0c;包括计算机视觉&#xff0c;机器学习&#xff0c;人工智能&#xff0c;网页开发等。Pillow库是Python中最流行的图像处理库之一&#xff0c;它是PIL&#xff08;Python Imaging Library&#xff09;的一个分支&#xff0c;提供了丰…

高云FPGA系列教程(7):ARM GPIO外部中断

文章目录 [toc]GPIO中断简介FPGA配置常用函数MCU程序设计工程下载 本文是高云FPGA系列教程的第7篇文章。 本篇文章介绍片上ARM Cortex-M3硬核处理器GPIO外部的使用&#xff0c;演示按键中断方式来控制LED亮灭&#xff0c;基于TangNano 4K开发板。 参考文档&#xff1a;Gowin_E…

Android 下的usb框架及功能点

有关USB android框架的链接 http://blog.sina.com.cn/s/articlelist_1627432177_0_1.html ICS4.0下Framework层的usb框架 Android 下的usb主要工作还是在android的framework层。主要有以下几个文件&#xff1a; 1.1UsbDeviceManager.java/高 主要完成功能切换及状态的更新&a…

L1-027 出租

一、题目再现 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0]8&#xff0c;index[2]3 对应…

消息队列(五):虚拟主机设计

虚拟主机存在的意义 一个虚拟主机类似于 MySQL 的 database&#xff0c;把交换机&#xff0c;队列&#xff0c;绑定&#xff0c;消息....进⾏逻辑上的隔离&#xff0c;⼀个服务器可以有多 个虚拟主机&#xff0c;此处我们项⽬就设计了⼀个虚拟主机&#xff08;VirtualHost&…

一步一步详细介绍如何使用 Mediapipe 创建 Snapchat/Instagram 的过滤器--提供完整的实现源码

介绍 既然 Snapchat 和 Instagram 提供的滤镜可以让你在几秒钟内随心所欲地看起来狂野、异国情调或美丽,为什么还要投资化妆品或时尚服装和眼镜呢? 也许您只想闲逛并变成女巫或圣诞老人,或者也许只是通过在脸上添加滤镜来变成您最喜欢的虚构人物。有数百个这样的过滤器,…

GO-日志分析

GO-日志分析 log包简介 Go提供了logger包来做日志记录。使用方式如下所示 package mainimport ("log""os" )func main() {// 创建一个新的日志文件.默认是stdOutfile, err : os.Create("app.log")if err ! nil {log.Fatal(err)}defer file.Cl…