【JavaEE】_Spring MVC项目获取Session

本文详细介绍了如何在Servlet中使用原生方法获取和设置Session,以及在Spring框架下通过注解和内置对象处理Session。讨论了Cookie与Session的区别,强调了Session在分布式环境中的挑战和解决方案。
摘要由CSDN通过智能技术生成

目录

 1. 使用servlet原生方法获取Session

1.1 错误获取方法

1.2 正确获取方法

2. 使用Spring注解获取Session

3. 使用Spring内置对象获取Session


 1. 使用servlet原生方法获取Session

.java文件内容如下:

setSession方法用于设置Session对象的内容;

getSession方法用于获取Session对象的内容;

package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        session.setAttribute("username", "zhangsan");
        return "Session set successfully";
    }
    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        if(session!=null){
            String username = (String) session.getAttribute("username");
            return "UserInformation: username is "+username;
        }
        return "Session is null";
    }
}

运行启动服务器,

1.1 错误获取方法

现试直接访问getSession:

发现并未设置session的内容;

1.2 正确获取方法

session是服务器的机制,无法伪造。需要在服务器端编写程序实现session的存取;

在本例中,setSession方法就是用于实现session的存取;

1. 首先访问setSession方法:

我们会发现在cookie列表中新增了一项名为JSESSIONID的cookie;

2. 使用Fiddler抓包查看HTTP请求与响应:

HTTP请求内容如下:

HTTP响应内容如下:

sessionId是连接cookie与session的桥梁,根据响应中的set-session报头实现客户端cookie的设置;

3. 此时再访问getSession方法:

可见session获取成功;

注:1. getSession方法可以携带一个布尔值的参数,表示在没有session时是否创建session:

默认情况下为true,表示当没有session时,创建一个session

2. session本质就是一个哈希表,其存储情况如下:

在服务器中对不同的客户端都会有session,getSession方法就是根据SessionId获取到Session对象;

2. 使用Spring注解获取Session

1. 可以使用Spring提供的注解@SessionAttribute获取Session

2. Session是服务器的机制,重启服务器后Session会丢失

.java内容如下:

package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/getSession2")
    public String getSession(@SessionAttribute String username){
        return "username: "+username;
    }
}

运行启动服务器,根据URL访问getSession2方法,页面如下:

查看服务器日志:

Ctrl+左键查看@SessionAttribute源码

手动设置为false即可,修改后的.java文件中getSession2方法如下:

    @RequestMapping("/getSession2")
    public String getSession(@SessionAttribute(required = false) String username){
        return "username: "+username;
    }

运行启动服务器,再次访问getSession2方法有:

再次访问上一例中setSession方法对session进行设置:

再次访问getSession2方法:

可见此时session获取成功;

3. 使用Spring内置对象获取Session

Spring内置了HttpSession对象,当方法参数为HttpSession session时,

等同于使用servlet原生方法中使用HttpSession session = request.getSession(true);

.java内容如下:

package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/getSession3")
    public String getSession(HttpSession session){
        String username = (String) session.getAttribute("username");
        return "UserInformation: username is "+username;
    }
}

运行启动服务器后,同上例,先运行setSession后,再访问getSession3,流程相同,不再赘述;

访问结果为:

4. 关于Cookie与Session存在的问题

1. 对于Cookie,在本专栏关于获取Cookie中已经提及,cookie是可以伪造的;

2. 对于Session,在企业开发中,即使流量再少的服务都至少需要两台机器,可以避免单点故障。故而对于Session,存在分布式问题,即客户端发出的请求可能会到达不同的服务器。

后续会介绍其他的使用方式。

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值