Spring第二课响应的完全,如何理解前后端互联

 

目录

一、响应

@Control,@RestController

1.Controller的源码,代表什么意思

2.返回数据 @Responsebody

3.返回HTML片段

4.返回JSON

5.那么假如我们使用集合会怎么样呢

设置状态码,虽然不影响展示,但是确实显示起来也就是401的情况。

2.我们可以看到默认的情况下,它是text/html​​​​​​​,设置成application/json

设置标头(看响应,多个myhead)

前后端结合小案列

开发中程序报错,如何定位问题呢?


Cookie和Session的弊端

Cookie是客户端机制,Session是服务端机制

Cookie存在的问题是,他可以被伪造

Session存在的区别是分布式问题。

一、响应

@Control,@RestController

1.Controller的源码,代表什么意思

第一个Target后面的Type 表示注解后面可以接类,假如后面有method表示后面可以接方法

第二个是表示这个注解的生命周期

Spring这个东西可以被称为一个容器,可以简简单单加几个注解即可。

Controller的意思是告诉Spring,帮助我们管理这个代码,我们后续访问时候,才能访问到。

@ResponseBody告诉返回的是一个数据

@Control返回的是视图,随着前后端分离,后端开始不处理页面,就返回页面所需要的数据

@RestController=@Control+@ResponseBody的结果

2.返回数据 @Responsebody

可以修饰类,也可以修饰方法,修饰类的时候,表示这个类下的所有方法,返回的均是数据,修饰方法的时候,表示该方法返回的是数据,如果一个类的所有方法返回的都是数据,我们就把这个注解加在类上。

3.返回HTML片段

4.返回JSON

当接口返回的是String时,content-Type是text/html

当我们的接口返回的是对象时,content-Type  application-JSON

5.那么假如我们使用集合会怎么样呢

设置状态码,虽然不影响展示,但是确实显示起来也就是401的情况。

 @ResponseBody@RequestMapping("/setStatus")public String setStatus(HttpServletResponse response){//状态码不影响页面的展示response.setStatus(401);return "设置状态吗";}

2.我们可以看到默认的情况下,它是text/html​​​​​​​,设置成application/json

  @ResponseBody
//    @RequestMapping(value = "/r1",produces = "application/json;charset=utf-8")
@RequestMapping(value="/r1")public  String r1(HttpServletResponse response){return "{'OK':1}";}

我们可以通过指定的方式,来让这个变成application,可以设置返回类型。当然也不能强制转化成json不然也会报错。

consumes:指定处理请求的提交内容类型,例如application/json,text/html;如果指定application/json(更像是一个限制)

produces:设置返回的内容类型,仅当request请求头中的类型中包含该指定类型才返回。

  @ResponseBody@RequestMapping(value = "/r1",produces = "application/json;charset=utf-8")
//@RequestMapping(value="/r1")public  String r1(HttpServletResponse response){return "{'OK':1}";}

设置标头(看响应,多个myhead)

  @ResponseBody@RequestMapping(value = "/r1",produces = "application/json;charset=utf-8")
//@RequestMapping(value="/r1")public  String r1(HttpServletResponse response){//设置header的方法response.setHeader("myhead","myhead");return "{'OK':1}";}

前后端结合小案列

前端的一个计算器代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body>
<form action="calc/sum" method="post"><h1>计算器</h1>数字1:<input name="num1" type="text"><br>数字2:<input name="num2" type="text"><br><input type="submit" value=" 点击相加 ">
</form>
</body></html>

对应着后端代码其中,name1的命名和name2命名,和form中name 保持一致

package com.example.demo;import org.springframework.boot.context.config.InactiveConfigDataAccessException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/calc")
@RestController
public class CalcController {@RequestMapping("/sum")public  String sum(Integer num1,Integer num2){Integer sum=num1+num2;return "计算结果:"+sum;}}

开发中程序报错,如何定位问题呢?

通过日志 (打印日志,指的是在最开始就打印一个这种***看你的后端代码能否在执行之前打印出来,从而判定是不是后端有毛病)                                                                  请求是否到达后端

1.前端:f12看控制台         

2.后端:看接口,控制台日志

还可以我们手动去测试接口,假如这样好使,就说明前端的问题。

我们在访问前端的过程时候,前面8080后面什么也不用接,直接加路径名字即可。

以下是两个前端代码

<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>用户登录首页</title>
</head><body>
登录人: <span id="loginUser"></span><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>//页面加载的时候,就应该去调用后端的请求了,ajax的执行顺序,看你写到哪里,上一个那个是在函数里面才被调用,但是这个是直接到了script也就是一加载,就会被调用的$.ajax({url:"/user/getUserInfo",type:"get",success :function (username){//放值就用text,不是放值,就去用html$("#loginUser").text(username)}})</script>
</body></html>

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>登录页面</title>
</head><body>
<h1>用户登录</h1>
用户名:<input name="userName" type="text" id="userName"><br>
密码:<input name="password" type="password" id="password"><br>
<input type="button" value="登录" onclick="login()"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>//form表单使页面进行跳转,页面跳转要搭配后端来进行页面跳转的,因为我们后端不再搭配前端来进行显示了。所以用ajax完成页面的请求function login() {console.log("登录...")//这种就属于是加日志,它是为了检测是否到达了这个函数$.ajax({url:"/user/login",type:"post",data:{"userName":$("#userName").val(),"password":$("#password").val()},success:function (result){if(result){location.href="/index.html"//location.assign();}else{alert("密码错误");}}});}</script>
</body></html>

下面是对应的后端代码,要注意的是看后端的思想

package com.example.demo;import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")/*1.登录接口/user/loginuserName=?password=?接口返回:校验成功/失败      true密码正确false密码错误*/public Boolean login(String userName, String password, HttpSession session) {
//        if(userName==null||userName.length()==0||password==null||password.length()==0){
//            return false;
//        }/*上面的过于麻烦,Spring为我们提供来一个好东西,去判断这个字符串有没有长度*/if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {return false;}//进行用户名和密码的校验,假装账号等于admin,密码也是adminif ("admin".equals(userName) && "admin".equals(password)) {//设置sessionsession.setAttribute("username", "admin");return true;}return false;}/*获取用户的登录信息/user/getUserInfo接口名称:当前登录用户的名称*//*@RequestMapping("/getUserInfo")public String getUserInfo(HttpSession session){//从session中获取登入用户String userName=(String) session.getAttribute("username");return userName;}*///下面这种方式更加规范,因为上面那种假如说没有session会自动创建一个session,但是假如说session创建了,他也是空的不影响问题。@RequestMapping("/getUserInfo")public String getUserInfo(HttpServletRequest request){//Session获取登录用户,下面这个方式就是,假如session不为空,那么他也就不会去创建一个sessionHttpSession session= request.getSession(false);String username=null;if(session!=null){username=(String) session.getAttribute("username");}return username;}
}

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

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

相关文章

[设计模式] 常见的设计模式

文章目录 设计模式的 6 大设计原则设计模式的三大分类常见的设计模式有哪几种1. 单例模式&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。&#xff08;连接池&#xff09;1. 饿汉式2. 懒汉式3. 双重检测 2. 工厂模式3. 观察者模式● 推模型● 拉…

自动化横行时代,手工测试如何突破重围?测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试是每个…

WiseAlign 软件运行中存图功能使用方法

WiseAlign 软件运行中存图功能使用方法 在需要存图的相机图像通道点击鼠标右键 在弹出的菜单中选择“图像操作——保存图像” 选择想要存放图片的文件夹&#xff08;如下图所示&#xff09; 修改文件名称 如果文件夹中已有同名文件会提示xxx.bmp文件已存在&#xff0c;是否需要…

【【Linux开发环境搭建与软件的安装】】

Linux开发环境搭建与软件的安装 下面我们来讲述 Ubuntu 系统搭建 tftp 服务器 TFTP 需要一个文件夹来存放文件&#xff0c;我们在根目录下新建一个/tftpboot 目录做为 TFTP 文件存储目录&#xff0c;之所以使用该目录是因为后面使用的 Petalinux 工具默认使用该目录&#xff0…

Spring Cloud,注册中心,配置中心,原理详解

文章目录 Spring Cloud&#xff0c;注册中心&#xff0c;配置中心&#xff0c;原理详解谈谈我个人对 spring Cloud 的理解 注册中心Eureka&#xff1a;服务搭建小结 Ribbo - 负载均衡1. 负载均衡流程2. 负载均衡策略 nacos注册中心1. 配置集群1. 创建 namespace2. 配置命名空间…

核密度估计法(KDE)的概念,应用,优点,缺点,以及与正态分布(高斯分布)的区别,以及与概率分布的区别联系。看完你就真正捋清这些概念了

文章目录 前言一、核密度估计法&#xff08;KDE&#xff09;是什么&#xff1f;二、核密度估计法的步骤如下&#xff1a;三、核密度的应用&#xff1a;四、核密度估计法的优点&#xff1a;五、核密度估计法的缺点&#xff1a;六、核密度估计法和正态分布的区别在于&#xff1a;…

注解方式优雅的实现Redisson分布式锁

1.前言 随着微服务的快速推进&#xff0c;分布式架构也得到蓬勃的发展&#xff0c;那么如何保证多进程之间的并发则成为需要考虑的问题。因为服务是分布式部署模式&#xff0c;本地锁Reentrantlock和Synchnorized就无法使用了&#xff0c;当然很多同学脱口而出的基于Redis的se…

【机器学习】平滑滤波

平滑滤波技术 平滑滤波&#xff0c;顾名思义就是对信号进行处理使之整体显得更加平滑&#xff0c;降低噪声影响&#xff0c;提高信号质量&#xff0c;它常见于数字信号处理和图像处理&#xff0c;一般意义上的数字信号多体现于一维数据&#xff0c;图像信号多体现于二维数据。…

OCR常用数据集_看数据集区分可识别语言

这里写目录标题 COCO-TEXT 英文Total-Text 英文少量中文IIIT5K[50]、IC03[44]、IC13[34]、IC15[33]、CT80[56]MJSynth 英文SynthText分层文本数据集 (HierText) 英文TextOCR和IntelOCR &#xff1f;&#xff1f;&#xff1f;Multi-language dataset (IC19)RCTW17 主要中文MSRA-…

C语言键盘输入字符串小写转大写输出及scanf的小问题解决

1.博主在学习C语言时&#xff0c;也没太关注C语言的一些细节问题&#xff0c;导致后面有人问问题的时候一时没回答出来&#xff0c;也就是所谓的基础不牢地动山摇&#xff0c;比如这一次有同学问的scanf键盘输入的小问题&#xff0c;折腾了一阵子还是想出来问题所在。 2.废话不…

Docker | Docker部署MySQL

Docker | Docker部署MySQL ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Docker系列…

软件工程--面向对象分析用通俗语言20小时爆肝总结!(包含用例图、活动图、类图、时序图......)

面向对象方法分为面向对象分析&#xff08;OOA&#xff09;、面向对象设计&#xff08;OOD&#xff09;、面向对象编程&#xff08;OOP&#xff09;&#xff0c;本文详细介绍面向对象分析 本文参考教材&#xff1a;沈备军老师的《软件工程原理》大多图片来源其中 目录 面向对…

JMeter多脚本间的启动延时

JMeter做压测时&#xff0c;当需要多个jmx脚本依次执行时&#xff0c;需要用到“启动延时”&#xff0c;即间隔可设置的时间后启动运行下一个jmx脚本。 实现“启动延时”的方法有2个。 方法一、利用JMeter线程组中的"Startup delay"参数 如上图&#xff0c;调度器&…

解决git与huggingface项目下载速度慢或者失败的问题

git clone 项目报错 比如使用git clone 下载项目&#xff1a; git clone https://github.com/ChuRuaNh0/FastSam_Awsome_TensorRT.git有时候会报以下错误&#xff1a; fatal: unable to access ‘https://github.com/xxx.git/’: Failed to connect to github.com port 443 …

P15 C++ 枚举

The ChenPi 前言 今天我们要讲的是 C 中的枚举。 enum 是 enumeration 的缩写&#xff0c;基本上可以说&#xff0c;它就是一个数值集合。如果你想要给枚举一个更实际的定义&#xff0c;它们是给一个值命名的一种方法。 所以我们不用一堆叫做 A、B、C 的整数。我们可以有一个…

c语言:模拟实现各种字符串函数(2)

strncpy函数&#xff1a; 功能&#xff1a;拷贝指定长度的字符串a到字符串b中 代码模拟实现&#xff1a; //strncpy char* my_strncpy(char* dest, char* str,size_t num) {char* ret dest;assert(dest && str);//断言&#xff0c;如果其中有一个为空指针&#xff…

vue3+ts 依赖注入 provide inject

父级&#xff1a; <template><div><h1>App.vue (爷爷级别)</h1><label><input type"radio" v-model"colorVal" value"red" name"color" />红色</label><label><input type"r…

C++标准模板库 STL 简介(standard template library)

在 C 语言中&#xff0c;很多东西都是由我们自己去实现的&#xff0c;例如自定义数组&#xff0c;线程文件操作&#xff0c;排序算法等等&#xff0c;有些复杂的东西实现不好很容易留下不易发现的 bug。而 C为使用者提供了一套标准模板库 STL,其中封装了很多实用的容器&#xf…

山西电力市场日前价格预测【2023-11-27】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-27&#xff09;山西电力市场全天平均日前电价为40.02元/MWh。其中&#xff0c;最高日前电价为293.07元/MWh&#xff0c;预计出现在17:45。最低日前电价为0.00元/MWh&#xff0c;预计出现…

1998-2021年全国各地级市PM2.5平均浓度数据

1998-2021年全国各地级市PM2.5平均浓度数据 1、时间&#xff1a;1998-2021年 2、指标&#xff1a;省、省代码、市、市代码、年份、均值、总和、最小值、最大值、标准差 3、来源&#xff1a;Washington university Atmospheric Composition Analysis Group 4、范围&#xff…