springboot普通类中如何获取session问题

 更新时间:2023年01月12日 11:05:03   作者:tcoding  
这篇文章主要介绍了springboot普通类中如何获取session问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Spring中普通类获取session

项目中日志功能

记录所有通过后台操作的记录,记录项有

时间、操作员、功能模块、操作内容

写了一个基于注解方式的aop,实现日志功能

使用shiro的话可以直接获取到用户的token,然后获取到用户登录信息

可是项目中没有使用token,使用的是session绑定登录信息,需要在@Aspect中获取到用户信息

解决方案

public class ServletUtil {

    public static ServletRequestAttributes getRequestAttributes() {

        return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    }

    public static HttpServletRequest getRequest() {
        return getRequestAttributes().getRequest();
    }
}

SpringBoot中使用session

基础知识

Cookie

  • Cookie由服务器端创建,然后添加到 HttpServletResponse 中发送给客户端(浏览器)。
  • 可以添加多个cookie键值对。
  • Cookie 由键值名和键值组成。相同 domain 和 path 中的键值名不能重复,添加键值名重名的键值对会覆盖上一个同名的键值对。
  • 添加 Cookie 时,需要指定cookie所在域(setDomain), 路径(setPath),指定存在时长(setMaxAge)。
  • 服务端创建好cookie后提交给客户端,之后浏览器的每次请求(HttpServletRequest)里都会携带cookie数组。
  • springmvc有两种方式获取:(1)在控制器函数中通过对参数注解@CookieValue(键值名),获取指定某个cookie。(2)通过 HttpServletRequest 中的 getcookies 方法获取 cookie 数组,然后迭代里面的每一个 cookie 键值对。

Session

  • 服务器会根据客户端的请求 HttpServletRequest 创建 session=request.getSession()。
  • 每一个 session 都有一个唯一的标示 sessionID ,可通过 request.getSession().getId()获得。
  • session是存储在服务器端的,每一个 session 都有一个id,当创建一个 session 后,会将该 sessionID 存放到此次访问的 cookie 中,当下次客户端的访问到来需要提取服务器中的 session时,会根据访问中 cookie 里的 sessionID 值来找到服务器中的具体 session。
  • 访问静态资源时不会创建 session
  • 服务器会把长时间没有活动的 session 从服务器内存中清除,此时 session 便失效。Tomcat 中 session的默认失效时间为 20分钟
  • Tomcat 7以上的版本中默认禁止客户端脚本读取session Id,需要在context.xml中设置useHttpOnly=”false”,开启权限。

在 Spring Boot中使用

设置useHttpOnly

jar 项目

在配置文件中设置:

server.servlet.session.cookie.http-only=false

war项目

在context.xml文件中的Context添加属性useHttpOnly

<Context useHttpOnly="false"><Context>

设置Cookie

场景:首次请求时跳转到指定页面,页面再通过ajax向后台请求数据,进行页面渲染。跳转页面时,需要指定cookie,否则会出现项目部署到外部tomcat时,cookie无法写入的情况,造成ajax请求时,两次的sessionId不一致。

@RequestMapping(value="/query", method=RequestMethod.GET)
public ModeAndView queryInfo(@RequestParam(value="sq")String sq,
                          HttpServletRequest request,
                          HttpServletResponse response
                          ) {
 
      ModeAndView view = new ModeAndView();
      //... view 操作
      Cookie[] cookies = request.getCookies();
      String sessionId = request.getSession().getId();
      if (cookies == null) {
          Cookie cookie = new Cookie("JSESSIONID", sessionId);
          cookie.setMaxAge(5 * 60);
          cookie.setDomian("localhost");
          cookie.setPath("/hand");
          response.addCookie(cookie);
      } else {
          for (Cookie cookie : cookies) {
              if (cookie.getName().equals("JSESSIONID")) {
                  cookie.setMaxAge(5 * 60);
                  cookie.setValue(sessionId);
                  cookie.setDomain("localhost");
                  cookie.setPath("/hand");
                  response.addCookie(cookie);
                  break;
              }
          }
      }
 
      return view;
}

ajax 请求时带上cookie

在请求列表中加上xhrFields参数。

var s = $.ajax({
  type: "get",
  timeout: 8000,
  xhrFields: { withCredentials: true},
  url: "/hand/val",
  data: {"params": ""},
  success: function(rel) {
      console.log(rel)
  },
  error: function() {
      console.log("failed")
  },
  complete: function(XMLHttpRequest, status) {
      if (status == "timeout") {
          s.abort();
          console.log("timeout");
      }
  }
})

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot监控模块Actuator的用法详解

    SpringBoot监控模块Actuator的用法详解

    Spring Boot Actuator 是 Spring Boot 自带的一个功能模块,提供了一组已经开箱即用的生产环境下常用的特性和服务,比如应用程序的健康检查、信息暴露、度量收集、日志记录等,本文将给大家详细SpringBoot监控模块Actuator的用法
    2023-06-06
  • IDEA搭建配置Java Web项目的详细步骤

    IDEA搭建配置Java Web项目的详细步骤

    这篇文章详细介绍了如何使用IDEA创建和配置JavaWeb项目,包括项目结构设置、WEB-INF目录和jsp文件的创建,以及Tomcat的配置,是Java初学者的实用指南,需要的朋友可以参考下
    2024-10-10
  • Java mongodb连接配置实践

    Java mongodb连接配置实践

    这篇文章主要介绍了Java mongodb连接配置实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Spring超详细讲解事务和事务传播机制

    Spring超详细讲解事务和事务传播机制

    Spring事务的本质就是对数据库事务的支持,没有数据库事务,Spring是无法提供事务功能的。Spring只提供统一的事务管理接口,具体实现都是由数据库自己实现的,Spring会在事务开始时,根据当前设置的隔离级别,调整数据库的隔离级别,由此保持一致
    2022-06-06
  • Mac下设置Java默认版本的方法

    Mac下设置Java默认版本的方法

    今天工作的时候发现了一个错误,提示java版本太低,无法启动!想起自己装过高版本的Java,但是却没有默认启动,从网上找了一些资料,整理下现在分享给大家,有需要的可以参考借鉴。
    2016-10-10
  • 浅谈选择、冒泡排序,二分查找法以及一些for循环的灵活运用

    浅谈选择、冒泡排序,二分查找法以及一些for循环的灵活运用

    下面小编就为大家带来一篇浅谈选择、冒泡排序,二分查找法以及一些for循环的灵活运用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java实现斗地主与猜数字游戏详细流程

    Java实现斗地主与猜数字游戏详细流程

    这篇文章主要介绍了怎么用Java来写斗地主种洗牌和发牌的功能,以及猜数字的游戏,斗地主相信大家都知道,同时也知道每一局都要洗牌打乱顺序再发牌,本篇我们就来实现它们能,感兴趣的朋友跟随文章往下看看吧
    2022-04-04
  • Java 8中map()和flatMap()方法区别详解

    Java 8中map()和flatMap()方法区别详解

    这篇文章主要为大家介绍了Java 8中map()和flatMap()方法区别详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • spring声明式事务@Transactional开发常犯的几个错误及最新解决方案

    spring声明式事务@Transactional开发常犯的几个错误及最新解决方案

    使用声明式事务@Transactional进行事务一致性的管理,在开发过程中,发现很多开发同学都用错了spring声明式事务@Transactional或使用不规范,导致出现各种事务问题,这篇文章主要介绍了spring声明式事务@Transactional开发常犯的几个错误及解决办法,需要的朋友可以参考下
    2024-02-02
  • SpringBoot整合EasyExcel实现导入导出功能

    SpringBoot整合EasyExcel实现导入导出功能

    EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具,他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能,本文就给大家介绍一下SpringBoot整合EasyExcel实现导入导出功能的方法,需要的朋友可以参考下
    2023-09-09

最新评论