项目已完结,欢迎查看链接。


在线链接:

https://yadiChat.orzlinux.cn

github地址:https://github.com/hqingLau/YadiChat

结果图:

文章目录

  • 目录
  • pom.xml
  • 数据库
  • bean
  • Dao
  • application.yml
  • UserDao.xml
  • MD5
  • UserService.java
  • UserController.java
  • interceptor
  • 效果

目录

pom.xml

pom文件加入依赖,需要springboot,mybatis,mysql,数据库连接池druid,测试junit。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.7</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency>
</dependencies>

数据库

新建数据库YadiChat,新建表user存放用户基本信息。包括idid_name(唯一用于指代用户身份的id名,不可重复),nick_name(昵称,随意,可重复),密码(数据库存放MD5加密后的密码,不应存放明文密码)。

为了方便查找,将id_name设置唯一索引,nick_name也设置索引。

# 新建数据库 YadiChat
# 新建表user存放用户基本信息
CREATE TABLE user
(id INT NOT NULL AUTO_INCREMENT,id_name VARCHAR(128) NOT NULL, # 唯一的id名字nick_name VARCHAR(128) NOT NULL, # 昵称password VARCHAR(32) NOT NULL, # md5加密后的密码PRIMARY KEY(id),UNIQUE INDEX id_name(id_name),INDEX nick_name(nick_name)
);

user表如下所示:

mysql> select * from user;
+----+----------+-----------+----------------------------------+
| id | id_name  | nick_name | password                         |
+----+----------+-----------+----------------------------------+
|  1 | orzlinux | hqinglau  | 5b5091dcd75fcbc5b7d29ac59fe6b377 |
+----+----------+-----------+----------------------------------+
1 row in set (0.00 sec)

这样即使泄露了数据库,密码也不会泄露。因为MD5不能逆向计算。

bean

和数据库字段对应,id设置了自增非空,也不看,没必要加入User类。

User.java:

public class User {private  String idName; // 唯一名idprivate String nickName;private String password;// getter setter constructor
}

Dao

数据库中用到了两个函数,一个是根据id_name查找,一个是插入用户。

@Mapper
public interface UserDao {User selectUserByIdname(String idname);int insertUser(User user);
}

application.yml

配置数据库连接参数,static路径,thymeleaf路径,mybatis参数,包括mapper-locations(mapper路径)和type-alises-package(mapper的xml中就不用写全类名了)。

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/YadiChat?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=falseusername: rootpassword: fahkdfhmvc:static-path-pattern: /static/**thymeleaf:prefix: classpath:/templates/suffix: .htmlcache: falsemybatis:type-aliases-package: cn.orzlinux.step1_signup_in.beanmapper-locations: classpath:mapper/*.xml

UserDao.xml

数据库字段和User属性不对应时,可以用sql的as 别名。

<?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="cn.orzlinux.step1_signup_in.dao.UserDao"><select id="selectUserByIdname" resultType="User" parameterType="String">SELECT id_name idName, nick_name nickName,password FROM user WHERE id_name = #{idname}</select><insert id="insertUser" parameterType="User" >insert into user(id_name,nick_name,password) values(#{idName},#{nickName},#{password})</insert>
</mapper>

MD5

public class MD5 {private final static String salt = "hqinglau@is;a^good_man";/*** 生成32位的MD5* @param msg* @return*/public static String getMd5(String msg) {String base = msg+"/"+salt;return DigestUtils.md5DigestAsHex(base.getBytes(StandardCharsets.UTF_8));}
}

UserService.java

selectUserByIdname根据idname从数据库中查找用户,login处理用户在表单中提交的登陆信息,如果查到了就返回用户。匹配需要匹配MD5后的密码。regist处理表单提交的注册请求。

@Service
public class UserService {@AutowiredUserDao userDao;public User selectUserByIdname(String idname) {return userDao.selectUserByIdname(idname);}public User login(User user) {String idname = user.getIdName();String password = user.getPassword();User u1 = userDao.selectUserByIdname(idname);if(u1==null) {return null;}if (u1.getPassword().equals(MD5.getMd5(password))) {return u1;}return null;}public boolean regist(User user) {user.setPassword(MD5.getMd5(user.getPassword()));int x = userDao.insertUser(user);return x>0;}
}

UserController.java

@Controller
public class UserController {@AutowiredUserService userService;// 仅仅返回登录界面@RequestMapping("/signin")public String signin() {return "sign-in";}@RequestMapping("/")public String index() {return "index";}@RequestMapping("/home")public String home() {return "index";}@PostMapping("/login")public String login(Model model, HttpServletRequest request, HttpServletResponse response) {String idname = request.getParameter("idname");String password = request.getParameter("password");User user = userService.login(new User(idname,null,password));if (user==null) {return "redirect:/signin";}// 随便造一个session,放入String sess = MD5.getMd5(idname+"=^8&"+MD5.getMd5(password));request.getSession().setAttribute("userid", sess);model.addAttribute("userid",sess);return "redirect:/home";}// 注册@GetMapping("/signup")public String signup() {return "sign-up";}@PostMapping("/regist")public String regist(Model model, HttpServletRequest request, HttpServletResponse response) {String idname = request.getParameter("idname");String password = request.getParameter("password");String nickname = request.getParameter("nickname");try {boolean ret = userService.regist(new User(idname,nickname,password));if (!ret) {return "redirect:/signup";}// 随便造一个session,放入String sess = idname;request.getSession().setAttribute("userid", sess);return "redirect:/";} catch (Exception e) {return "redirect:/signup";}}@RequestMapping("/somepage")@ResponseBodypublic String somepage(HttpServletRequest request, HttpServletResponse response) {return "private msg";}
}

其中,登陆、注册成功都需要加入用户session。

服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。

这篇文章不错:session的到底是做什么的?

interceptor

SessionConfiguration.java

@Configuration
public class SessionConfiguration implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");}
}

UserInterceptor.java

public class UserInterceptor implements HandlerInterceptor  {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String uri = request.getRequestURI();if("/".equals(uri)||"/error".equals(uri)||"/signin".equals(uri)||"/login".equals(uri)||"/signup".equals(uri)||"/regist".equals(uri)) {return true;}Object o = request.getSession().getAttribute("userid");if(null == o) {response.sendRedirect("/signin");return false;}return true;}
}

如果session存在并且有userid属性,认为是已登陆用户的操作,否则重定向到登陆页面。

效果

首页:

点击somepage,若未登陆会跳转到登陆界面:

若未注册点击右下角注册,进入注册界面:

登陆之后,主页点击somepage,进入:

示例程序链接:https://yadiChat.orzlinux.cn

github地址:https://github.com/hqingLau/YadiChat

本文同步于:orzlinux.cn

Java聊天室yadiChat step1 登陆注册相关推荐

  1. Java聊天室的设计与实现

    Java聊天室系统主要用于实现在线聊天,基本功能包括:服务端和客户端.本系统结构如下: (1)服务端: 1.能够开启和关闭服务器 2.等待着客户端从特殊端口发送的请求 3.监听的端口并不是固定的,服务 ...

  2. Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 )

    Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 文章目录 Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 1.J ...

  3. 多人群聊聊天室java_#java 聊天室(一)—— 实现一个简单Telnet多人群聊聊天室...

    #java    聊天室(一)--  实现一个简单Telnet多人群聊聊天室 学习本文须要先准备的知识点:队列(或数组).类与对象.线程.InputStream和OutputStream的使用.jav ...

  4. Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统 Java即时通讯 Java聊天系统

    Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统  Java即时通讯 Java聊天系统 public Swingtest002() {// 设置标题setTitle("请 ...

  5. java聊天室(实训项目)

    这里是我们实训的一个关于java聊天室的项目,有需要的同学可以看看,私聊功能未完善. 话不多说,直接上代码. 服务器: package ChatRoom;import java.awt.Color; ...

  6. java聊天室论文,JAVA聊天室毕业论文

    JAVA聊天室毕业论文 毕业设毕业设计计 姓 名 学 号 系 部 信息工程系信息工程系 专 业 软件技术软件技术 设计题目 聊天室(聊天室(JavaJava)) 指导教师 职 称 2012 年 07 ...

  7. java 聊天室之 传送图片文字等功能的实现

    前几日写的一篇简陋之极的java聊天室被各位前辈说是,一塌糊涂,乌烟瘴气,只是简单的实现了需要的功能,并未做到人性化.在下痛定思痛,心想还是先学会显示功能再做美化界面,美化代码的打算! 在奋斗了一天之 ...

  8. java 聊天室之 传送图片文字等功能的实现

    前几日写的一篇简陋之极的java聊天室被各位前辈说是,一塌糊涂,乌烟瘴气,只是简单的实现了需要的功能,并未做到人性化.在下痛定思痛,心想还是先学会显示功能再做美化界面,美化代码的打算! 在奋斗了一天之 ...

  9. [java聊天室]多个客户端与服务器说话多线程(二)

    多客户端链接 之前(java聊天室一)只有第一个连接的客户端可以与服务端说话. 原因: 服务端只调用过一次accept方法,因此只有第一个客户端链接时服务端接受了链接并返回了Socket,此时可以与其 ...

  10. 计算机html大作业聊天室,java大作业设计报告-JAVA聊天室.docx

    PAGE \* MERGEFORMAT18 JAVA程序设计 多人聊天室 设计目的 Java 编程语言是个简单.面向对象.分布式.解释性.健壮.安全与系统无关.可移植.高性能.多线程和静态的语言.本次 ...

最新文章

  1. lvs在linux系统下安装,Linux下安装lvs
  2. Vim不常见但是很实用的命令技巧
  3. CV之FR(H+k机器学习):基于每人几张人脸图片训练H+k模型实现(国内外明星)新人脸图像的姓名预测(准确度高达100%)
  4. leetcode 926. Flip String to Monotone Increasing | 926. 将字符串翻转到单调递增(前缀和)
  5. Spark-submit提交任务到集群
  6. SAP CRM service contract和individual object
  7. 使用SAP OData服务创建销售订单
  8. 获取焦点改变输入框背景色
  9. WebHook入门教程:快速实现自动化运维,如自动热部署、自动重启服务、自动备份数据库等等
  10. iosid不足以修改问题_寻找合作伙伴的技巧足以与您合作
  11. AcWing 291. 蒙德里安的梦想(状态压缩DP)
  12. 003 python 注释/数据类型/运算符/输入输出/格式化输出
  13. Spring整合MyBatis之SqlSessionFactory对象的产生
  14. 2017计算机应用基础实践,计算机应用基础试题及答案
  15. F5在铁路12306中的应用
  16. idea2020导入maven工程(解决项目文件没有蓝色方块问题)
  17. FPGA+CUYSB3014实现USB3.0功能
  18. 京东商城ContainerLB实践
  19. 酷炫的数据可视化大屏来了!满足你99%大屏需求
  20. 索骥馆-编程语言之《程序语言的奥妙:算法解读(四色全彩)》扫描版[PDF]

热门文章

  1. hutool工具私人学习笔记
  2. linux下mysql数据库备份与恢复(全量+增量)
  3. hmcl启动器安装游戏版本失败_HMCL 启动器教程 #2 安装游戏版本、模组加载器与高清修复...
  4. 树莓派29/100 - 树莓派接上Kindle的墨水屏是什么体验?
  5. easy chm 绿色免安装版
  6. RUBY发送验证码通知短信(互亿无线)
  7. msfconsole 控制台使用和操作
  8. 轻松搞懂Word2vec / FastText+BiLSTM、TextCNN、CNN+BiLSTM、BiLSTM+Attention实现中英文情感分类
  9. 联想服务器如何恢复预装系统,Thinkcentre E73 E63z等预装Win7系统如何恢复出厂系统...
  10. seo优化基础知识:如何优化博客文章