当前位置: 首页 > news >正文

JAVA WEB学习19

企业级必备的优化点:BCrypt 密码加密(替代 MD5)、Token 刷新机制、前端整合 JWT 请求,同时完善全局异常处理,让整个登录体系更安全、更符合生产环境标准。
一、优化 1:BCrypt 密码加密(安全级别更高)
MD5 是不可逆加密,但存在彩虹表破解风险;BCrypt 是自适应哈希函数,自带盐值(随机数),加密后无法逆向破解,是企业主流的密码加密方式。

  1. 新增 BCrypt 工具类(简化加密 / 校验)
    创建com.example.utils.BCryptUtil.java:
    java
    运行
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**

  • BCrypt密码加密工具类
    */
    public class BCryptUtil {
    private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

    /**

    • 加密密码
      */
      public static String encrypt(String password) {
      return encoder.encode(password);
      }

    /**

    • 校验密码(原密码 + 加密后的密码)
      */
      public static boolean check(String rawPassword, String encodedPassword) {
      return encoder.matches(rawPassword, encodedPassword);
      }
      }
  1. 新增用户注册接口(初始化加密密码)
    (1)注册参数封装(RegisterDTO.java)
    java
    运行
    import lombok.Data;

/**

  • 注册请求参数
    */
    @Data
    public class RegisterDTO {
    private String username;
    private String password;
    private String nickname;
    }
    (2)扩展 UserMapper(新增注册方法)
    java
    运行
    import com.example.entity.User;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper {
@Select("select * from user")
List findAll();

@Select("select * from user where username = #{username}")
User findByUsername(String username);// 新增用户(注册)
@Insert("insert into user (username, password, nickname) values (#{username}, #{password}, #{nickname})")
int insert(User user);

}
(3)扩展 UserService(新增注册方法)
java
运行
import com.example.dto.LoginDTO;
import com.example.dto.RegisterDTO;
import com.example.entity.User;

import java.util.List;

public interface UserService {
List findAll();

String login(LoginDTO loginDTO);// 注册方法
void register(RegisterDTO registerDTO);

}
(4)实现注册业务(UserServiceImpl.java)
java
运行
import com.example.dto.LoginDTO;
import com.example.dto.RegisterDTO;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import com.example.utils.BCryptUtil;
import com.example.utils.JwtUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Resource
private JwtUtil jwtUtil;

@Override
public List<User> findAll() {return userMapper.findAll();
}@Override
public String login(LoginDTO loginDTO) {// 1. 查询用户User user = userMapper.findByUsername(loginDTO.getUsername());if (user == null) {throw new RuntimeException("用户名不存在");}// 2. 改用BCrypt校验密码(替换之前的MD5)if (!BCryptUtil.check(loginDTO.getPassword(), user.getPassword())) {throw new RuntimeException("密码错误");}// 3. 生成tokenreturn jwtUtil.generateToken(user.getUsername());
}@Override
public void register(RegisterDTO registerDTO) {// 1. 校验用户名是否已存在User existUser = userMapper.findByUsername(registerDTO.getUsername());if (existUser != null) {throw new RuntimeException("用户名已存在");}// 2. 密码加密String encodedPwd = BCryptUtil.encrypt(registerDTO.getPassword());// 3. 插入数据库User user = new User();user.setUsername(registerDTO.getUsername());user.setPassword(encodedPwd); // 存储加密后的密码user.setNickname(registerDTO.getNickname());userMapper.insert(user);
}

}
(5)新增注册接口(UserController.java)
java
运行
import com.example.common.Result;
import com.example.dto.LoginDTO;
import com.example.dto.RegisterDTO;
import com.example.entity.User;
import com.example.service.UserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;

@GetMapping("/list")
public Result<List<User>> list() {return Result.success(userService.findAll());
}@PostMapping("/login")
public Result<Map<String, String>> login(@RequestBody LoginDTO loginDTO) {String token = userService.login(loginDTO);Map<String, String> resultMap = new HashMap<>();resultMap.put("token", token);return Result.success(resultMap);
}// 注册接口
@PostMapping("/register")
public Result<Void> register(@RequestBody RegisterDTO registerDTO) {userService.register(registerDTO);return Result.success(null);
}

}
3. 测试注册接口
请求地址:POST http://localhost:8080/user/register
请求体:
json
{
"username": "test",
"password": "123456",
"nickname": "测试用户"
}
数据库中password字段会存储类似$2a$10$xxxx的加密字符串,而非明文。

http://www.jsqmd.com/news/424147/

相关文章:

  • 嵌入模型与Chroma向量数据库 - Chroma 集合查询操作 - AI大模型应用开发必备知识
  • 大家觉得windows系统的更新有必要每次都更新吗?会不会系统越高,越卡顿?
  • 通信工程毕业设计最新方向怎么选
  • 2026年杰家板材厂靠谱吗,探讨其行业认可度、环保性与交货及时性 - myqiye
  • 父系指数和母系指数
  • 探寻2026年粉末压机优质源头,这些厂家不容错过,伺服热压机/平板油压机/伺服油压机/粉末压机,粉末压机厂家哪家好 - 品牌推荐师
  • LangGraph4j 学习系列(2)-条件工作流
  • 2026年选购指南:主流摩擦系数仪厂家综合对比,摩擦系数仪/检测仪/试验机/分析仪/测试仪/测量仪,摩擦系数仪工厂选哪家 - 品牌推荐师
  • 聊聊江西初中毕业选院校的经验,江西新华电脑学院口碑怎么样? - 工业品牌热点
  • 2026年市面上优秀的自立袋销售厂家推荐,中封袋/四边封包装袋/八边封包装袋/三边封包装袋,自立袋生产商排行榜 - 品牌推荐师
  • 三菱FX5U伺服机器人程序开发指南
  • 2026年市场口碑佳的ISO认证公司TOP榜,助力企业品质提升,知识产权认证/3C认证,ISO认证公司哪家好 - 品牌推荐师
  • 分析江苏数控折弯机质量可靠的厂家排名,有哪些上榜? - 工业推荐榜
  • 论云原生架构在高并发系统中的设计与实践
  • 2026年全国上诉律师服务费用大汇总,专业上诉律师哪家权威怎么选 - 工业品网
  • YOLOv13涨点改进| CVPR 2026 |独家创新首发、特征融合改进篇 | 引入 LFSB 差分双维注意融合模块,通过交替特征融合与分离策略,能够精准区分目标特征,顶会助力YOLOv13有效涨点
  • free AI Music Generator All In One
  • 国产化编辑器怎样兼容Word复杂格式导入?
  • 讲讲泰艺包装有实力吗,在深圳地区口碑怎么样 - 工业品牌热点
  • CO-STAR提示词模板深度解析:从冠军框架到实战应用
  • 2026年广州热门除甲醛产品年度排名靠谱的品牌口碑佳 - mypinpai
  • 日本数学教育家“dy/dx不是分数”谬论使学生不能正确认识导数概念
  • 别再瞎找了!降AIGC软件 千笔·降AIGC助手 VS 学术猹,本科生专属神器!
  • Rust开发必备:深入解析标准库与第三方Derive宏的核心差异与应用实践
  • 农业系统如何集成Word文档样式解析组件?
  • 2026年水泵选购指南:热门型号与性能排名解析,酸碱中和实验室污水设备/大通量滤芯,水泵生产商排名 - 品牌推荐师
  • 导师推荐 9个降AI率软件降AIGC网站:本科生降AI率必备工具深度测评
  • 国防项目富文本工具支持Word截图粘贴吗?
  • 赶deadline必备! 10个AI论文工具测评:专科生毕业论文写作神器推荐
  • 学校官网编辑器需要哪些Word格式保留功能?