前言:
这次我们了解下什么是session,其实session也不难理解,这里我们很简单的理解下,这是看前点个赞,养成好习惯👍
书接上回:
【JavaWeb】-Tomcat、Eclipse使用项目搭建(一)
【JavaWeb】-mysql、jdbc、dbcp使用(二)
【JavaWeb】-MVC、Servlet学习(三)
【JavaWeb】-Cookie、Session学习(四)
- Cookie的使用
HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
我们刚才已经看到了其实,我们访问一个网站其实每次都会发出一个会话也就是session,都会有一个sessionid,我们可以通过session将登录信息存储在服务端;
我们还是通过之前的方法,但是这次我们不使用cookie使用session;
// 当参数为空或者true时,获得session,若没有则新建;当参数为false时,获得session,若没有也不会新建
HttpSession session = request.getSession(true); 默认是ture
修改后的MyLoginServlet.java:
package servlet;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
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;
import com.mysql.cj.Session;
/**
* Servlet implementation class MyLoginServlet
*/
@WebServlet("/MyLoginServlet")
public class MyLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyLoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*//String name = ;
String pass = request.getParameter("password");
//这里可以通过URLEncoder编码
Cookie name = new Cookie("name", URLEncoder.encode(request.getParameter("username"), "UTF-8"));
Cookie passCookie = new Cookie("pass", pass);
//设置时间24小时
name.setMaxAge(60*60*24);
passCookie.setMaxAge(60*60*24);
response.addCookie(name);
response.addCookie(passCookie);
response.sendRedirect("index.jsp");
//request.getRequestDispatcher("ToIndexServlet").forward(request, response);
*/
//获取数据并存入session
HttpSession session = request.getSession(false);
session.setAttribute("name", request.getParameter("username"));
session.setAttribute("pass", request.getParameter("password"));
//设置sesion过期时间,默认一次会话结束,也就是浏览器关闭,设置24小时
session.setMaxInactiveInterval(60*60*24);
Cookie login = new Cookie("JSESSIONID", session.getId());
login.setMaxAge(60*60*60);
response.addCookie(login);
response.sendRedirect("index.jsp");
}
/**
* @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);
}
}
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
主界面
<%
/* Cookie[] cookies = request.getCookies();
if (cookies != null) {
// 我们可以遍历下我们的cooike看看
for (Cookie cookie : cookies) {
out.println(cookie.getName() + "
");
out.println(cookie.getValue() + "
");
out.println("==============
");
}
} */
out.print(session.getAttribute("name")+"
");
out.print(session.getAttribute("pass")+"
");
%>
这里是主界面
这时候我们登录访问,登录上去之后,通过cookie报错下来JSESSIONID,这样我们将信息存储在session,用户只拥有一个session这样我们可以更好的保证安全性;
我们发现登录上之后sessionid就被存入到cookie,这样我们再访只需要携带sessionid交给后端,后端通过sessionid拿到session就可以拿到存储在session中的信息,这样就把东西都交给了后端,安全性就得到了提高;
我们看下session常用方法,来自菜鸟教程:
序号 | 方法 & 描述 |
---|---|
1 | public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。 |
2 | public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。 |
3 | public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
4 | public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。 |
5 | public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
6 | public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。 |
7 | public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。 |
8 | public boolean isNew() 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。 |
9 | public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。 |
10 | public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。 |
11 | public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
这里我们session跟踪使用的是cookie,session跟踪有三种方式,如果浏览器禁用了cookie呢
隐藏表单我们还可以使用:隐藏的表单字段、URL重写,但是都有相应的问题
<input type="hidden" name="jssesionid" value="7D8449A7EF434DE66DED63227E02AC1E">
表单提交问题;
url重写这个是浏览器禁用cookie之后比较常用的:
例如,http://w3cschool.cc/file.htm;sessionid=12345;,session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端。
HttpServletResponse接口定义了两个用于URL重写的方法:
encodeURL方法,用于超链接和form表单的action属性中设置的URL进行重写
encodeRedirectURL 方法 用于对传递给HttpServletResponse.sendRedirect方法的URL进行重写
其实就是在末尾给你拼接了sessionid,我们访问的时候只要服务端没有清除会话也就是session这样我们通过这样的形势还是会被服务端识别,找到session就可以找到信息:
说完session的使用之后,那我们发现,用户不用存储任何东西,我们都session数据存储在服务器端,一个用户那不用说,但是上万个用户呢,这样我们的服务器肯定是很耗费资源的,单独拿出一台服务器存储session挂了怎么办,我们又不愿意浪费服务器怎么办;下面我们就可以提到token;
占位符 {token的使用}
看到这里了,赶紧三连留个关注吧,不然后面的跟前面的都找不到了,感谢支持!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)