【JavaWeb】Session快速上手,看完别说不会session了

24 篇文章 6 订阅

JavaWeb

前言:

这次我们了解下什么是session,其实session也不难理解,这里我们很简单的理解下,这是看前点个赞,养成好习惯👍

书接上回:
【JavaWeb】-Tomcat、Eclipse使用项目搭建(一)
【JavaWeb】-mysql、jdbc、dbcp使用(二)
【JavaWeb】-MVC、Servlet学习(三)
【JavaWeb】-Cookie、Session学习(四)

Session

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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>主界面</title>
</head>
<body>

	<%
		/* Cookie[] cookies = request.getCookies();

		if (cookies != null) {
			// 我们可以遍历下我们的cooike看看
			for (Cookie cookie : cookies) {
				out.println(cookie.getName() + "<br/>");
				out.println(cookie.getValue() + "<br/>");
				out.println("==============<br/>");
			}
		} */
		
		out.print(session.getAttribute("name")+"<br/>");
		out.print(session.getAttribute("pass")+"<br/>");
		
	%>



	这里是主界面
</body>
</html>

这时候我们登录访问,登录上去之后,通过cookie报错下来JSESSIONID,这样我们将信息存储在session,用户只拥有一个session这样我们可以更好的保证安全性;

在这里插入图片描述

我们发现登录上之后sessionid就被存入到cookie,这样我们再访只需要携带sessionid交给后端,后端通过sessionid拿到session就可以拿到存储在session中的信息,这样就把东西都交给了后端,安全性就得到了提高;

我们看下session常用方法,来自菜鸟教程:

序号方法 & 描述
1public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
2public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
3public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
4public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
5public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
6public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
7public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
8public boolean isNew() 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
9public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。
10public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。
11public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。

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的使用}

小结

看到这里了,赶紧三连留个关注吧,不然后面的跟前面的都找不到了,感谢支持!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值