session详解
来源:互联网 发布:linux装vim 编辑:程序博客网 时间:2024/05/21 10:03
1. 前提: 在哪个session域对象保存数据,就必须从哪个域对象取出!!!!
浏览器1:(给s1分配一个唯一的标记:s001,把s001发送给浏览器)
1)创建session对象,保存会话数据
HttpSession session = request.getSession(); --保存会话数据 s1
浏览器1 的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1)
1)得到session对象的会话数据
HttpSession session = request.getSession(); --可以取出 s1
(先关闭再打开浏览器1)新的浏览器1:(没有带s001,不能返回s1)
1)得到session对象的会话数据
HttpSession session = request.getSession(); --不可以取出s1但是会重新创建一个session即s2
浏览器2:(没有带s001,不能返回s1)
1)得到session对象的会话数据
HttpSession session = request.getSession(); --不可以取出s1但是会重新创建一个session即s3
2.原理
浏览器第一次访问服务器,服务器会在内存中开辟一个空间(session),并把session对应的ID发送给浏览器.那么下次浏览器再去访问服务器,会把sessionID 交给服务器,服务器通过sessionID 找到刚才开辟的空间.
以上就是session的原理.
1> 服务器让浏览器记住sessionID的cookie 默认过期时间是 (-1)==> 关闭浏览器 cookie就丢失 ==> cookie丢失 sessionID就丢失 ==> 找不到服务器的session
long getCreationTime() 获得创建时间
String getId() 获得sessionID
long getLastAccessedTime() 获得最后一次访问时间
int getMaxInactiveInterval() 获得session的寿命
void setMaxInactiveInterval(int interval) 设置session的过期时间
void invalidate() 让session立即失效
boolean isNew()
默认是30分钟. ==> 在tomcat的web.xml中 <session-config> 配置的.
如何修改session的过期时间?
1.修改在tomcat的web.xml中 <session-config> ==> 影响服务器中的所有项目
2.在项目的web.xml中 加入<session-config> 配置.==> 影响的是当前项目
3.通过setMaxInactiveInterval(int interval)方法设置.==> 当前操作的session
<------------------------------------------------------------------------------------------------------------------------------------------------------------------------------>
代码插入:
AutoLoginFilter中的doFilter方法代码--------->
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String uri = req.getRequestURI();
//如果请求的资源不是login.jsp,才往下执行
if (!uri.contains("/login.jsp")) {
//如果session得到了user对象,说明已经登录过或自动登录过。
//那么请求下一个资源时就不用执行自动登录了。
//用户没有登录过,我们才执行自动登录
User user = (User) req.getSession().getAttribute("user");
if (user == null) {
Cookie[] cookies = req.getCookies();
String name = "";
String password = "";
if (cookies != null) {
for (Cookie cookie : cookies) {
//从cookie中得到用户名和密码
if ("user".equals(cookie.getName())) {
String[] userInfo = cookie.getValue().split("&");
name = userInfo[0];
password = userInfo[1];
break;
}
}
}
user = new UserService().findUser(name, password);
if (user != null) {
// 如果登录成功,把用户信息存到session中(用户关闭浏览器会就找不到session了,这里用的是浏览器记住sessionID的cookie 默认过期时间)
req.getSession().setAttribute("user", user);
}
}
}
chain.doFilter(request, response);
}
<------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
LoginServlet中doGet方法:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//得到用户名和密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//为密码加密
password = MD5Utils.md5(password);
//验证用户名和密码是否正确
User user = new UserService().findUser(name, password);
if(user!=null){
Cookie cookie = new Cookie("user", user.getName() + "&" + user.getPassword());
cookie.setPath("/");
String autoLogin = request.getParameter("autoLogin");
if(autoLogin!=null){
cookie.setMaxAge(60*60*24);
}else{
cookie.setMaxAge(0);
}
//将cookie保存到客户端!!!!!
response.addCookie(cookie);
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getContextPath() + "/home.jsp");
}else{
request.setAttribute("msg", "<font color='red' size='6px'>用户名或密码不正确,请重新输入</font>");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
上面的代码中只是用到session存储user信息,sessionId的有效时间依然是浏览器的默认值即关闭浏览器sessionId值消失,而判断用户登录是否过期是通过cookie的有效时间控制的。
- Session 详解
- Session 详解
- Session 详解
- Session 详解
- Session 详解
- Session详解
- Session详解
- Session详解
- Session详解
- Session详解
- session详解
- Session详解
- session详解
- Session详解
- session详解
- Session详解
- Session详解
- Session详解
- 基于XML文件的客户端校验
- MySQL 列类型-数值型
- updates were rejected because the tip of your current branch is behind its remote counterpart
- STM32开发环境搭建和固件烧录
- poj 3624 Charm Bracelet (01背包 基础)
- session详解
- (Activity) getContext()报错
- MySQL查看修改默认编码
- Picasso之图片缓存机制<二>ListView篇
- Maven学习笔记(二)-仓库
- 合并两个单链表(单链表元素均按值非递减排列)
- UVALive 6657 -GCD XOR
- Arcgis ArcTutor数据下载
- face++运行流程和遇到的问题