HttpServiceRequest、HttpSession、注解(@SessionAttributes):设置、获取session

本文详细介绍了如何在SpringBoot中使用HttpServiceRequest和HttpSession进行session的设置、获取、设置有效时间和失效。通过具体示例展示了在不同场景下设置session的有效时间,以及如何在获取session时使其失效。同时,还讨论了使用注解(@SessionAttributes)进行session管理的方法,包括设置和取消session的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用HttpServiceRequest设置session

使用HttpServiceRequest获取session

import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/test")
public class SpringBootTest {
//设置session
@RequestMapping("/test1")
public String test1(HttpServletRequest request){
    request.getSession().setAttribute("sessionName","sessionValue" );
    return "设置session成功";
}

@RequestMapping("/test2")
//获取session
public String test2(HttpServletRequest request){
    HttpSession httpSession=request.getSession();
    //获取到的是object类型,强制转换为string类型
    String sessionName= (String) httpSession.getAttribute("sessionName");
    return "获取session成功:"+sessionName;
}
}

先设置session:请求 http://127.0.0.1:8080/test/test1
在这里插入图片描述
后获取session:请求 http://127.0.0.1:8080/test/test2
在这里插入图片描述

使用HttpServiceRequest设置session

使用HttpSession获取session

import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/test")
public class SpringBootTest {
//设置session
@RequestMapping("/test1")
public String test1(HttpServletRequest request){
    request.getSession().setAttribute("sessionName","sessionValue" );
    return "设置session成功";
}

@RequestMapping("/test2")
//获取session
public String test2(HttpSession httpSession){
    /**
     * 获取到的是object类型,强制转换为string类型
     * 以设置session时的key获取,获取到的是value
     */
    String sessionName= (String)httpSession.getAttribute("sessionName");
    return "获取session成功:"+sessionName;
}
}

请求顺序、请求链接、请求结果与上面例子相同

设置session的有效时间,用HttpServiceRequest参数

import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/test")
public class SpringBootTest {
//设置session
@RequestMapping("/test1")
public String test1(HttpServletRequest request){
    HttpSession httpSession=request.getSession();
    httpSession.setAttribute("sessionName","sessionValue");
    //设置session的有效时间为10秒,这里的单位是秒
    httpSession.setMaxInactiveInterval(10);
    return "设置session成功,session的有效时间为10秒";
}

@RequestMapping("/test2")
//获取session
public String test2(HttpSession httpSession){
    /**
     * 获取到的是object类型,强制转换为string类型
     * 以设置session时的key获取,获取到的是value
     */
    String sessionName= (String)httpSession.getAttribute("sessionName");
    return "获取session成功:"+sessionName;
}
}

设置的10秒是距离最后一次活动10秒后session失效
先设置session:请求 http://127.0.0.1:8080/test/test1 设置session成功,10秒后获取session 请求http://127.0.0.1:8080/test/test2 获取不到session如下图
在这里插入图片描述
先设置session:请求 http://127.0.0.1:8080/test/test1 设置session成功,10秒内获取session 请求http://127.0.0.1:8080/test/test2 获取session成功,距离获取session请求10秒之后再获取session 请求http://127.0.0.1:8080/test/test2 获取session失败
在这里插入图片描述

设置session失效,在获取方法中设置session失效,用HttpSession设置,前提条件是设置session是用httprequest设置的session才能用这个方法设置失效,也是有两种设置失效的办法

import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/test")
public class SpringBootTest {
//设置session
@RequestMapping("/test1")
public String test1(HttpServletRequest request){
    HttpSession httpSession=request.getSession();
    httpSession.setAttribute("sessionName","sessionValue");
    return "设置session成功";
}

//第一种设置失效,用httpSession.invalidate();设置失效
@RequestMapping("/test2")
//获取session
public String test2(HttpSession httpSession){
    /**设置session失效,
     * 设置失效要在获取session之前设置,
     * 这样才能获取不到session
     * 才能设置成功
     */
    httpSession.invalidate();
    String sessionName= (String)httpSession.getAttribute("sessionName");
    return "获取session成功:"+sessionName;
}

//第二种设置失效,用request.getSession().invalidate();设置失效
 @RequestMapping("loginOut")
public String loginOut(HttpServletRequest request){
    request.getSession().invalidate();
    return "/login/loginPage";
}
}

先设置session 请求http://127.0.0.1:8080/test/test1 设置session成功
后获取session 请求http://127.0.0.1:8080/test/test2 获取session失败
在这里插入图片描述
Session already invalidated:会话已失效

不设置session有效期的情况下SpringBoot默认session的有效时间是30*60(30分钟)

设置全局的session时间

在资源文件resource下的application.properties文件中设置

service.session.timeout=60    单位是秒

注解设置session

1 在设置session的类上加一个注解@SessionAttributes;加在@RestController注解的下面一行

import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpSession;

@Controller
//使用注解设置session,value里的名称要与ModelAndView里的key一致
@SessionAttributes(value = {"name","value"})
@RequestMapping("/test")
public class SpringBootTest {
//设置session
@RequestMapping("/test1")
public ModelAndView test1(){
    ModelAndView modelAndView=new ModelAndView();
    //freemarker模板文件获取session值时用设置的key获取
    modelAndView.setViewName("/my/myindex");
    modelAndView.addObject("name","sessionID" );
    modelAndView.addObject("value","sessionValue" );
    return modelAndView;
}


@RequestMapping("/test2")
//获取session
public @ResponseBody String test2(HttpSession httpSession){
    String sessionID= (String)httpSession.getAttribute("name");
    String sessionValue=(String)httpSession.getAttribute("value");
    return "sessionID:"+sessionID+"\r\nsession值:"+sessionValue;
}
}

freemarker模板文件/my/myindex.ftl中写el表达式将key对应的value显示在前端浏览器

${name!}
${value!}

在这里插入图片描述
在这里插入图片描述

用注解设置了session,设置session失效也就要用跟注解对应的方式,这种方式只适用于session是用注解设置的,才能这样取消session,用SessionStatus的setComplete方法

    @RequestMapping("loginOut")
public void loginOut(SessionStatus status){
    status.setComplete();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值