Spring MVC入门(4)

请求

获取Cookie/Session

获取Cookie

传统方式:

java 复制代码
    @RequestMapping("/m11")
    public String method11(HttpServletRequest request, HttpServletResponse response) {
        //获取所有Cookie信息
        Cookie[] cookies = request.getCookies();
        //打印Cookie信息
        StringBuilder builder = new StringBuilder();
        if(cookies != null) {
            for(Cookie ck : cookies) {
                builder.append(ck.getName() + ":" + ck.getValue());
            }
        }

        return "Cookie信息:" + builder.toString();
    }

Spring MVC是基于Servlet API构建的原始Web框架, 也是在Servlet的基础上实现的.

HttpServletRequest, HttpServletResponse是Servlet提供的两个类, 是Spring MVC方法提供的内置对象.需要时在方法中添加声明即可.

HttpServletRequest对象代表客户端的请求, 当客户端通过HTTP协议访问服务器时, HTTP请求头中的信息都封装在这个对象中, 通过该对象提供的方法, 可以获得客户端请求的所有信息.

HttpServletResponse对象代表服务器的响应. HTTP响应头中的信息都封装在这个对象中,比如向客户端发送的数据, 响应头, 状态码等. 通过该对象提供的方法, 可以获得服务器响应的所有信息.

Spring MVC在这两个对象的基础上提供了封装, 给我们提供了更简单的使用方法.

这时没有设置Cookie, 通过浏览器访问 http://127.0.0.1:8080/param/m11, 得到的cookie为null

让我们设置一下Cookie,再刷新一下网址查看一下:

看一下结果:

从这个例子中, 也可以看出Cookie是可以伪造的, 也就是不安全的, 所以使用Cookie是, 后端需要进行Cookie校验.

在我们学习的过程中,为了让代码更加简洁,我们会将一些常用的部分封装起来. 在此处也是如此, 由于在获取Cookie的方法中, 有些代码必须需要, 那么Spring就将它们封装起来了.我们可以通过Spring注解的方式以更简单的方式获取到Cookie:

java 复制代码
    @RequestMapping("/m12")
    public String method12(@CookieValue("name") String name) {
        return "name:" + name;
    }

获取Session

Session的存储和获取

Session是服务器的一个机制, 我们需要存储, 然后才能获取.

Session也是基于HttpServletRequest来进行存储和获取的.

Session的存储

java 复制代码
    @RequestMapping("/m13")
    public String method13(HttpServletRequest request) {
        //获取Session对象
        HttpSession session = request.getSession();
        if(session != null) {
            session.setAttribute("username", "java");
        }
        return "session 存储成功";
    }

运行结果:

这个代码中是看不到SessionId这个概念的. getSession操作内部提取到请求中的Cookie里的SessionId, 然后根据SessionId获取到对应的Session对象, Session对象用HttpSession描述

获取Session有两种方式:

java 复制代码
HttpSession getSession(boolean create);



HttpSession getSession(); 

HttpSession getSession(boolean create): 参数如果为true, 则当不存在会话的时候新建会话; 参数如果为false, 则当不存在会话的时候返回null.

HttpSession getSession(): 和getSession(true)含义一样, 默认值是true.

void setAttribute(String name, Object value):指定的名称绑定一个对象到该对话

Session读取

读取Session可以使用HttpServletRequest

java 复制代码
    @RequestMapping("/m14")
    public String sess(HttpServletRequest request) {
        //如果Session不存在, 不会自动创建
        HttpSession session = request.getSession(false);
        String username = null;
        if(session != null && session.getAttribute("username") != null) {
            username = (String)session.getAttribute("username");
        }
        return "userName:" + username;
    }

Object getAttribute(String name):返回在该session会话中具有指定名称的对象, 如果没有指定名称的对象, 返回null.

运行结果(注意需要先设置Session, 否则这里的返回就是null了):

简洁获取Session(1)

java 复制代码
    @RequestMapping("/m15")
    public String sess2(@SessionAttribute(value = "username", required = false) String username) {
        return "username:" + username;
    }

简洁获取Session(2)

通过Spring MVC内置对象HttpSession来获取

java 复制代码
    @RequestMapping("/m16")
    public String sess3(HttpSession session) {
        String username = (String)session.getAttribute("username");
        return "username" + username;
    }

HttpSession session = request.getSession();

Session不存在的话, 会自动进行创建.

获取Header

获取Header也是从HttpServletRequest中获取.

java 复制代码
    @RequestMapping("/m17")
    public String method17(HttpServletRequest request, HttpServletResponse response) {
        String userAgent = request.getHeader("User-Agent");
        return "userAgent:" + userAgent;
    }

使用HttpServletRequest提供的getHeader方法来获取, 参数对应HTTP请求报头的"Key".

简洁获取Header

java 复制代码
    @RequestMapping("/m18")
    public String header(@RequestHeader("User-Agent") String userAgent) {
        return "userAgent:" + userAgent;
    }

运行结果:

相关推荐
曾令胜4 小时前
excel导出使用arthas动态追踪方法调用耗时后性能优化的过程
spring·性能优化·excel
.格子衫.4 小时前
Spring Boot 原理篇
java·spring boot·后端
多云几多4 小时前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
摇滚侠6 小时前
Spring Boot 3零基础教程,Spring Intializer,笔记05
spring boot·笔记·spring
Jabes.yang6 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪6 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
兮动人7 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR227 小时前
Spring IOC(控制反转)中常用注解
java·spring
摇滚侠7 小时前
Spring Boot 3零基础教程,Demo小结,笔记04
java·spring boot·笔记
笨手笨脚の8 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式·行为型设计模式