springboot普通类中如何获取session问题
tcoding 人气:0Spring中普通类获取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"); } } })
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
加载全部内容