当前位置:主页 > java教程 > springboot普通类获取session

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

发布:2023-03-06 08:30:01 59


我们帮大家精选了相关的编程文章,网友衡晓瑶根据主题投稿了本篇教程内容,涉及到springboot普通类、springboot普通类获取session、springboot、session、springboot普通类获取session相关内容,已被980网友关注,下面的电子资料对本篇知识点有更加详尽的解释。

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可以同时处理多少请求流程分析

    发布:2023-03-22

    SpringBoot默认的内嵌容器是Tomcat,也就是我们的程序实际上是运行在Tomcat里的,所以与其说SpringBoot可以处理多少请求,到不如说Tomcat可以处理多少请求,这篇文章主要介绍了SpringBoot可以同时处理多少请求,需要的朋友可以参考下


  • SpringBoot实现前后端分离国际化的示例详解

    发布:2023-03-28

    Springboot国际化可以帮助使用者在不同语言环境中构建应用程序,这样应用程序可以有效地适应不同语言文化背景下的用户需求。本文主要介绍了SpringBoot实现前后端分离国际化的方法,需要的可以参考一下


  • 用SpringBoot框架来接收multipart/form-data文件方式

    发布:2023-03-21

    这篇文章主要介绍了用SpringBoot框架来接收multipart/form-data文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • SpringBoot2.0 ZipKin实例及代码讲解

    发布:2021-05-26

    这篇文章主要介绍了SpringBoot2.0 ZipKin示例代码,详细的介绍了什么是ZipKin以及SpringBoot2.0 ZipKin示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • springboot集成springsecurity 使用OAUTH2做权限管理的教程

    springboot集成springsecurity 使用OAUTH2做权限管理的教程

    发布:2022-07-07

    给大家整理一篇关于springboot的教程,这篇文章主要介绍了springboot集成springsecurity 使用OAUTH2做权限管理的教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧


  • 优化SpringBoot程序启动速度的实现

    发布:2023-03-10

    本文主要介绍了优化SpringBoot程序启动速度的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • Springboot - Fat Jar示例详解

    发布:2023-04-17

    这篇文章主要介绍了Springboot - Fat Jar详解,Spring Boot内嵌容器,通过java -jar命令便可以直接启动应用,今天带着大家探索FAT JAR启动的背后原理,需要的朋友可以参考下


  • SpringBoot外部化配置示例解析

    发布:2023-03-29

    这篇文章主要介绍了SpringBoot外部化配置示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


网友讨论