springboot前后端交互(小白教学)

news2024/11/28 20:48:15

       在上次前后端交互,我们使用的是最基本的HTML+Servlet的组合,比较基础,今天我们来讲一讲Html+Springboot框架,前后端交互实现更为简便,大大降低了我们开发人员在代码上面所花费的时间,那今天让我们一探究竟吧。

1.添加路由守卫

      在前端我们在index.js中添加了路由守卫

 

 在网址中直接去http://localhost:8081/#/main

由于路由守卫,我们不能直接进入main页面中,自动给我们跳转到登录页面中

 2.验证token

添加token一块有4步:

  1. 登录成功后,后端生成token
  2. 前端接收,并保存
  3. 前端拦截器向后端发送
  4. 后端拦截器验证token

1. 登录成功后,后端生成token

package com.ffyc.common;


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class JWTUtil {

    /**
     * jwt 生成 token
     *
     * @param id
     * @param account * @return
     */
    public static String token(Integer id, String account) {
        String token = "";
        try {
            //过期时间 为 1970.1.1 0:0:0 至 过期时间 当前的毫秒值 + 有效时间
            Date expireDate = new Date(new Date().getTime() + 60 * 60 * 24 * 1000);//过期时间
            //秘钥及加密算法  加盐
            Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
            //设置头部信息
            Map<String, Object> header = new HashMap<>();
            header.put("typ", "JWT");//生成的类型
            header.put("alg", "HS256");//加密算法
            //携带 id,账号信息,生成签名
            token = JWT.create()
                    .withHeader(header)//头部
                    .withClaim("id", id)//用户id
                    .withClaim("account", account)//用户账号
                    .withExpiresAt(expireDate)
                    .sign(algorithm);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return token;
    }

    public static boolean verify(String token) {
        try {
            //验签
            Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        } catch (Exception e) {//当传过来的 token 如果有问题,抛出异常
            return false;
        }
    }

    /**
     * 获得 token 中 playload 部分数据,按需使用
     *
     * @param token
     * @return
     */
    public static DecodedJWT getTokenInfo(String token) {
        return JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);
    }
}

将生成Token添加到admin对象中

 2.前端接收,并保存

在main.js中添加验证token字段

3. 前端拦截器向后端发送

在main.js中添加

 4.后端拦截器验证token

后端token拦截器:

package com.ffyc.common;

import com.fasterxml.jackson.databind.json.JsonMapper;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//Token 验证拦截器
public class Token implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("后端Token拦截器");
        String adminToken=request.getHeader("token");
        boolean res=JWTUtil.verify(adminToken);
        if(!res){
            CommonResult commonResult=new CommonResult(202,res,"token失效");
            JsonMapper jsonMapper=new JsonMapper();
            String json=  jsonMapper.writeValueAsString(commonResult);
            response.getWriter().print(json);
        }
        return res;
    }
}

注册拦截器:

package com.ffyc.common;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

@Configuration
public class WebConfig implements WebMvcConfigurer{

	public void addInterceptors(InterceptorRegistry registry) {
		InterceptorRegistration inter =  registry.addInterceptor(new Token());
		inter.addPathPatterns("/admin/**"); //管理员需要拦截过滤地址
		inter.excludePathPatterns("/admin/loginCtl/login");//放行地址


		//放行行前台首页,文章详细信息等地址
		//inter.excludePathPatterns("/swagger*/**"); //放行swagger
		//inter.excludePathPatterns("/v2/**");//放行swagger
		//inter.excludePathPatterns("/webjars/**");//放行swagger
	}


}

在网址中直接搜索127.0.0.1:8080/admin/loginCtl/test

 拦截器会进行验证,没有Token,返回CommomResult

 3.完成最基本的登录功能

 3.1  dao层

在dao层创建接口

package com.ffyc.dao;

import com.ffyc.model.Admin;
import org.springframework.stereotype.Repository;

@Repository//使spring创建并管理对象
public interface LoginDao {
    public Admin Login(Admin admin);
}
<?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.ffyc.dao.LoginDao">
    <select id="Login" resultType="Admin">
        select * from admin where account=#{account} and password=#{password}
    </select>
</mapper>

  3.2 model层

在model层创建admin类

package com.ffyc.model;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
@Data//lombok 可以自动创建get set方法
@Getter
@Setter
public class Admin {
    private Integer id;
    private String account;
    private int password;
    private String token;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public int getPassword() {
        return password;
    }

    public void setPassword(int password) {
        this.password = password;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

  3.2 service层

  在service层写逻辑部分

package com.ffyc.service;

import com.ffyc.common.CommonResult;
import com.ffyc.common.JWTUtil;
import com.ffyc.dao.LoginDao;
import com.ffyc.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class LoginService {
     @Autowired
     LoginDao loginDao;
     public Admin login(Admin admin){
        Admin a = loginDao.Login(admin);

         return a;

     }

}

3.4 web层

package com.ffyc.web;

import com.ffyc.common.CommonResult;
import com.ffyc.common.JWTUtil;
import com.ffyc.model.Admin;
import com.ffyc.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(path= "/admin/loginCtl")
public class Controller {
    @Autowired
    LoginService loginService;
    @RequestMapping(path= "/login")
    //后端可以接收前端提交的json数据,但是必须是对象接收,必须要在参数前面添加@RequestBody
    public CommonResult login(@RequestBody Admin admin){
     Admin a = loginService.login(admin);
        CommonResult commonResult=null;
        if(a!=null) {
            a.setToken(JWTUtil.token(a.getId(),a.getAccount()));
            commonResult = new CommonResult(200, a, "登录成功");//可以对创建方法进封装
        }else{
            commonResult = new CommonResult(201, a, "账号密码错误");//可以对创建方法进封装
        }
     return commonResult;
    }

}

 加这个标签之后,前端就不需要再添加JsonString的方法

 4.配置application.yml

#配置内置服务器的端口号
server:
 port: 8080

#spring相关的配置
spring:
  #配置数据库的连接信息,生成默认的数据源对象,生成JdbcTemplate,事务管理功能进行初始化
 datasource:
   url: jdbc:mysql://127.0.0.1:3306/map?serverTimezone=Asia/Shanghai
   username: root
   password: root
   driver-class-name: com.mysql.cj.jdbc.Driver
   type: com.alibaba.druid.pool.DruidDataSource #指定数据源类型,还需要创建其对象
   initialSize: 5 #初始化时建立物理连接的个数   数据库连接池相关的配置
   minIdle: 1 #最小连接池数量
   maxActive: 20 #最大连接池数量

#mybatis配置  创建SqlsessionFactory
mybatis:
   type-aliases-package: com.ffyc.model
   mapper-locations: classpath:mappers/*Mappers.xml
   configuration: #mybatis settings配置
     map-underscore-to-camel-case: true
     cache-enabled: true

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

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

相关文章

1998-2014年工企污染数据库

1998-2014年工企污染匹配数据库 1、时间区间为&#xff1a;1998-2014年 2、部分指标&#xff1a; 工业总产值(现价)&#xff08;万元&#xff09;、工业用水总量&#xff08;吨&#xff09;、煤炭消费总量&#xff08;吨&#xff09;、其中:新鲜水量&#xff08;吨&#xff…

是谁实现了 Pod 的多副本管理?

目录一、前言二、案例分析三、案例总结一、前言 在 K8s 中 Pod 是由 Controller 来管理的&#xff0c;Controller 定义了 Pod 的部署 spec&#xff0c;如 Pod 的副本数、运行的 Node 等。不同的业务场景 Controller 是不同的。K8s 提供了多种 Controller&#xff0c;如常见的 …

POCV/SOCV 、LVF

1.POCV与OCV、AOCV 为了模拟片上PVT的差异带来的影响&#xff0c;最早提出了OCV&#xff08;On Chip Variation&#xff09;给每个cell都设置一个固定的derate值&#xff0c;来覆盖最悲观的情况&#xff0c;但是随着工艺发展&#xff0c;设计规模增大&#xff0c;OCV过度的悲观…

Docker之Nacos的持久化和集群部署

目录 一、外网单节点部署 1.docker mysql:5.7的持久化存储及远程连接 1.下拉镜像 2.在宿主机中相关目录&#xff0c;用于挂载容器的相关数据 3.创建mysql5.7容器 4.修改mysql允许Navicat远程连接 5.创建数据库nacos_config&#xff0c;并进行初始化 ​编辑 2. nacos-d…

DNS解析过程以及基本原理

目录 1.什么是 DNS 2.分布式、层次数据库 A.什么是分布式&#xff1f; B.什么是层次&#xff1f; D.什么是根 DNS 服务器 E.顶级域 DNS 服务器 F.权威 DNS 服务器 3.本地 DNS 服务器 4.递归查询、迭代查询 A.图解DNS解析过程 B.解析过程当中的递归解析和迭代解析 5…

STM8开发实例-IAR开发环境搭建

IAR开发环境搭建 IAR Embedded Workbench for STM8 是一个集成开发环境,具有高度优化的 C/C++ 编译器和全面的 C-SPY 调试器。 它为 STM8A、STM8L、STM8S、STM8T、STNRG 和 STLUX 系列中的器件提供全面支持。 1、IAR下载并安装 IAR Embedded Workbench For STM8官方下载地址…

3U 轨道交通车载工业级M12 PoE交换机,防护等级IP66

支持软硬件定制服务的轨道交通工业交换机 支持双电源冗余 支持Bypass 专门为轨道交通应用设计和制造的以太网数据通信设备 根据IEC61375-2-5和IEC61375-2-3协议实现的列车级骨干以太网核心设备 支持中国铁路 产品认证 XM-5145工业交换机是专为轨道交通、船载、车载等恶劣环…

非零基础自学Golang 第2章 安装和运行Go 2.1 GOROOT和GOPATH 2.2 在Windows 下安装Go

非零基础自学Golang 文章目录非零基础自学Golang第2章 安装和运行Go2.1 GOROOT和GOPATH2.2 在Windows 下安装Go第2章 安装和运行Go Go的安装主要分为两种方式&#xff1a;安装包安装和源代码安装&#xff1a; 安装包安装&#xff1a;即已编译好的可直接运行的程序&#xff0c…

145.如何评价个性化推荐系统的效果-2

145.1 E值 E值表示查准率P和查全率R的加权平均值&#xff0c;当其中一个为0时&#xff0c;E值为1&#xff0c;其计算公式&#xff1a; b越大&#xff0c;表示查准率的权重越大。 145.2 平均正确率&#xff08;Average Precision&#xff09; 平均正确率表示不同查全率的点…

【Effective Objective - C】—— 读书笔记(三)

【Effective Objective - C】—— 读书笔记&#xff08;三&#xff09; 文章目录【Effective Objective - C】—— 读书笔记&#xff08;三&#xff09;15.用前缀避免命名空间冲突要点&#xff1a;16.提供“全能初始化方法”要点17.实现description方法debugDescription&#x…

2023年Python、Golang、Java、C++如何选择?

前言 我们都有知道&#xff0c;开发后台语言可选择的方向会很多&#xff0c;比如&#xff0c;Java&#xff0c;go,Python,C/C,PHP&#xff0c;NodeJs…等很多&#xff0c;那么他们都有什么的样的优势&#xff1f;如果学习一门后端语言&#xff0c;又该如何选择呢&#xff1f; …

DolphinScheduler 快速构建 Hugging Face 文本分类工作流,基于工作流的机器学习训练部署太强了!...

点亮 ⭐️ Star 照亮开源之路https://github.com/apache/dolphinscheduler01.摘要Hugging Face transformers 是一个用于构建、训练和部署最先进的NLP 模型的开源项目。本文介绍如何基于DolphinScheduler和Hugging Face transformers来构建可复用的高效文本分类的工作流&#…

第36篇 网络(六)UDP

导语 这一节讲述UDP编程的知识。UDP&#xff08;UserDatagram Protocol即用户数据报协议&#xff09;是一个轻量级的&#xff0c;不可靠的&#xff0c;面向数据报的无连接协议。对于UDP我们不再进行过多介绍&#xff0c;如果你对UDP不是很了解&#xff0c;而且不知道它有什么用…

web网页设计期末课程大作业——电影介绍5页HTML+CSS制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

深入理解计算机系统——第十一章 Network Programming

深入理解计算机系统——第十一章 Network Programming11.1 The Client-Server Programming Model11.2 Networks11.3 The Global IP Internet11.3.1 IP Addresses11.3.2 Internet Domain Names11.3.3 Internet Connections11.4 The Sockets Interface11.4.1 Socket Address Stru…

项目要求移动端适配和 分段视觉映射在ECharts框架里的运用【高级ECharts技术】

移动端适配 满足多个查询时的优先级: 请注意,可以同时满足多个查询,并且它们都将由mergeOption合并,mergeOption稍后由merge定义(即更高的优先级)。 默认查询: 如果媒体中有一项不写入查询,则表示“默认值”。也就是说,如果不符合所有规则,则采用此选项。 容器尺寸实…

web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

在 VMware Workstation 中安装 ESXi 7.x

安装 VMware ESXi 7.x 在 VMware 中安装 VMware ESXi配置 ESXi 客户机网络本文介绍如何在虚拟机中安装 VMware ESXi。在虚拟机中安装ESXi提供了一种无需专用硬件即可尝试该产品的方法。 在 VMware 中安装 VMware ESXi 从 VMware 下载中心下载 ESXi 7.x ISO映像注意:如果有选择…

Java基础之SPI机制

Java基础之SPI机制一、SPI机制的简单示例1、案例分层2、接口3、实现类4、测试类5、结果二、SPI机制的缺陷一、SPI机制的简单示例 1、案例分层 resources 接下来可以在resources下新建META-INF/services/目录&#xff0c;然后新建接口全限定名的文件&#xff1a;com.example.d…

.net开发安卓入门 -记录两个问题处理办法

文章目录问题1、 Could not find 3 Android X assemblies, make sure to install the following NuGet packages解决办法1&#xff1a;解决办法2&#xff1a;问题2、Java.Lang.IllegalArgumentException: com.lhd. iml6yu: Targeting S (version 31 and above) requires that o…