Java小白成长记(创作笔记二)

目录

序言

思维导图

用户登录/注册

数据表

实体层

持久层

服务层

认证与授权

                  整合springsecurity

controller注册测试

controller登录测试

跨域解决

        方法

Java小白成长记(创作笔记一)

Java小白成长记(创作笔记二)


序言

        在一个充满阳光的早晨,一位对编程世界充满好奇的年轻人小小白,怀揣着梦想与激情,踏上了学习Java编程的征程。他/她深知,在这个信息化时代,编程技能的重要性不言而喻。然而,作为一个编程小白,他面临着无数未知与挑战。在这篇成长记中,我们将紧紧跟随小小白的脚步,见证他/她从Java小白成长为大佬的蜕变历程。接下来,让我们出发吧 ····👻👻

思维导图

        首页,要开发一个Java项目,我们要事先搭建思维导图,这样我们可以更好地梳理出项目的结构,前期可以做到一目了然,分步骤去写好每一块内容,避免出现这块写一点,又跳到那块再写,反复横跳·····后期完成也可以进行更好地优化和迭代。简而言之,高效 高效 高效

这是此篇博客的思维导图,内容主要针对后端

讲解了此次项目的学习重点、项目功能、技术栈以及开发流程,接下来就让我们跟随小小白的视角进入开发流程的探索吧!

用户登录/注册

        首先小小白在这里给大家推荐两个懒人的插件! 作为Java开发者,尤其是做业务开发的,免不了要写一大堆接口,也就是我们所说的 Controller API。身为一名合格的后端开发人员,我们不能直接把写完的接口抛给前端用(当然也可以💥💥)

言归正传,我们平时做接口测试的时候可能用的是Postman,但是为了不用来回切换跳转,我们可以用IDEA内置的插件:HTTP Client,在插件市场搜索 HTTP Client 安装即可,这还是 JetBrains 官方出品的

安装完成后,我们在Controller 中带有 @RequestMapping、@GetMapping@PostMapping注解的HTTP接口前都会多一个小图标,类似这样

当我们点击的时候,选中第二个就会自动跳转

当跳转进来的时候,我们可以直接在给我们写的请求改,也可以通过上面的 + 发送各种不同的请求,这样就不用切换到Postman,提供了一点点迅捷🤪🤪

当我们发送Post请求的时候,如果参数太多,那么POJO to JSON就是帮助我们简化的,我们直接进行安装重启就行

然后直接在实体类中右键选中,直接Copy就不用自己手写参数多的地方

当然少的也可以直接Copy👻👻

数据表

    首先基于登录/注册,我们先搭建一个数据库(mysql)表,用来存储账号和密码,由于在Java小白成长记(创作笔记一)当中已经简单介绍数据库的配置,这里就不进行说明了,可以点击目录(一)进行查看🫡🫡🫡(下面链接也行)。接下来直接进行操作:先点击右边仓库

Java小白成长记(创作笔记一)-CSDN博客

之后会出现一个写mysql语句的界面,可以将下面的代码复制运行

代码展示: use 自己数据库名;

# 选择数据库
use aurora;

# 登录/注册表
create table user(
    id bigint(20) not null auto_increment,
    username varchar(64) not null,
    password varchar(64) not null,
    primary key(id),
    unique key uk_username(username)
)engine=innodb default charset=utf8mb4;

       温馨提示:先"cmd"连接自己的数据库,可以看成长记(一)

实体层

   在最外层包上右键New新建package,包名为entity 

 在新建的entity包上右键new一个Java Class类,类名为User(选Class)

这是User类代码:@Data是getter setter方法的注解,加了就不用再写getter/setter  ; @TableName("user")是数据库表名 ;@TableId()是主键id自增长策略

package com.aurora.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * @author aurora
 * 注册/登录
 */
@Data
@TableName("user")
public class User {

    @TableId(type = IdType.AUTO)
    private Long id;
    private String username;
    private String password;
}
持久层

在最外层包上右键New新建package,包名为mapper,同上面类似(因为使用的MybatisPlus,所有不用再写xml文件)。然后在新建的mapper包上右键new一个Java Class类,接口名为UserMapper(注意选择Interface,这里是接口)

代码展示:继承一中集成了MybatisPlus方法 <实体类名>

package com.aurora.mapper;

import com.aurora.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

// 继承MybatisPlus的BaseMapper方法
public interface UserMapper extends BaseMapper<User>{
}
服务层

在最外层包上右键New新建package,包名为service,同上面类似。然后在新建的service包上右键new一个Java Class类,接口名为UserService(注意选择Interface,这里是以接口+继承方式实现的。目的:类很多时可以快速根据接口和接口实现类找出实现)

接口代码:

package com.aurora.service;

import com.aurora.common.Result;      //Result是(一)中的封装响应类
import com.aurora.entity.User;

public interface UserService {
    //注册
    Result register(User user); 
    //注册   
    Result login(String username,String password);   
}

然后在service包右键创建一个package包impl(接口实现类包),再在impl右键创建一个实现类(当然也可以在service包下直接写类,但是如果类很多的话建议以接口+接口实现类的方式实现)

实现类代码:提示(PasswordEncoder在下面,密码加密用的)

可以直接进行复制,改下"aurora"包名就行,也可以直接敲一遍,加深印象。自己敲的话在实现类中创建好类后会出爆出一根红线,直接继承接口的方法就行

package com.aurora.service.impl;

import com.aurora.common.Result;
import com.aurora.entity.User;
import com.aurora.exception.AppException;
import com.aurora.exception.AppExceptionCodeMsg;
import com.aurora.mapper.UserMapper;
import com.aurora.service.UserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

/**
 * @author : aurora
 *注册/登录验证
 */
@Service
public class UserServiceImpl implements UserService {


    @Autowired
    private UserMapper userMapper;
    //注入springsecurity的密码加密
    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public Result register(User user) {
        //检查用户是否存在   QueryWrapper(mybatisplus的一个方法)
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",user.getUsername());
        User existUser = userMapper.selectOne(queryWrapper);
        if(existUser != null){
            throw new AppException(AppExceptionCodeMsg.USERNAME_EXIST);
        }

        //加密密码
        String encodePassword = passwordEncoder.encode(user.getPassword());
        user.setPassword(encodePassword);

        //保存用户
        userMapper.insert(user);
        return Result.success("注册成功",user);
    }

    @Override
    public Result login(String username, String password) {
        //查询用户
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",username);
        User user = userMapper.selectOne(queryWrapper);

        //校验用户和密码
        if(user == null || !passwordEncoder.matches(password,user.getPassword())){
            throw new AppException(AppExceptionCodeMsg.INVALID_CODE);
        }

        return Result.success("登录成功",user);
    }
}

PasswordEncoder类: springsecurity进行密码加密

这里的PasswordEncoder应该会报错,因为这还没添加依赖,可以先在这里将springsecurity的pom依赖先添加进去,就不会报错了

<!-- Spring Security依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
package com.aurora.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig{

    // 密码加密
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

认证与授权

     整合springsecurity

先添加pom依赖(上面添加了这里就不用添加)

<!-- Spring Security依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

当我们添加这段依赖后再访问一个接口,比如在controller中:然后启动springboot项目,再在浏览器输入http://localhost:8081/test  (8081是设置的端口号) ,然后会让你输入账号和密码,比如下面

package com.aurora.controller;

import com.aurora.common.Result;
import com.aurora.exception.AppException;
import com.aurora.exception.AppExceptionCodeMsg;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;

@RestController
public class TestController {

    @GetMapping("/test")
    public Result<String> test_01(String name){
        if("ok".equals(name)){
            return Result.success("Thanks OK!");
        }
        if("error".equals(name)){
            throw new AppException(AppExceptionCodeMsg.USERNAME_NOT_EXIST);
        }
        if("1111".equals(name)){
            throw new AppException(AppExceptionCodeMsg.INVALID_CODE);
        }

        return Result.success("default");
    }

}

会弹出一个登录框,让输入账号和密码,账号是user,密码是控制台生成的,去复制填进去就可以访问到了,由于我们用了springsecurity,避免每次密码改变,直接在application.yml中配置一下账号和密码

application.yml

# 端口
server:
  port: 8081
# DataSource Config
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/aurora?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: # 自己的密码
  security:
    user:
      name: user              # 因为我们用了密码加密,所有得填加密后的
      password: $2a$10$F.WE3i3YXvXPLjZZJzq.CeACu26RP4WT5/ColdAfBKrZop4Ch9JF6   #加密后的111111
# 日志
logging:
  level:
    root: info
    com.aurora: debug
# MybatisPlus
mybatis-plus:
  mapper-locations: classpath*:/mapper/**Mapper.xml

现在应该就可以访问到了。

配置springsecurity白名单

    白名单就是不需要进行接口验证,直接就可以发送请求到我们的controller接口当中

package com.aurora.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig{

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                // 配置白名单   /public/路径下的不需要验证
                .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/public/**").permitAll()
                .anyRequest().authenticated() // 其他所有请求都需要认证
                )
        // 禁用CSRF保护
            .csrf(AbstractHttpConfigurer::disable);
        return http.build();
    }
}

现在我们再在之前的controller中添加一个/public/。@GetMapping("/public/test"),就不用在进行验证了,可以直接访问到,当我们注册/登录时,就可以直接发送请求到controller接口

如果需要访问之前的参数用"?"比如:http://localhost:8081/public/test?name=1111,可以返回不同的结果

controller注册测试

        我们用上面的HTTP Client插件简单进行测试一下,代码:

package com.aurora.controller;

import com.aurora.common.Result;
import com.aurora.entity.User;
import com.aurora.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AuthController {

    @Autowired
    private UserService userService;

    @PostMapping("/public/register")
    public Result register(@RequestBody User user){   //@RequestBody 接收的实体类中数据
        return userService.register(user);
    }

    @PostMapping("/public/login")                    //@RequestParam 接收两个参数
    public Result login(@RequestParam String username, @RequestParam String password){
        return userService.login(username,password);
    }
}

测试注册:直接点击Post请求上的图标  然后输入json数据

检查数据库是否有信息添加:也可以在命令行看或者数据库工具

可以看到我们刚才注册的数据已经被添加到数据库了

controller登录测试

测试登录:点击 + 再点击框中的

再输入: 直接再上面改端口和URL就是了,不用重新输一遍

到这里,登录/注册功能就已经简单实现了

跨域解决

        方法

      解决跨域方式有好几种,这里就只给大家展示以配置方式进行解决跨域问题。下面这个链接中有五种解决跨域的方式,可以看了代码再仔细观摩学习一下😶‍🌫️😶‍🌫️

链接:SpringBoot解决跨域的5种方式_springboot跨域-CSDN博客

配置解决跨域代码:

package com.aurora.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// 跨域配置
@Configuration
public class CoreConfig implements WebMvcConfigurer {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addExposedHeader("Authorization");
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedHeaders("Content-Type","X-Requested-With","accept,Origin","Access-Control-Request-Method","Access-Control-Request-Headers","token")
                .allowedMethods("GET","POST","DELETE","PUT")
                .maxAge(3600);
    }
}

温馨提示:大家这个就不用跟着敲了,直接把类名写成一样的复制下面的就行,最后再import,网上有的就直接Ctrl + C   👻👻     


到这里,Java小白成长记(创作笔记二)就结束了,主要给大家讲解了用户登录/注册,认证授权,以及跨域问题.....让我们和小小白一起坚持学习吧🙆🙆‍♂️

Java小白成长记(创作笔记一)

Java小白成长记(创作笔记一)-CSDN博客


Java小白成长记(创作笔记二)

Java小白成长记(创作笔记二)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

案例研究|阿特斯的JumpServer分布式部署和多组织管理实践

苏州阿特斯阳光电力科技有限公司&#xff08;以下简称为阿特斯&#xff09;是一家集太阳能光伏组件制造和为全球客户提供太阳能应用产品研发、设计、制造、销售的专业公司。 阿特斯集团总部位于加拿大&#xff0c;中国区总部位于江苏省苏州市。通过全球战略和多元化的市场布局…

20241123-四元数高阶奇异值分解-(1)

四元数高阶奇异值分解及其在彩色图像处理中的应用-(1) &#x1f4d4; 声明 &#x1f1e8;&#x1f1f3; : 1️⃣ &#x1f4c3; 原文网址链接: 四元数高阶奇异值分解及其在彩色图像处理中的应用 - ScienceDirect &#x1f517; Quaternion … image processing (arxiv.org) ​ …

游戏引擎学习第20天

视频参考:https://www.bilibili.com/video/BV1VkBCYmExt 解释 off-by-one 错误 从演讲者的视角&#xff1a;对代码问题的剖析与修复过程 问题的起因 演讲者提到&#xff0c;他可能无意中在代码中造成了一个错误&#xff0c;这与“调试时间标记索引”有关。他发现了一个逻辑问题…

python开发之Linux

文章目录 1. 基础2. 进阶链接压缩/解压缩 文件权限用户远程操作编辑文件软件安装 1. 基础 # 查看当前目录下文件 ls# 查看当前目录 pwd# 清除界面内容 clear# 切换目录 cd# 创建目录 mkdir# 创建文件 touch 文件 vi 文件# 强制删除 rm -rf # 复制文件 cp 复制文件 复制文件路径…

Docker2:docker快速入门(部署MySQL)

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

oracle的静态注册和动态注册

oracle的静态注册和动态注册 静态注册&#xff1a; 静态注册 : 指将实例的相关信息手动告知 listener 侦 听 器 &#xff0c; 可以使用netmgr,netca,oem 以及直接 vi listener.ora 文件来实现静态注册&#xff0c;在动态注册不稳定时使用&#xff0c;特点是&#xff1a;稳定&…

杰发科技AC7840——EEP中RAM的配置

sample和手册中示例代码的sram区地址定义不一样 这个在RAM中使用没有限制&#xff0c;根据这个表格留下足够空间即可 比如需要4096字节的eep空间&#xff0c;可以把RAM的地址改成E000&#xff0c;即E000-EFFF&#xff0c;共4096bytes即可。

洛谷 P1616 疯狂的采药 C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/P1616?contestId215526 完全背包问题&#xff0c;最后一个超出空间了。完全背包和就是无限次的拿&#xff0c;公式跟01背包差不多。 但是&#xff0c;只有当前能拿和拿不下&#xff0c;换下一个。注意要处理好边界条件。…

分布式 Data Warebase - 构筑 AI 时代数据基石

导读&#xff1a;作者以人类世界一个信息层次模型 DIKW 为出发点&#xff0c;引出对计算机世界&#xff08;系统&#xff09;处理数据过程的介绍。接着以一个民宿平台数据架构随业务发展而不断演进的过程&#xff0c;展示了这场信息革命中&#xff0c;在具体应用场景下&#xf…

zotero7 插件使用

zotero style 1、下载地址 Zotero 插件商店 | Zotero 中文社区 2、配置 在工具插件里 3、配置 style 进入高级→设置编辑器 查找 easy 设置完即可显示&#xff0c; 注1&#xff1a;easyscholar的密钥要自行申请注册&#xff0c;注册地址&#xff1a;easySchol…

使用 Elastic AI Assistant for Search 和 Azure OpenAI 实现从 0 到 60 的转变

作者&#xff1a;来自 Elastic Greg Crist Elasticsearch 推出了一项新功能&#xff1a;Elastic AI Assistant for Search。你可以将其视为 Elasticsearch 和 Kibana 开发人员的内置指南&#xff0c;旨在回答问题、引导你了解功能并让你的生活更轻松。在 Microsoft AI Services…

CCF认证202406-02 | 矩阵重塑(其二)

题目背景 矩阵转置操作是将矩阵的行和列交换的过程。在转置过程中&#xff0c;原矩阵 A 的元素 aij​ 会移动到转置后的矩阵 AT 的 aji​ 的位置。这意味着 A 的第 i 行第 j 列的元素在 AT 中成为了第 j 行第 i 列的元素。 例如&#xff0c;有矩阵 A 如下&#xff1a; A[abc…

【CSP CCF记录】201903-2第16次认证 二十四点

题目 样例1输入 10 934x3 54x5x5 7-9-98 5x6/5x4 3579 1x19-9 1x9-5/9 8/56x9 6x7-3x6 6x44/5 样例1输出 Yes No No Yes Yes No No No Yes Yes 样例1解释 思路 参考&#xff1a;CCF小白刷题之路---201903-2 二十四点&#xff08;C/C 100分&#xff09;_ccf认证小白-CSDN博客 …

docker 容器运行Ruoyi-cloud

1&#xff0c;linux系统安装openjdk1.8,mvn,dokcer,node,git 2&#xff0c;拉取代码 1&#xff09;查看gitee仓库地址 2&#xff09;创建/app文件夹&#xff0c;进入app目录 mkdir /app cd /app 3&#xff09;clone代码 4&#xff09;修改配置文件中nacos地址 # 修改注…

浮点数的表示—IEEE754标准

浮点数的表示—IEEE754标准 引言 我们知道&#xff0c;在计算机中&#xff0c;数字以0和1组成的二进制序列来表示。但是&#xff0c;对于非常大的数字以及非常接近0的数字&#xff0c;简单的存储方式往往会造成精度的丢失。 为了解决这个问题&#xff0c;提供更高效的浮点数…

Window脚本自动化uiautomation详解_番茄出品

Window脚本自动化uiautomation详解_番茄出品 start 有时候pc端电脑&#xff0c;会有一些重复操作&#xff0c;希望能够通过代码实现这些操作。尝试了好几个库&#xff0c;但是识别准确率很低&#xff0c;在苦苦寻找之后&#xff0c;发现一个非常好用的 python 库 &#xff1a…

Java技术复习提升 11 常用类

第11章 常用类 1 包装类 不同包装类都继承自Object类 Serialiazble接口表示该类表示序列化 Comparable接口用于定义自然顺序 包装类和基本数据的转换 jdk5之前手动装箱拆箱 jdk5之后自动装箱拆箱 自动装箱底层调用的是valueof方法 拆箱仍然是intvalue方法 public class Inte…

Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(三)

本篇紧跟第一篇&#xff0c; 和 第二篇无关 Oracle - 多区间按权重取值逻辑 &#xff0c;分时区-多层级-取配置方案 Oracle - 多区间按权重取值逻辑 &#xff0c;分时区-多层级-取配置方案(二) 先说需求&#xff1a; 某业务配置表&#xff0c;按配置的时间区间及组织层级取方…

DASCTF 2024 10月 Reverse 完成笔记 附题目

题目链接: https://github.com/Airrcat/long_long/tree/main/DASCTF_2024_10 ezre 查PE 32位无壳 开始分析 看起来很像加壳了 字符串未有暴露信息&#xff0c;但是段中有一个themida 发现是一个壳&#xff0c;直接去找脱壳机 一些脱壳工具&#xff08;Magicmida)是…

kafka进阶_2.存储消息

文章目录 一、存储消息介绍二、副本同步2.1、数据一致性2.2、HW在副本之间的传递 如果想了解kafka基础架构和生产者架构可以参考 kafka基础和 Kafka进阶_1.生产消息。 一、存储消息介绍 数据已经由生产者Producer发送给Kafka集群&#xff0c;当Kafka接收到数据后&#xff0c…