您的位置:首页 > 其它

Servlet+Cookie+Session实例讲解

2017-02-18 21:20 411 查看
一、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来跟踪会话的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: