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

Spring Web MVC————入门(2)

1,请求

我们接下来继续讲请求的部分,上期将过很多了,我们来给请求收个尾。

还记得Cookie和Seesion吗,我们在HTTP讲请求和响应报文的时候讲过,现在再给大家讲一遍,我们HTTP是无状态的协议,这次的请求和下次的通信是没有直接联系的,我们登录网站的时候我们是应该在这一段时间内只用登录一次的,而不是刷新一下就得登录,访问一下就得登录,那谁还使用呀,那我们怎么做到只用登录一次并且你传输过来的请求报文我还能识别出来是你呢:

首先用户发起登录请求,浏览器拿着请求给服务器,服务器校验用户名和密码,一旦成功,服务器就会创建一个Seesion对象(会话)和唯一的SeesionID,把他俩关联起来,并把他们存储在数据库或者缓存中,并通过响应报头设置set-cookie把SeesionID放到里面,浏览器接收响应会保留Cookie,之后每个同域的请求,浏览器都会携带着Cookie,在用户后续的请求中,服务器通过解析请求中的Cookie获取Session ID,并与服务器存储的会话信息比对,以确认用户身份,维持登录状态。

1)获取Cookie

我们先来学习如何获取Cookie

1,传统方法获取Cookie,我们可以使用HttpServletRequest来获取Cookie,虽然这个东西很老了,但是还是很实用的,我们如果使用注解的话只能就一个参数获取一个Cookie,而HttpServletRequest可以获取所有关于请求报文的属性,比如之前学的方法呀,Header啊,与之对应的还有HttpServletResponse,可以获得响应报文,话不多说,来上代码,

@RequestMapping("/Argu")
@RestController
public class Argu {@RequestMapping("/getCookie1")public String getCookie1(HttpServletRequest httpServletRequest){Cookie[] cookies = httpServletRequest.getCookies();if(cookies!=null){for(Cookie cookie: cookies){System.out.println(cookie.getName()+"   "+ cookie.getValue());}}return "获取Cookie成功";}
}

我使用postman发起请求,别把工具忘了, 

右边样、这有个Cookies,我们输入http://127.0.0.1:8080/这样就能给postman发给我们的模拟请求都带上Cookie了, 

发送:

我们拿到了我们设置的Cookie,

我们还可以使用注解的方式获取Cookie,

    @RequestMapping("/getCookie2")public String getCookie2(@CookieValue("name") String name){return name;}

 注解是真牛逼,但是只能获取一个,真的吗?

    @RequestMapping("/getCookie3")public String getCookie3(@CookieValue("name") String name,@CookieValue("age") String age){return "第一个Cookie的Value"+name+",第二个Cook的Value"+age;}

多写几个参数不就行了,这有一点不太好的就是使用HttpServletRequest不会那么多,懂我意思不,注解写起来可能会巨多,但是根据场景我们可以进行不同的选择; 

2)获取和设置Seesion

我们先来设置Seesion:

我们怎么设置Seesion呢,我们假设用户已经登录过了,我们看看来创建会话(Session对象)有着对应的SessionID,之后我们把用户的用户名存到Session中,来上代码:

@RequestMapping("/Argu2")
@RestController
public class Argu2 {@RequestMapping("/setSession")public String setSession(HttpServletRequest httpServletRequest){HttpSession httpSession = httpServletRequest.getSession();httpSession.setAttribute("name","zhangsan");httpSession.setAttribute("age",18);return "设置Session成功";}
}

这个新的Session是HttpSession的机制,不必理会,我们怎么看到我们设置的Session呢,看不到嗷,我们得通过获取Session,这个是服务端的,我们存储在内存或数据库中,我们刚才的操作就相当于Set-Cookie嗷;

我们来写获取Session的代码:

    @RequestMapping("/getSession")public String getSession(HttpServletRequest httpServletRequest){HttpSession httpSession = httpServletRequest.getSession(false);//这个就相当如果用户登录了,那么Session是有值的,如果没登录那么就是nullif(httpSession==null){return "用户未登录";}else{String username = (String) httpSession.getAttribute("name");Integer age = (Integer) httpSession.getAttribute("age");return "用户名为:"+username+"密码为:"+age;}}

前提是我们设置过Session才能获取到;

我们还有两种方法来获取Session;

    @RequestMapping("/getSession2")public String getSession2(HttpSession httpSession){String username = (String) httpSession.getAttribute("name");return username;}

 还有通过注解的方式:

    @RequestMapping("/getSession3")public String getSession3(@SessionAttribute("name") String name){return name;}

注解就是爽嗷: 

3)获取Header

依旧是两个方法,

    @RequestMapping("/getHeader")public String getHeader(HttpServletRequest httpServletRequest){String host = httpServletRequest.getHeader("Host");return host;}

还可以使用注解的方法:

    @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("Host") String host){return host;}

 我们可以看看Fiddler的抓包:

可以看到Host是对哒; 


2,响应

我们之前写的响应都是返回字符串,那我们还可以返回什么呢,我们还能返回页面,文本,json,html等等,还记得RequestController吗,我们看下源码:

我们可以看到@RequestController包含@Controller和@ResponseBody,这两个注解什么意思呢,@Controller是返回视图,比如我们返回"/login.html",此时就不会返回字符串了,而是返回一个html页面,这个@ResponseBody的意思就是返回数据了,所以我们直接使用RequestController就是直接返回数据了;

1,返回静态页面,返回视图

我们先来返回前端页面的代码:

我们要把前端代码放到静态资源这里:

<body><h1>计算器</h1>数字1:<input name="num1" type="text" id="num11"><br>数字2:<input name="num2" type="text" id="num22"><br><input type="submit" value=" 点击相加 " onclick="hei()"><br><span id="result"></span>
<script>function onclick() {$.ajax({type:"get",url:"CalcController/Calc",data:{num1: $("#num11").val(),num2: $("#num22").val()},success: function (result){if(result==null){alert("参数出错了")}else{$("#result").html(result);}}})}
</script>
</body>

 还是用这个前端代码,

@RequestMapping("/Argu3")
@Controller
public class Argument {@RequestMapping("/getHtml")public String getHtml(){return "/calc.html";}
}

 

并没有返回字符串而是前端界面。

我们还可以设置参数来选择自己要返回什么:

produces = "application/json"      // 返回 JSON 数据
produces = "text/html"             // 返回 HTML 内容
produces = "text/plain"            // 返回纯文本
produces = "application/xml"       // 返回 XML 数据
produces = "image/png"             // 返回 PNG 图片

我们从网上找的几个常用的,我们来上代码:

     @RequestMapping(value = "/getHtml3", produces = "text/html")@ResponseBodypublic String getHtml3(){return "<h1>我是一级标题</h1>";}

来看结果:

 

返回的是Html,

    @RequestMapping(value = "/getHtml2", produces = "text/plain")@ResponseBodypublic String getHtml2(){return "<h1>我是一级标题</h1>";}

 

 返回的就是文本了;

2,返回数据

我们在有@Controller注解的前提下加上@ResponseBody就能返回数据了

    @RequestMapping("/getData")@ResponseBodypublic String getData(){return "/calc.html";}

 

3,返回json和接收json

先来返回json:

@Data
public class UseInfo {private String name;private Integer age;
}

 返回json就是返回对象,Spring会自动把我们返回的对象变成json,我们创建完对象用lombok,

    @RequestMapping(value = "/returnJson" ,produces = "application/json")@ResponseBodypublic UseInfo return_json(){UseInfo useInfo = new UseInfo();useInfo.setName("zhangsan");useInfo.setAge(18);return useInfo;}

 

4,设置状态码

    @RequestMapping(value = "/setStatus" ,produces = "application/json")@ResponseBodypublic UseInfo setStatus(HttpServletResponse httpServletResponse){UseInfo useInfo = new UseInfo();useInfo.setName("zhangsan");useInfo.setAge(18);httpServletResponse.setStatus(404);return useInfo;}

我们来试试抓包:

 

 

拿到了也是404,治好了也是流口水,哈哈,这后面有用; 

5,设置Header

    @RequestMapping("/setHeader")@ResponseBodypublic String setHeader(HttpServletResponse httpServletResponse){httpServletResponse.setHeader("name","zhangsan");return "设置Header成功";}

抓包看看:

 

我们还可以设置其他属性;

今天就到这了哈,下期继续;

相关文章:

  • 【极兔快递Java社招】一面复盘|数据库+线程池+AQS+中间件面面俱到
  • 下载的旧版的jenkins,为什么没有旧版的插件
  • 【docker】--容器管理
  • 代码随想录训练营第二十三天| 572.另一颗树的子树 104.二叉树的最大深度 559.N叉树的最大深度 111.二叉树的最小深度
  • 入门OpenTelemetry——部署OpenTelemetry
  • AI智能分析网关V4周界入侵检测算法精准监测与智能分析,筑牢周界安全防线
  • 《AI大模型应知应会100篇》第62篇:TypeChat——类型安全的大模型编程框架
  • 【SSL证书系列】操作系统如何保障根证书的有效性和安全
  • 适配华为昇腾 NPU 的交互式监控工具
  • 大模型训练简介
  • json-server的用法-基于 RESTful API 的本地 mock 服务
  • 仿射变换 与 透视变换
  • 第二个五年计划!
  • 计算机网络:手机和基站之间是通过什么传递信息的?怎么保证的防衰减,抗干扰和私密安全的?
  • Java内存马的检测与发现
  • 基于 GPUGEEK平台进行vLLM环境部署DeepSeek-R1-70B
  • 一分钟在Cherry Studio和VSCode集成火山引擎veimagex-mcp
  • 容器安全-核心概述
  • 【论文阅读】UNIT: Backdoor Mitigation via Automated Neural Distribution Tightening
  • 内存安全设计方案
  • 法学联合书单|法庭上的妇女
  • 大英博物馆展歌川广重:他是梵高最钟爱的浮世绘名家
  • 专访|茸主:杀回UFC,只为给自己一个交代
  • 王毅会见巴西外长维埃拉、总统首席特别顾问阿莫林
  • 牟海松任国家信访局副局长
  • 珠峰窗口期5月开启 普通人登一次有多烧钱?