客户端向服务器端发送请求,服务器端接受请求并生成响应返回给客户端,客户端对服务器端这样一次连续的调用过程,被称为会话(session)。
Session:记录一系列状态
Session与cookie功能效果相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。
Cookie与Session的区别
解释session:当访问服务器某个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session
原理:HTTP协议是非连接性的,取完当前浏览器的内容,然后关闭浏览器后,链接就断开了,而没有任何机制去记录取出后的信息。而当需要访问同一个网站的另外一个页面时(就好比如在第一个页面选择购买的商品后,跳转到第二个页面去进行付款)这个时候取出来的信息,就读不出来了。所以必须要有一种机制让页面知道原理页面的session内容。
Servlet 提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。
Servlet API中,定义了HttpSession接口,用来封装会话对象。
HttpSession是接口,不能直接用new创建对象,会话对象是容器创建的,使用HttpServletRequest中的方法获得会话对象。
获取当前请求的session会话对象:
HttpSession session = request.getSession();
当您完成了一个用户的 session 会话数据,您有以下几种选择:
<session-config>
<session-timeout>15</session-timeout>
</session-config>
案例:登录界面、欢迎界面、退出界面
login.jsp(登录界面)
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session</title>
</head>
<body>
<form action="login-servlet" method="post">
用户名: <input type="text" name="username">
<br />
密码: <input type="password" name="password" />
<br>
<input type="submit" value="提交" />
</form>
</body>
</html>
LoginServlet.java(登录处理)
package com.company.project.servlet;
import java.io.IOException;
import java.io.PrintWriter;
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;
import javax.servlet.http.HttpSession;
@WebServlet("/login-servlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 假设已经拿到了用户名和密码
String serverUserName = "86_god";
String serverPassword = "123456";
// 获取到客户端的数据
String username = "";
String password = "";
username = request.getParameter("username");
password = request.getParameter("password");
System.out.println(username);
System.out.println(password);
if (username != null && password != null && username.equals(serverUserName)
&& password.equals(serverPassword)) {
System.out.println("登录成功");
HttpSession session = request.getSession();
session.setAttribute("username", username);
request.getRequestDispatcher("welcome.jsp").forward(request, response);
}
else {
//获取输出流
PrintWriter out = response.getWriter();
//生成登录失败界面
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body bgcolor=\"deepskyblue\">");
out.println("<h1>登陆失败</h1>");
out.println("<p>您输入的用户名或密码不正确,请重新输入</p>");
out.println("<a href=\"login.jsp\">");
out.println("<button>重新登录</button>");
out.println("</a>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
welcome.jsp(欢迎界面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%boolean flag = false;
String username = "";
username = (String)session.getAttribute("username");
if(username != null && username !=""){
flag = true;
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>欢迎</title>
</head>
<body>
欢迎,
<%
if(flag){
%>
<%= username %>
<a href="logout-servlet">退出</a>
<%
}else{
%>
<a href="login.jsp">点击登录</a>
<%
}
%>
</body>
</html>
LogoutServlet.java
package com.company.project.servlet;
import java.io.IOException;
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;
@WebServlet("/logout-servlet")
public class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LogoutServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.invalidate();
request.getRequestDispatcher("welcome.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}