开发者

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

开发者 https://www.devze.com 2023-01-13 10:36 出处:网络 作者: tcoding
目录Spring中普通类获取session项目中日志功能解决方案SpringBoot中使用session基础知识在 Spring Boot中使用总结Spring中普通类获取session
目录
  • Spring中普通类获取session
    • 项目中日志功能
    • 解决方案
  • SpringBoot中使用session
    • 基础知识
    • 在 Spring Boot中使用
  • 总结

    Spring中普通类获取session

    项目中日志功能

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

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

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

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

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

    解决方案

    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,当创建一个 sess开发者_Go入门ion 后,会将该 sessionID 存放到此次访问的 cookie 中,当下次客户端的访问到来需要提取服务器中的 session时,会根据访问中 cookie 里的 sessionID 值来找到服务器中的具体 session。
    • 访问静态资源时不会创建 session
    • 服务器会把长时间没有活动的 session 从服务器内存中清除,此时 session 便失效。Tomcat 中 session的默认失效时间为 20分钟
    • Tomcat 7以上的版本中默认禁止客户端脚本读取session Id,需要在context.XML中设置useHttpOnly=”false”,开启权限。

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

    在 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,
                 HttpServletRpythonequest request,
                 HttpServletResponse response
                 ) {
    
       ModeAndView view = new ModeAndView();
       //... view 操作
       Cookie[] cookies = request.getCookies();
    javascript   String sessionId = request.getSession().getId();
       if (cookies == null) {
         Coohttp://www.devze.comkie 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

    精彩评论

    暂无评论...
    验证码 换一张
    取 消