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

总结

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

相关文章

  • java中List集合子类特点浅析

    java中List集合子类特点浅析

    java.util.List接口继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合,下面这篇文章主要给大家介绍了关于java中List集合子类特点的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • 解决maven update project 后项目jdk变成1.5的问题

    解决maven update project 后项目jdk变成1.5的问题

    下面小编就为大家带来一篇解决maven update project 后项目jdk变成1.5的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起 小编过来看看吧
    2016-11-11
  • Java中的 FilterInputStream简介_动力节点Java学院整理

    Java中的 FilterInputStream简介_动力节点Java学院整理

    FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。接下来通过本文给大家分享Java中的 FilterInputStream简介,感兴趣的朋友一起学习吧
    2017-05-05
  • 详解Java设计模式编程中的中介者模式

    详解Java设计模式编程中的中介者模式

    这篇文章主要介绍了Java设计模式编程中的中介者模式,文中举了典型的同事类与中介者类的例子来解释说明,需要的朋友可以参考下
    2016-02-02
  • 一篇文章带你入门java集合

    一篇文章带你入门java集合

    Java的集合类型都是对java.util包中Collection接口的继承,这里我们主要介绍依赖于collection的一些主分支,一起来看一下Java中的collection集合类型总结
    2021-08-08
  • spring mvc 组合mybatis框架实例详解

    spring mvc 组合mybatis框架实例详解

    本项目采用 maven 结构,主要演示了 spring mvc + mybatis,controller 获取数据后以json 格式返回数据。对spring mvc 组合mybatis的方法感兴趣的朋友可以参考下本文
    2018-01-01
  • 如何使用MyBatis框架实现增删改查(CRUD)操作

    如何使用MyBatis框架实现增删改查(CRUD)操作

    本文主要介绍了如何使用MyBatis框架实现增删改查(CRUD)操作。首先介绍了MyBatis框架的基本概念和使用方法,然后分别介绍了如何使用MyBatis实现增删改查操作。最后,通过一个简单的示例演示了如何使用MyBatis框架实现CRUD操作。
    2023-05-05
  • 超详细的Intellij IDEA 看源码必备技能

    超详细的Intellij IDEA 看源码必备技能

    这篇文章主要介绍了Intellij IDEA 看源码必备技能,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • java实现异步导出数据

    java实现异步导出数据

    这篇文章主要为大家详细介绍了java实现异步导出数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 基于CyclicBarrier和CountDownLatch的使用区别说明

    基于CyclicBarrier和CountDownLatch的使用区别说明

    这篇文章主要介绍了基于CyclicBarrier和CountDownLatch的使用区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论