目录
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,流程相同,不再赘述;
访问结果为: