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

目录
  • Spring中普通类获取session
    • 项目中日志功能
    • 解决方案
  • SpringBoot中使用session
    • 基础知识
    • 在 Spring Boot中使用
  • 总结

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");
      }
  }
})

总结

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

(0)

相关推荐

  • SpringBoot中HttpSessionListener的简单使用方式

    目录 HttpSessionListener的使用方式 session监听实现类 controller调用 注册HttpSessionListener失效原因 问题描述 原因 HttpSessionListener的使用方式 session监听实现类 import org.springframework.stereotype.Component; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpS

  • SpringBoot下实现session保持方式

    目录 相关概念 1.HTTP是无状态协议 2.哪些方法可以实现有状态连接 3.Session是由Web服务器端(Tomcat)维护的 实现方法 实现方法 实现原理 实现代码 如何插入一段漂亮的代码片 总结 相关概念 1.HTTP是无状态协议 无状态是指协议对于事务处理没有记忆功能.缺少状态意味着,假如后面的处理需要前面的信息,则前面的信息必须重传,这样可能导致每次连接传送的数据量增大.另一方面,在服务器不需要前面信息时,应答就较快.直观地说,就是每个请求都是独立的,与前面的请求和后面的请求都是没

  • SpringBoot 整合 Spring-Session 实现分布式会话项目实战

    目录 一.配置及开发 二.测试 三.Spring-Session 的缺点 文章参考: Spring 提供了处理分布式会话的解决方案:Spring-Session.Spring-Session 提供了对Redis.MongoDB.MySQL 等常用存储的支持,Spring-Session 提供与 HttpSession 的透明整合,这意味着开发人员可以使用 Spring-Session 支持的实现方式,切换 HttpSession 至 Spring-Session.本文采用 Redis 作为第三方

  • SpringBoot Session接口验证实现流程详解

    目录 添加pom.xml 创建简单的测试接口 使用过滤器实现 使用拦截器实现 需求:只有用户登录成功后,才能访问其它接口,否则提示需要进行登录 项目仓库地址:https://gitee.com/aiw-nine/springboot_session_verify 添加pom.xml 新建Spring Boot(2.7.2)项目,添加如下依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns

  • 详解SpringBoot中@SessionAttributes的使用

    目录 简介 概述 代码 后端代码 前端代码 测试 简介 说明 本文介绍SpringBoot中@SessionAttributes的用法. 概述 在默认情况下,ModelMap中的属性作用域是request级别,也就是说,当本次请求结束后,ModelMap 中的属性将销毁.如果希望在多个请求中共享ModelMap中的属性,必须将其属性转存到session 中,这样 ModelMap 的属性才可以被跨请求访问. Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 sessi

  • SpringBoot3整合MyBatis出现异常:Property 'sqlSessionFactory'or 'sqlSessionTemplate' are required

    目录 交代一下背景 问题出现 问题排查 解决问题:需要升级版本 总结 SpringBoot3整合MyBatis报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 遇到了一个 Spring Boot 3 整合 MyBatis 的问题,然后解决了.当然,这其实不是个大问题,只是自己编码时遇到了,然后总结总结分享一下.如果有遇到类似问题的,可以参考一下. 交代一下背景 最近在熟悉 Spring Boot 3 版本的代

  • SpringBoot2.x设置Session失效时间及失效跳转方式

    目录 设置Session失效时间及失效跳转 Session失效后如何跳转到Session失效地址 设置Session失效的几种方式 如果是1.5.6版本 还可以设置 设置Session失效时间及失效跳转 #Session超时时间设置,单位是秒,默认是30分钟  server.servlet.session.timeout=10 然而并没有什么用,因为SpringBoot在TomcatServletWebServerFactory代码中写了这个     private long getSessio

  • SpringBoot集成redis与session实现分布式单点登录

    目录 单点登录 SSO(Single Sign On) 什么是单点登录? 实现方式 开发技术 单点登录实现流程 实现案例 看效果 前言: 由于考虑到cookie的安全性问题,就有了下面这个版本的sso 单点登录 SSO(Single Sign On) 什么是单点登录? 单点登录的英文名叫做:Single Sign On(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统.简而言之,多个系统,统一登陆. 我们可以这样理解,在一个服务模块登录后,其他模块无

  • Spring Session(分布式Session共享)实现示例

    目录 HttpSession的实现流程 Tomcat中的HttpSession实现 使用 导入依赖 编辑配置文件 编辑启动类 编辑控制器 @EnableRedisHttpSession注解属性 redisNamespace maxInactiveIntervalInSeconds flushMode saveMode cleanupCron Spring Session保存在Redis中的数据 spring:session:sessions:唯一值 spring:session:sessions

  • SpringBoot整合SpringSession实现分布式登录详情

    目录 Session 共享 为什么服务器 A 登录后,请求发到服务器 B,不认识该用户? 解决方案 SpringBoot整合SpringSession实现分布式登录 Session 共享 比如两个域名: aaa.yupi.com bbb.yupi.com 如果要共享 cookie,可以种一个更高层的公共域名,比如 yupi.com 为什么服务器 A 登录后,请求发到服务器 B,不认识该用户? 用户在 A 登录,所以 session(用户登录信息)存在了 A 上 结果请求 B 时,B 没有用户信息

随机推荐