SpringMVC~获取Cookie/Session/header、返回请求参数(text/html、Json对象、静态页面xxx.html、请求跳转/重定向)

Cookie

获取方法1:通过request和response对象

通过调用HttpServletRequest和HttpServletRespon对象的getCookies.,这是一个比较传统的方法,下面获取Session或者header都可使用这个方法,通过获取请求和响应对象,调用getSession或者getHeader方法来得到具体参数

获取Cookie:

  @GetMapping("/getCk")
    public Cookie[] getCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie[] cookies=request.getCookies();
        return cookies;
    }

输出:
在这里插入图片描述

获取方法2:使用注解(更简单、快速)

使用注解@CookieValue直接获取Cookie的值:

 @GetMapping("/getCk2")
    @ResponseBody
    public String getCookie(@CookieValue("Idea") String Idea){
        return Idea;
    }

运行结果:

在这里插入图片描述

Session

储存Session:

调用request请求对象,调用getSession方法,获取session对象,并将参数设为true.
如果不为空,调用setAttribute方法添加一个session。

//存取session
    @RequestMapping("/setsession")
    public String setSession(HttpServletRequest request){
   //获取session对象,设置参数为true,表示如果拿不到session对象,那么创建一个session
        HttpSession session=request.getSession(true);
        if(session !=null){
            session.setAttribute("username","Java");
        }
        return "储存session成功!";
    }

读取Session:

方法1:
传统方法,获取请求对象进行方法调用。

//读取session
    @RequestMapping("/getsession")
    public String getSession(HttpServletRequest request){
        String username="暂时为空";
        //获取Session对象,设置参数为false,表示如果拿不到session对象,也不会创建一个新的对象
        HttpSession session =request.getSession(false);
        if(session !=null && session.getAttribute("username")!=null){
            username=(String)session.getAttribute("username");
        }
        return username;
    }

方法2:
使用注解@SessionAttribute,设置value,required设为false,非必传参数。

 @RequestMapping("/getses2")
    public String getSession2(@SessionAttribute(value ="username",required = false) String username){
        return username;
    }

header

方法1:
比较传统的一个方法,通过HttpServletRequest对象,调用getHeader方法,和上面获得Cookie的方法相同。

  @RequestMapping("/gethd")
    @ResponseBody
    public String gethd(HttpServletRequest request,HttpServletResponse response){
        String userAgent=request.getHeader("User-Agent");
        return "读取到的header(userAgent)内容是:"+userAgent;
    }

运行结果:
在这里插入图片描述

方法2:
使用注解@RequestHeader

  @RequestMapping("/getua")
    public String getUserAgent(@RequestHeader("User-Agent") String userAgent){
        return userAgent;
    }

运行结果:
和上面方法1获得的结果一模一样。
在这里插入图片描述

返回请求参数

默认情况下,无论是Spring MVC还是Spring Boot返回的都是视图,即xxx.html,为了做到前后端分离,后端只给前端返回数据,我们可以使用@ResponseBody注解

@ResponseBody详解

@ResponseBody是使用在Controller(控制器层)的方法注解。
在控制器的方法中,如果不加这个注解,仅仅是给这个方法映射了路由,那么方法会默认返回一个视图,方法的返回值会作为视图名称,自动匹配响应的视图去显式。
如果加上这个注解会直接将方法的返回值作为内容直接返回给用户并且自适应响应头的content-type,如果是普通的字符串,就是text/html格式,如果返回的字符串符合json,那么content-type就是application/json格式。

总结
@ResponseBody注解的作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给前端。

text/html非视图数据

@ResponseBody //这个注解的作用就是将默认return的视图形式的数据转换成text文本或者html形式的数据

 @RequestMapping("/gethtmlmess")
    @ResponseBody //这个注解的作用就是将默认return的视图形式的数据转换成text文本或者html形式的数据
    public String method(){
        return "<h3>这是一个HTML类型的信息,h3标题大小<h3>";
    }

使用fiddler抓包,可以看到返回的数据格式是text/html类型
在这里插入图片描述

返回静态页面(xxx.html类型)

在resources路径下创建一个html文件:
在这里插入图片描述
在index.html中写入以下代码:

<html>
<head>
    <meta charset="utf8">
</head>
    <body>
    <h3>这是一个HTML类型的静态页面!</h3>
    <form>
        <p></p>
        <p></p>
        <h3>无法在页面上进行操作和互动.</h3>
    </form>
    </body>
</html>

在控制层,即Controller类中写一个方法,用户在url输入请求后会映射到这方法上,最后返回的就是上面创建的html,在返回一个html类型的静态文件时,需要在名称前加“/”,代码如下:

package com.example.demo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/index")
    public Object deal(){

        //do something..

        //返回视图:index.html静态页面
        return "/index.html"; //前面需要添加一个"/",否则认定是字符串
    }
}

在浏览器中访问时运行结果:
在这里插入图片描述

返回Json对象

举例:

@RequestMapping("/getjson")
    @ResponseBody
    public Object getJson(String name){
        HashMap<String,Object> map=new HashMap<>();
        map.put("name",name);
        map.put("ctime", LocalDateTime.now());
        return map;
    }

输入Url访问结果:
在这里插入图片描述
抓包后查看返回请求的content-type,是application/json格式:
在这里插入图片描述

请求转发和重定向

在Spring MVC中,renturn返回时不仅可以返回一个视图,还可以实现跳转。
跳转请求的方式有两种:转发(forward)和重定向(redirect)。

请求转发流程:
在这里插入图片描述

请求转发(Forward)是服务器内部的一种行为,转发后访问的资源也只能是服务器内部的资源,不能访问外部的资源。
转发是服务器请求资源,直接访问目标地址的URL,然后把响应内容给读取过来在发送给浏览器,浏览器并不知道响应内容的来源,所以url没有发生改变。就像考试的时候,老师给了你一张卷子,你抄了同桌的答案,但老师不知道你是抄了别人的答案,给你的分数还是不变的。

代码:
假设某位b站用户没有登录就想刷视频,会跳转到登录界面,会跳转到登录界面loginxxx.html:

@Controller
@RequestMapping("/ret")
public class TestController {
    @RequestMapping("/add")
    public String forward(){
        System.out.println();
        System.out.println("正在进行请求转发forward操作");
        System.out.println();
        //假设用户没有登录,跳转到login.html登录界面。
        return "forward: login.html";
    }
}

请求重定向流程(Redirect):
在这里插入图片描述
请求重定向(Redirect)是客户端的一种行为,服务器会根据逻辑发送一个状态码,告诉浏览器重新请求地址,所以在浏览器中会显示新的URL.
重定向从本质上来说是两次request,第一次的时候,用户/客户端request A,服务器响应,然后response结果,告诉浏览器,你应该访问B,此时地址栏中的URL就会发生改变。然后浏览器会开始第二次的请求request B,服务器返回新的response.

使用:
return时直接加上redirect:/重定向地址

  @RequestMapping("/add2")
    public String redirect(){
        System.out.println();
        System.out.println("正在进行请求重定向");
        System.out.println();
        return "redirect:/login.html";
    }

Forward(转发)和Redirect(重定向)的区别

从四个方面考虑区别:

  • 访问地址forward的整个过程是服务器行为,与客户端无关,所以地址栏中的URL没有发生改变。而Redirect是客户端行为,客户端重新请求地址,所以URL是新的URL.
  • 数据共享 :forward过程中,跳转前的页面和跳转后的页面后可以共享一个请求request中的数据,而redirect不能共享数据。
    请求转发的过程中,外部资源可能会丢失(css样式、图片等),访问不到;而在请求重定向的时候不存在外部资源丢失的情况,和直接访问目标地址是的效果相同。
  • 应用的场景 :请求转发一般用于登录跳转,而重定向一般用于跳转到其他网站、注销登录返回原来的页面。
  • 运行效率 :跳转的运行效率高、而重定向的运行效率低。
  • 32
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值