ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Session

2019-09-02 20:43:49  阅读:232  来源: 互联网

标签:Session request HttpServletResponse HttpServlet session response


Session

Session概述
什么是Session
Session用于跟踪客户的状态。Session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。
在一个Session中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。
Session工作原理

session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。
session的常见实现形式是cookie(session
cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出
cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid时,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的
session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。

如何获得Session

//获取Session对象
HttpSession session=request.getSession();
System.out.println(“Id:”+session.getId());//唯一标记,
System.out.println(“getLastAccessedTime:”+session.getLastAccessedTime());//最后一次访问时间,毫秒
System.out.println(“getMaxInactiveInterval:”+session.getMaxInactiveInterval());//获取最大的空闲时间,单位秒
System.out.println(“getCreationTime:”+session.getCreationTime());//获取Session的创建,单位毫秒

如何使用Session绑定对象

使用HttpSession的setAttribute(属性名,Object)方法

如何删除Session
使用HttpSession的invalidate方法
Session超时
什么是Session超时

HttpSession的最后一程访问时间和当前时间的差距大于了指定的最大空闲时间,这时服务器就会销毁Session对象。默认的空闲时间为30分钟。

如何修改Session的缺省时间限制
1 使用HttpSession的session.setMaxInactiveInterval(20*60);设置,单位秒
2 在web.xml中配置 ,单位分钟
  <session-config>
  	<session-timeout>20</session-timeout>
  </session-config>
Session失效的几种情况
1、超过了设置的超时时间
2、主动调用了invalidate方法
3、服务器主动或异常关闭
注意:浏览器关闭并不会让Session失效
浏览器禁用Cookie的解决方案
浏览器禁用Cookie的后果

如果浏览器禁用Cookie,session还能用吗?
答:不能,但有其他的解决方案
服务器在默认情况下,会使用Cookie的方式将sessionID发送给浏览器,如果用户禁止Cookie,则sessionID不会被浏览器保存,此时,服务器可以使用如URL重写这样的方式来发送sessionID.

使用Session区分每个用户的方式:
1、使用Cookie
2、作为隐藏域嵌入HTML表单中,附加在主体的URL中,通常作为指向其他应用程序页面的链接,即URL重写。

什么是URL重写

浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即,在原来的地址后面加上了sessionID)

如何实现URL重写
如果是链接地址和表单提交,使用
response.encodeURL(String url)生成重写后的URL
如果是重定向,使用
response.encodeRedirectURL(String url)生成重写的URL
Session的典型应用
验证登录

登录的html页面:

login.html


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
<style type="text/css">
.dv_error{
color:red;
}
</style>
</head>
<body>
<form action="login" method="post">
<label>邮箱:</label><input name="email"><br/>
<label>密码:</label><input type="password" name="psw"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>

登录的成功页面:


<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功</title>
</head>
<body>
<div>
<h1>欢迎登录</h1>
<a href="exit">注销</a><br/>
<a href="login.html">登录</a><br/>
</div>
</body>
</html>

登录的Servlet:

package com.qf.web.servlet;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//doGet(request, response);
		request.setCharacterEncoding("utf-8");
		String username=request.getParameter("email");
		String pass=request.getParameter("psw");
		System.out.println(request.getRemoteAddr()+":登录:账号:"+username+"----->密码:"+pass);
		//将数据存储在Session中
		HttpSession session=request.getSession();
		System.out.println("Id:"+session.getId());//唯一标记,
		System.out.println("getLastAccessedTime:"+session.getLastAccessedTime());//最后一次访问时间,毫秒
		System.out.println("getMaxInactiveInterval:"+session.getMaxInactiveInterval());//获取最大的空闲时间,单位秒
		System.out.println("getCreationTime:"+session.getCreationTime());//获取Session的创建,单位毫秒
		//设置数据
		session.setAttribute("username", username);
		
		if(username.equals("admin")&&pass.equals("888")){
			//重定向
			response.sendRedirect("index.html");
		}else{
			
			request.getRequestDispatcher("login.html").forward(request, response);
		}
	}
}

注销登录的Servlet:

/**
 * Servlet implementation class ExitLogin
 */
@WebServlet("/exit")
public class ExitLogin extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ExitLogin() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
      //移除登录信息
		request.getSession().removeAttribute("username");
	     request.getSession().invalidate();//将当前的Sessio失效
		response.sendRedirect("login.html");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//doGet(request, response);
	}
验证码的实现

生成验证码:

/**
 * Servlet implementation class CreateCode
 * 验证码的生成
 */
@WebServlet("/createcode")
public class CreateCode extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CreateCode() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		ValidateCode vc=new ValidateCode(200, 30, 4, 10);
		String code=vc.getCode();
		System.out.println(request.getRemoteAddr()+":生成:"+code);
		//使用Session存储生成的验证码
		HttpSession session=request.getSession();
      	session.setAttribute("code",code);
		vc.write(response.getOutputStream());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

标签:Session,request,HttpServletResponse,HttpServlet,session,response
来源: https://blog.csdn.net/lalasonghhh/article/details/100370848

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有