springboot+mybatis+mysql+redis简单实现用户管理功能——登录及校验

前言:

1:吐槽一下csdn上的环境,可以说用脏乱差来形容也是不为过了,除了大佬们以及一些良心博主写得真的很好,大部分就是断章取义的转载或者含糊不清的描述以及各种错误,杀人诛心的是不把源码给全,实在是让人头大。甚至我之前写过的一篇原创都被人家抄去收费栏目了。不过转念一想,如果初心是用这个来记录学习历程,就不想较真了,毕竟在入门的时候,csdn真的帮了我很多。说真的,我希望知识是无界的,所以我坚持我的原则,分享、开源、互相学习。环境更好的还是首推博客园。

2:这里只实现了简单的用户登录校验,至于其他功能,参考我的上一篇博文(67条消息) Spring boot 整合mybatis 对数据库进行增删改查操作——test类测试+实体类测试_爱吃卷心菜的搞笑男的博客-CSDN博客

 直接应用过来就好了。当然,实现的是一些基本功能,也不太成熟,仅仅用于记录我的入门历程并进行巩固。


本篇曾困扰我的知识点主要有:

Map<>类型的应用、Data数据类型格式的转化、端口访问的传参和后台接收、将数据存入redis、redis响应连接等、java的书写格式——驼峰

仍然存在的问题:

数据库的重复查询问题、端口返回数据格式和成功响应案例有出入的问题。


正文:

1:目录结构(和我的上篇文章基本一样,当然,和实际项目的出入还是很大的)


 

2:user层

package com.example.usermanager.user;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

public class Info implements Serializable
{
    private Integer userId;
    private String userName;
    private String userPasswd;
    private String userSex;
    private Integer userAge;
    private String userAddress;
    private String token;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date applyTime;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8",locale="zh")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date fixTime;

    public void setuserId(Integer userId)
    {
        this.userId=userId;
    }
    public Integer getuserId()
    {
        return this.userId;
    }

    public void setuserName(String userName)
    {
        this.userName=userName;
    }
    public String getuserName()
    {
        return this.userName;
    }
    public void setuserPasswd(String userPasswd)
    {
        this.userPasswd=userPasswd;
    }
    public String getuserPasswd()
    {
        return this.userPasswd;
    }

    public void setuserSex(String userSex)
    {
        this.userSex=userSex;
    }
    public String getUserSex()
    {
        return this.userSex;
    }

    public void setuserAge(Integer userAge)
    {
        this.userAge=userAge;
    }
    public Integer get()
    {
        return this.userAge;
    }
    public void setapplyTime(Date applyTime)
    {
        this.applyTime=applyTime;
    }
    public Date getapplyTime()
    {
        return this.applyTime;
    }

    public void setfixTime(Date fixTime)
    {
        this.fixTime=fixTime;
    }
    public Date getfixTime()
    {
        return this.fixTime;

    }
    public void setuserAddress(String userAddress)
    {
        this.userAddress=userAddress;
    }
    public String getuserAddress()
    {
        return this.userAddress;
    }
    public void settoken(String token)
    {
        this.token=token;
    }
    public String gettoken()
    {
        return this.token;
    }

}

package com.example.usermanager.user;

import java.util.Date;

public class loginjudge //用于端口显示的提示性信息
{
    private String msg;
    private Integer code;
    public void setcode(Integer code)
    {
        this.code=code;
    }
    public Integer getcode()
    {
        return this.code;
    }
    public void setmsg(String msg)
    {
        this.msg=msg;
    }
    public String getmsg()
    {
        return this.msg;
    }

}

1:在做完这个功能后我突然发现我之前的理解是有问题的,以为实体类里面的属性一定要完完全全的对应到数据库中的字段,当其实不然,他们之间没有必然的内在联系,甚至可以说是独立的,只是习惯里把这些趋于统一化;

2:其次在这里我遇到了一个问题,就是关于java的书写格式规范,只能说以前没有养成良好的习惯,接触的东西也太低级了,没在意,在这个地方卡了好久才就突然警醒了我,一定要规范,尤其是后面涉及到的.xml配置数据库语句,更是如此。


3:dao层

package com.example.usermanager.Dao;

import com.example.usermanager.user.Info;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;


@Mapper
public interface UserDao {
    public List<Info> findAllUser();
    public Info login(@Param("userName") String userName, @Param("userPasswd") String userPasswd);
}

4:resource下mappers的.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.example.usermanager.Dao.UserDao">
    <select id="findAllUser" resultType="Info">
        select * from info
    </select>
    <select id="login" resultType="Info">
        select userId, userName, userAddress, userAge, userSex, applyTime, fixTime from info
        <where>
            <if test="userName!=null and userName!=''">
                  and userName=#{userName}
            </if>
            <if test="userPasswd!=null and userPasswd!=''">
                and userPasswd=#{userPasswd}
            </if>
        </where>
    </select>
</mapper>

1:这两个部分联系极为紧密,根据我的个人习惯喜欢当作一个部分来处理

2:.xml文件特别要注意namespace后的地址和每个语句后面的返回类型,不然特别容易报错,一定要细心


5:service层

package com.example.usermanager.service;

import com.example.usermanager.user.Info;

import java.util.List;
import java.util.Map;

public interface UserService {
    public List<Info> getUsers();
    public Info LoginJudge(Info info);


}

package com.example.usermanager.service.impl;

import com.example.usermanager.Dao.UserDao;
import com.example.usermanager.service.UserService;
import com.example.usermanager.user.Info;
import io.lettuce.core.RedisClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;


import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService
{
    @Autowired
    private UserDao userDao;
    @Override
    public List<Info> getUsers()
    {// TODO Auto-generated method stub
        return userDao.findAllUser();
    }
    @Override
    public Info LoginJudge(Info info)
    {
       return userDao.login(info.getuserName(),info.getuserPasswd());
    }




}


6:controller层

package com.example.usermanager.controller;

import com.example.usermanager.service.UserService;
import com.example.usermanager.user.Info;
import com.example.usermanager.user.loginjudge;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;


import javax.servlet.http.HttpServletRequest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException;


@RestController
@RequestMapping("/info")
@ResponseBody
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;



    @RequestMapping("/judge")
    @ResponseBody
    public Map<String, Object> LoginJudge(HttpServletRequest request) {
        String userName = request.getParameter("userName");
        String userPasswd = request.getParameter("userPasswd");
        String token = request.getHeader("token");
        Map<String, Object> map = new HashMap<>();
        loginjudge user = new loginjudge();
        Info info = new Info();
        try {
            //连接数据库的驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "mima");
            PreparedStatement ps = conn.prepareStatement("select * from info where username=?");
            ps.setString(1, userName);
            ResultSet rs = ps.executeQuery();
            //查询的用户下面没有内容,返回用户不存在
            if (!rs.next()) {
                user.setmsg("登陆失败,用户不存在");
                user.setcode(404);
                map.put("code", user.getcode());
                map.put("msg", user.getmsg());
                map.put("data", null);
                throw new TimeoutException("登陆失败,用户不存在");
            }

            else if (!(rs.getString("userPasswd")).equals(userPasswd)) {
                user.setmsg("登陆失败,密码错误");
                user.setcode(404);
                map.put("code", user.getcode());
                map.put("msg", user.getmsg());
                map.put("data", null);
                throw new TimeoutException("登陆失败,密码错误");
            }
            else {
                user.setmsg("登录成功");
                user.setcode(1314);
                map.put("code", user.getcode());
                map.put("msg", user.getmsg());

                info.settoken(token);
                info.setapplyTime(rs.getDate("applyTime"));
                info.setfixTime(rs.getDate("fixTime"));
                info.setuserId(rs.getInt("userId"));
                info.setuserAddress(rs.getString("userAddress"));
                info.setuserSex(rs.getString("userSex"));
                info.setuserPasswd(rs.getString("userPasswd"));
                info.setuserName(rs.getString("userName"));
                map.put("data", info);

                //redis
                redisTemplate.opsForHash().putAll("data", map);
                System.out.println("存入redis成功");
            }
            conn.close();
            ps.close();
            rs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
}



1:可能有人在存redis的时候会遇到报null的异常,这个时候一下上面的属性有没有缺少注解,应为多个属性不能公用一个注解,其他的也是同理;

2:其次是有一个拒绝连接的异常,这个时候基本就是你没有把本地的redis启动,去上网抗议下如何启动redis就ok;

3:可能有人发现了我在这个里面又连接了一次数据库,这里就是我之说的问题,重复连接了,我在配置文件已经连接过了,可是在这里又连接了一次,有冗余的嫌疑,暂时还没有想到如何解决,有知道的朋友可以评论里告知一下。


 7:.properties配置文件

server.port= 8080

spring.datasource.url= jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=jytyyds123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.type-aliases-package=com.example.usermanager.user
mybatis.mapper-locations= classpath:mappers/*.xml
mybatis.configuration.call-setters-on-nulls=true
mybatis.configuration.map-underscore-to-camel-case=true

spring.redis.host=127.0.0.1
spring.redis.port=6379

这里没什么好说的,注意地址就行,其次是redis有密码一定要写,没有密码就不要写了


 8:结果:

token是再header里面传

再看一下成功响应案例:

对比之下发现token其实是不太对劲的,应为我是把token存入了Info 对象中作为属性来写的,但是我看到好多都不是这样的,这个点我不太会,有会的朋友还请评论里交流一下。

本篇就到这里了,我会基于现有的基础和问题继续进行学习和摸索,特别感谢一直指导我实习的同事。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目描述 说明: spring security 全注解式的权限管理 动态配置权限,角色和资源,权限控制到按钮粒度 采用token进行权限校验,禁用session,未登录返回401,权限不足返回403 采用redis存储token及权限信息 内置功能用户管理用户查询、添加用户、修改用户、给用户分配角色 菜单管理:菜单列表、添加菜单、修改菜单、删除菜单、权限配置、菜单图标设置、菜单排序 角色管理:角色查询、添加角色、修改角色、删除角色 代码生成:根据表名生成bean、controller、dao、Mapper.xml、列表页、搜索、分页、新增页、修改页 job集群:创建job、取消job、查询job、下拉搜索spring bean 数据源监控:druid 接口swagger文档 日志查询 邮件管理:发送邮件、搜索邮件 文件管理:上传文件、文件列表、文件删除 公告管理:公告未读提醒、发布公告、查询公告、公告阅读人列表 excel下载:自定义sql导出excel、也可在页面展示sql结果数据 字典管理:一些常量字典的维护 个人信息修改 修改密码 头像修改 其他说明: 日志模块 sl4j日志分包:将sql日志、业务日志、异常日志进行了分离,更方便定位问题 日志表:使用aop拦截实现 权限控制:基于token方式,禁用session 对各种不同异常进行了全局统一处理 使用lombok简化java代码,让源码更简洁,可读性高 mybatis未进行二次封装,原滋原味,简单sql采用注解,复杂sql采用Mapper.xml配置 使用了layui的弹出层、菜单、文件上传、富文本编辑、日历、选项卡、数据表格等 表单数据采用bootstrapValidator校验简单快捷方便 运行环境 jdk8+mysql+redis+IntelliJ IDEA+maven 项目技术(必填) Springboot+Mybatis+ SpringMvc+springsecrity+Redis+bootstrap+jquery 数据库文件 压缩包内 jar包文件 maven搭建
在开发基于SpringBootMyBatisRedis、Elasticsearch和MySQL的交友项目时,以下是一些保证系统安全性、防止恶意攻击和非法访问、保护用户隐私数据的建议: 1. 用户认证和授权:使用Spring Security框架来实现用户认证和授权功能,只有经过认证和授权的用户才能访问系统的敏感数据和接口。 2. 密码加密:对用户密码进行加密处理,使用强密码策略,避免密码被盗用。可以使用Spring Security提供的加密模块或者其他加密库来实现。 3. 防止SQL注入攻击:使用MyBatis的预编译功能,避免用户输入的数据直接拼接在SQL语句中,从而防止SQL注入攻击。 4. 防止XSS攻击:对用户输入的数据进行过滤和转义,避免恶意脚本注入到页面中,从而防止XSS攻击。 5. 防止CSRF攻击:使用Spring Security提供的CSRF防护功能,对用户提交的表单和请求进行校验和验证,避免伪造请求攻击。 6. 数据加密:对敏感数据进行加密处理,如用户的个人资料、聊天记录等,避免数据泄露和被窃取。 7. 访问控制:对系统的接口和数据进行访问控制,只允许授权的用户和角色访问,避免非法访问和数据泄露。 8. 安全审计:记录用户的操作和访问记录,及时发现和处理异常操作和攻击行为。 以上是一些常用的保证系统安全性、防止恶意攻击和非法访问、保护用户隐私数据的建议,实际开发中还需要根据具体情况进行细化和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值