目录

 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,存在分布式问题,即客户端发出的请求可能会到达不同的服务器。

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

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。