Session学习小结
前言:
1.我们在学习一项技术的时候,首先应该是什么时候会用到这项技术。这次学习session也是如此,一般的web项目中都有用户的存在,有用户那么就有了用户的管理,而用户往往是存在于session中的。
说到session就不得不提cookie了,个人对互联网的发展不是很了解,只是简单的知道早期的网站都是使用cookie进行用户管理的。
cookie是什么呢?我们先简单的了解下。
javax.servlet.http.Cookie是servlet自带的类,所以jsp页面可以调用。下面简单的介绍下cookie的使用
Cookie cookie = new Cookie("name", "dawa");
//设置域名
cookie.setDomain(".google.com");
//设置cookie的访问路径
cookie.setPath("/server");
//设置cookie有效时间
cookie.setMaxAge(1800);
//设置cookie是否只能由安全的协议访问如https
cookie.setSecure(true);
cookie类似于工作证,浏览器每次访问web项目时,会发送对应的cookie,而发送的cookie是之前response返回的。

上图中截图的部分就是浏览器发送给服务器的一个简单的sessionId的cookie。
2.随着时代的发展,session出现了,大有取代cookie的形势,但是常规的session还是依赖cookie的存储的,存储的是session的Id值,如上面的截图中的JSESSIONID。
下面我们来说说session这个玩意。
Web项目中我们一般把用户保存在session中,为什么这样使用呢?
因为我们在Web获取session时一般简单的通过request.getSession()的方式来获取session,用户的请求与session有了直接的关联,而用户的信息放在session中就形成一对一的关系。
之前我曾简单的考虑过一个问题,我们一般在登陆的时候通过request.getSession().setAttribute(Constants.SESSION_USER_KEY, sessionUser)这样的方式来讲user存放到session中取得,此处不禁想到,
多个用户登陆设置session的时候,key不都是一样的么,那么session是如何区分的呢?
这里就要说到之前截图里的JSESSIONID,在用户登陆之后,服务器会将session的Id以cookie的方式保存到response中返回给浏览器,浏览器再次发起请求的时候就会带上之前返回的cookie,
服务器在request.getSession()会根据cookie里的sessiondId获取对应的session,所以是不会造成混乱的。
说到这里,我们大致了解了一些session的知识。
实际项目中对于session的操作一般用户login和sessionFilter中,下面贴上login和sessionFiler的简单代码:
LoginController部分代码:
@RequestMapping("/login.do")
public String loginHandler(HttpServletRequest request, HttpServletResponse response, ModelMap model){
String action = request.getParameter("action");
if("do".equals(action)){
String workno = request.getParameter("account");
String password = request.getParameter("password")==null ? "":request.getParameter("password");
if(!"".equals(workno) && !"".equals(password)){
Map<String, Object> param = new HashMap<String, Object>();
param.put("name", workno);
param.put("password", password);
User user = userService.get(param);
if(user != null){
SessionUser sessionUser = new SessionUser();
sessionUser.setWorkno(user.getId());
sessionUser.setNickName(user.getName());
System.out.println("设置session");
request.getSession().setAttribute(Constants.SESSION_USER_KEY, sessionUser);
//此处演示下cookie的使用
Cookie cookie = new Cookie("name","dawa");
response.addCookie(cookie);
return "redirect:home.do";
} else {
model.put("errMsg", "用户名或者密码错误");
return "login";
}
} else {
model.put("errMsg", "用户名或者密码不能为空");
return "login";
}
}
return "login";
}
SessionFiler部分代码:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest hsrq = (HttpServletRequest) request;
HttpServletResponse hsrp = (HttpServletResponse) response; SessionUser person = null;
String reqPage = hsrq.getServletPath().trim();
if (!reqPage.equals("/login.do") && !reqPage.equals("/login_out.do")) {
System.out.println("sesion拦截");
person = (SessionUser) hsrq.getSession().getAttribute(Constants.SESSION_USER_KEY);
if (person == null) {
hsrp.sendRedirect("login.do");
return;
}
}
chain.doFilter(request, response);
}
代码都比较简单,没什么可说的,最后补充下session的过期时间和失效方法:
Web项目的session过期时间一般设置在web.xml中
<!-- 默认的session超时时间 ,单位为分钟-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
而session的失效要调用invalidate()才能使session销毁,也只有这样才能触发HttpSessionListener的sessionDestroyed的方法,关闭浏览器只是断开了session,断开的session会在session过期后销毁。
request.getSession().invalidate();
Session学习小结的更多相关文章
- dubbo学习小结
dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- Session学习
Session学习 Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通 ...
随机推荐
- 04_jQuery对象初识(三)
<div id="d1"> <p><span>span</span></p> <div>div</di ...
- sqlserver存储过程事务回滚
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[AddUserOnChannel] ), ), @Channe ...
- 分布式配置中心(Spring Cloud Config)
真有意思的一个问题,我先把我遇到的写一次 ,今天学习Spring Cloud Config 新建了三个module ,eureka-server,config-server,config-clien ...
- 网络结构解读之inception系列一:Network in Network
网络结构解读之inception系列一:Network in Network 网上有很多的网络结构解读,之前也是看他人博客的介绍,但当自己看论文的时候,发现存在很多的细节和动机解读,而这部分能加深 ...
- Hyper-V 2016 上安装windows7激活重启后黑屏无法进入系统
激活重启后就出现下图,无法进入系统 出现此种情况是由于win7的开机引导损坏导致的,具体解决办法如下: 1.设置光盘启动 2.关闭系统重新启动进行修复 启动后按住shift+f10进行修复 输入以下命 ...
- nextjs服务端渲染原理
1. 简单的介绍一下 nextjs是react进行服务端渲染的一个工具,默认以根目录下的pages为渲染路由 比如我在pages目录下创建一个index.js文件,然后export default一个 ...
- Maven实战07_依赖
1:依赖声明 <project> ... <dependencies> <dependency> <groupId>...</groupId> ...
- Harbor任意管理员注册漏洞复现
1. 简介 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Docker Distribution. ...
- NGINX模块开发 之 验证URL參数
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/RoyalApex/article/details/26404379 作者:邹祁峰 邮箱:Qifeng ...
- 11.5 临近csp·道别
差不多到写这个东西的时候了? 嗯,按今天的日期来算的话,还有不到十天就是csp.感觉对我这种家伙来说应该算是终结了? 放在之前的话肯定会写很多东西的,不过现在大约有点不知道写什么比较合适. 所以只是祝 ...