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的原理.


3.session细节问题

1> 服务器让浏览器记住sessionID的cookie 默认过期时间是 (-1)==> 关闭浏览器 cookie就丢失 ==>  cookie丢失 sessionID就丢失 ==> 找不到服务器的session 


2> session中除了 4个操作 map的方法之外,还有哪些方法.
long getCreationTime()   获得创建时间
String getId()    获得sessionID
long getLastAccessedTime()   获得最后一次访问时间
int  getMaxInactiveInterval()  获得session的寿命
void setMaxInactiveInterval(int interval)   设置session的过期时间 
void invalidate()   让session立即失效

boolean isNew()  


3> 关于设置session的最大有效时间
默认是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的有效时间控制的。

1 0
原创粉丝点击