一、Servlet

Servlet 的全称是Java Servlet ,是用java编写的服务端程序。其主要功能在与交互式地浏览和修改数据,生成动态的web内容。狭义的servlet是指java语言实现的一个接口,广义的servlet是指任何实现了这个servlet接口的类,一般情况下,人们理解为后者。

Servlet是BS端通信的纽带,连接BS端的会话,所有又称Servlet为中间件。

问题来了,什么是会话?

举个栗子:

打开浏览器--->输入www.baidu.com(发送请求)--->搜索新闻(返回结果给浏览器)--->重复发送、返回--->直至阅读结束关闭浏览器(会话结束)


二、Cookie

Cookie中文译文是饼干的意思,cookie是保存会话数据的一种技术,其容量有限;有生命周期,根据需求设置cookie有效期如果不进行设置的话,数据保存至浏览器关闭。它保存在浏览器的缓存中,数据是明文显示的通常只保存非敏感信息,未加密的数据会充分暴露给外界。Cookie通常是保存用户偏好设置、用户名、日期时间等数据。

Cookie从何而来?

1、浏览器向服务器发送请求

2、服务器接收请求,生成一个cookie对象保存"标识"数据

3、然后把cookie对象放在响应头,一并发回浏览器

4、浏览器取出cookie对象的数据保存在浏览器的缓存中

5、再次访问时请求头携带cookie数据发送到服务器

6、服务器根据cookie的数据作出相应处理


举个栗子:

模拟一个登陆界面访问服务端,服务端通过servlet 将登陆界面提交的表单数据保存在cookie中返回给浏览器


***************************************************************************************************************************************************

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="ServletCookies" method="post">
		<input type="text" name="username" /> <input type="password"
			name="password" /> <input type="submit" value="提交" />
	</form>
</body>
</html>

***************************************************************************************************************************************************

index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Hello,this is an index page.
</body>
</html>

ServletCookie:表单是以post形式提交,所以在doPost()中处理客户端的请求。

业务逻辑主要包括:

1、接收来自客户端的信息

2、保存在cookie对象中

3、添加到cookie到resopnse中

4、页面转发到index页面的同时将cookie一并返回给浏览器

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ServletCookies
 */
@WebServlet("/ServletCookies")
public class ServletCookie extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public ServletCookie() {
        // 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);
		//获取表单提交的username&password
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		//定义一个名为username,值为Tom的cookie
		Cookie cookie = new Cookie(username, password);
		//指定客户端返回的cookie路径
		cookie.setPath("");
		cookie.setComment("This is an Cookie");
		response.addCookie(cookie);
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}

}

启动Tomcat打开login.jsp:表单未提交前Request Header请求头为空


***************************************************************************************************************************************************

输入用户名,密码点击【提交】servlet 接收到请求头信息,将用户名密码存储在cookie中,servlet 将index页面和cookie一并返回给浏览器:


弹指一挥间,点击Application--->Cookies--->看到浏览器已经接收到来自服务器的Cooike了

cookie的应用场景通常是使用在“记住登陆状态”,即一次访问成功,在一定时间内可自动登陆,

实现细节:比如登陆京东网站,首次登陆需要账号密码,登陆成功后手误关闭了浏览器,再次登陆京东时发现登陆状态还在,无需重输账号密码。

即从login页面再次跳转到index页面时,servlet取出cookie的数据做匹配,配对成功则将【请求转发】给index页面,跳转成功。

cookie包含密码等敏感信息是非常危险的,所以就有了cookie加密,当自动登陆时cookie会以正确的算法、加密机制来解密,最后完成登陆操作。


三、Session

Session存在于服务端对客户端不可见,而cookie存在客户端,sessionId要依赖cookie进行转发。

当第一次打开浏览器时,浏览器马上分配了一个sessionId给客户端,客户端发送请求给服务端时就,服务端记录此sessionId在本地,

当客户端再次请求服务端时,它就是根据先前有效的sessionId做出相应的操作。每次客户端发来请求时,服务端根据cookie携带的sessionId来区分是哪个用户的会话。


实例:

项目结构:


***************************************************************************************************************************************************

User类:

/**
 * 映射Form表单的username、password
 * @author Administrator
 *
 */
public class User {
	private String username ="";
	private String password ="";
	
	public User(String username,String password){
		this.username = username;
		this.password = password;
	}
	public void setUsername(String username){
		this.username = username;
	}
	public String getUsername(){
		return username;
	}
	
	public void setPassword(String password){
		this.password = password;
	}
	
	public String getPassword(){
		return password;
	}
	
}


ServletSession:

业务逻辑:

1、获取表单提交的数据

2、保存在User实体类中,获取当前登陆时间

3、session储存User对象、登陆时间

4、请求转发给index.jsp

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

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 ServletCookies
 */
@WebServlet("/ServletSession")
public class ServletSession extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public ServletSession() {
        // 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 {

		String username = request.getParameter("username");
		String password = request.getParameter("password");
		User user = new User(username, password);
		
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateTime = dateFormat.format(new Date());
		//new 一个session来保存user、dateTime对象
		HttpSession	session = request.getSession();
		session.setAttribute("user", user);
		session.setAttribute("loginTime", dateTime);
		session.setAttribute("sessionId", session.getId());
		//请求转发
		request.getRequestDispatcher("index.jsp").forward(request, response);
		
	}

}


login.jsp:在body中添加一个Form表单,以post方式提交,

【action=“ServletSession”】:将Form表单的数据提交到ServletSession处理,action属性值的指定根据setvlet文件内容来指定:否则会报错。


<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="ServletSession" method="post">
		<input type="text" name="username"/> 
		<input type="password" name="password" /> 
		<input type="submit" value="提交" />
	</form>
</body>
</html>

index.jsp:

以下一段代码表示引入Java代码:

 <jsp:directive.page import="com.User"/>
    <%User user = (User)session.getAttribute("user");
     	String dateTime = (String)session.getAttribute("loginTime");
     	String sessionId = (String)session.getAttribute("sessionId");
     %>

完整代码如下所示:

<%@page import="java.text.DateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <jsp:directive.page import="com.User"/>
    <%User user = (User)session.getAttribute("user");
     	String dateTime = (String)session.getAttribute("loginTime");
     	String sessionId = (String)session.getAttribute("sessionId");
     %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello,this is an index page.<p>
用户名:<%=user.getUsername()%><p>
密码:<%=user.getPassword()%><p>
登陆时间:<%=dateTime %><p>
SessionId:<%=sessionId %><p>
</body>
</html>

***************************************************************************************************************************************************

表单未提交前,可见sessionId=【7C8DBBB8C2BD775095D52F1AF9823C3F



表单提交并成功跳转到index页面:



此时服务端已经获取到了这个客户端的会话sessionId,当客户端再次请求服务器的时候,

服务器去匹配sessionId是否跟上一次接收到的sessionId一致,然后再做下一步的具体操作。

Session是通过唯一标识sessionId来跟踪会话的。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐