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

news2024/12/27 13:14:10

 

目录

一、响应

@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/login
    userName=?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,密码也是admin
        if ("admin".equals(userName) && "admin".equals(password)) {
            //设置session
            session.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不为空,那么他也就不会去创建一个session
        HttpSession session= request.getSession(false);
        String username=null;
        if(session!=null){
            username=(String) session.getAttribute("username");
        }
        return username;

    }
}

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

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

相关文章

ECShop 4.x collection_listSQL注入

漏洞描述 ECShop是一款B2C独立网店系统&#xff0c;适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序 影响版本&#xff1a;ecshop4.0.7及以下 漏洞环境及利用 docker环境搭建 访问8080端口&#xff0c;数据库主机为mysql&a…

Spark---Master启动及Submit任务提交

一、Spark Master启动 1、Spark资源任务调度对象关系图 2、集群启动过程 Spark集群启动之后&#xff0c;首先调用$SPARK_HOME/sbin/start-all.sh&#xff0c;start-all.sh脚本中调用了“start-master.sh”脚本和“start-slaves.sh”脚本&#xff0c;在start-master.sh脚本中可…

LLM之Agent(二):BabyAGI的详细教程

BabyAGI是一个 AI 支持的任务管理系统&#xff08;Python脚本&#xff09;&#xff0c;使用 OpenAI 和 Pinecone API 创建, 优先级排序和执行任务。该系统背后的主要思想是基于先前任务的结果和预定义的目标创建任务。脚本然后使用 OpenAI 的自然语言处理&#xff08;NLP&#…

文献速递:超声影像人工智能专题文献分享

文献速递&#xff1a;超声影像人工智能专题文献分享 01 文献速递介绍 本文综述了超声影像组学在甲状腺疾病研究中的应用及其局限性。近年来&#xff0c;甲状腺疾病的发病率逐渐增加&#xff0c;传统超声是最关键的甲状腺成像方法之一&#xff0c;但仍存在一定局限性。超声影…

Syncovery Mac/win中文版:快速、方便的数据备份和同步工具

备份和同步数据是现代生活中不可或缺的任务。无论是个人用户还是企业用户&#xff0c;都需要一款可靠的工具来保护和同步他们的数据。Syncovery是一款备份数据和同步工具&#xff0c;它能够提供全面的数据保护和灵活的数据同步功能。 首先&#xff0c;Syncovery具有强大的备份…

每日一练:简易计算器

1.设计思路 创建一个简单的用户界面&#xff0c;可以使用 Python 的 Tkinter模块。在界面上放置按钮&#xff0c;每个按钮代表一个数字、运算符或其他功能。使用变量来追踪用户输入的表达式。在用户点击按钮时&#xff0c;更新表达式并在界面上显示。 当用户点击“”按钮时&am…

window关于下载anaconda 2023年以后的版本,jupyter notebook闪退,没有内核的问题

这种问题的解决办法&#xff1a; 下载anaconda较早版本&#xff0c;比如我下载的是&#xff1a;2022年5月的版本。 下载之后&#xff0c;打开jupyter好像也会没有内核和闪退。 下面解决步骤&#xff1a; 1.注意&#xff1a;打开anaconda powershell prompt 2.重点来了&#xf…

漏洞复现--致远 M3 反序列化 mobile_portal RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

Uni-app智慧工地可视化信息云平台源码

智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云端进行处理和分析&#xff0c;生成各种报表、图表和预警信息&…

支持向量机:Python实践

支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;是机器学习领域中一种常用的分类算法&#xff0c;其在处理线性可分和线性不可分问题上表现出色。Python作为一种广泛应用的编程语言&#xff0c;提供了众多强大的机器学习库和工具&#xff0c;使得…

Mysql数据库多表数据查询问题

1、背景 线上某个业务数据分表存储在10个子表中&#xff0c;现在需要快速按照条件&#xff08;比如时间范围&#xff09;筛选出所有的数据&#xff0c;主要是想做一个可视化的数据查询工具&#xff0c;给产研团队使用。 2、实践 注意&#xff1a;不要在线上真实数据库操作&am…

【JavaEE初阶】 博客系统项目--前端页面设计实现

文章目录 &#x1f332;主要内容&#x1f38d;预期效果&#x1f6a9;博客列表页效果&#x1f6a9;博客详情页&#x1f6a9;博客登录页&#x1f6a9;博客编辑页 &#x1f340;实现博客列表页&#x1f6a9;实现导航栏&#x1f388;页面主体部分 &#x1f384;实现博客详情页&…

无公网IP环境如何实现远程访问连接家里内网的威联通QNAP NAS

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

JAVA进阶之路JVM-1:jvm基本组成、java程序执行过程、java程序的跨平台、静态编译器、jvm执行方式

JVM基本组成 当线上系统突然宕机&#xff0c;系统无法访问&#xff0c;甚至直接OOM&#xff1b; 线上系统响应速度太慢&#xff0c;优化系统性能过程中发现CPU占用过高&#xff0c;原因也许是因为JVM的GC次数过于频繁 因此&#xff0c;新项目上线&#xff0c;需要设置JVM的各…

高精度基准电压源测试方法有哪些

高精度基准电压源是一种能够产生稳定、可控的电压信号的设备&#xff0c;广泛应用于科学研究、工业检测和仪器仪表校准等领域。为了保证电压信号的准确性和可靠性&#xff0c;在使用高精度基准电压源进行测试时&#xff0c;需要采取一系列的测试方法和技术手段。 校准和验证是使…

软著项目推荐 深度学习 植物识别算法系统

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核&#xff0c;池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

AIGC文生图及工具产品简介

AIGC&#xff0c;全称是人工智能生成内容&#xff08;Artificial Intelligence Generated Content&#xff09;是继UGC&#xff08;用户生成内容&#xff09;&#xff0c;PGC&#xff08;平台生成内容&#xff09;后&#xff0c;利用人工智能技术&#xff0c;自动生成内容的生产…

无mac电脑生成uniapp云打包私钥证书的攻略

uniapp顾名思义是一个跨平台的开发工具&#xff0c;大部分uniapp的开发者&#xff0c;其实并没有mac电脑来开发&#xff0c;但是生成ios的证书&#xff0c;官网的教程却是需要mac电脑的&#xff0c;那么有没有办法无需mac电脑即可生成uniapp云打包的私钥证书呢&#xff1f; 下…

深入理解计算机中的程序

目录 程序的存储 程序的编译过程 各位宝宝好&#xff0c;我们这次从计算机底层来讲一下程序是如何存储&#xff0c;编译的 程序的存储 我们拿一个最简单的程序来举个例子&#xff1a; #include<stdio.h> int main() {printf("hello world");return 0; } …

吐血整理,Jmeter性能测试常见问题+解决汇总(详细)

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