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对象,通 ...
随机推荐
- linux命令补全工具
一:下载bash-competion工具 https://files.cnblogs.com/files/zgngg/bash-completion.zip 二:解压 unzip bash-comp ...
- Python GUI文本编辑器
使用Python编写一个简单的文本编辑器,需要展示一个用户界面,功能包括打开.保存文本文件. 使用tkinter库来编写GUI. #简单GUI文本编辑器 from tkinter import * f ...
- ckeditor图片上传二三事
最近实验室要用ckeditor,踩了几个小坑记录下. 1.出现iframe跨域问题 response.setHeader("X-Frame-Options", "SAME ...
- ubuntu与xshell连接不起来:
- fstream文件打开模式
fstream:对于文件的操作很久两年前就开始使用了,但是仅仅为了达到满足自己需求的目的,就是要么是写,要么是读.从来没有对其进行详细的了解.自己也曾经想过花一点时间去总结一下,这个东西到底应该怎么用 ...
- wc,sort,uniq,awk,grep
wc awk, sort, uniq grep
- mysql导出某张表的部分数据
.使用into outfile '保存到操作系统的外部文件路径' mysql -uroot -p123456 -hhostname -P3306 select column_name_list fro ...
- mysql报错:You must reset your password using ALTER USER statement before executing this statement.
新安装mysql后,登录后,执行任何命令都会报错: You must reset your password using ALTER USER statement before executing t ...
- 19-10-26-F
ZJ一下: T1码了暴力但是并没有开出来身高的神奇性质…… T2打模拟,但是只摸了卅分 T3不会,码了一个测试点分治.10分 TJ一下: T1. 发现身高范围在$[140,200]$时,直接去重跑$\ ...
- 装配SpringBean(六)--配置文件加载方式
spring中的配置文件有两种: 以XML结尾的spring配置文件 以properties结尾的属性配置文件 在spring中有两种方式加载这两种文件: 通过注解+java配置的方式 通过XML的方 ...