目录
session对象
1.概念
session在网络中被称为会话。
由于HTTP协议(超文本传输协议)是一种无状态协议,也就是当一个客户向服务器发出请求,服务器接收请求,并返回响应后,该连接就结束了,而服务器并不保存相关的信息。
为了弥补这一缺点,HTTP协议提供了Session。通过Session可以在应用程序的WEB页面间进行跳转时,保存用户的状态,使整个用户会话一直存在下去,直到关闭浏览器。
但是,如果在一个会话中,客户端长时间不向服务端发出请求,Session对象就会自动消失。这个时间取决于服务器,例如,Tomcat服务器默认为30分钟。不过这个时间可以通过编写程序进行修改。
实际上,一次会话的过程也可以理解为一个打电话的过程。通话从拿起电话或手机拨号开始,一直到挂断电话结束,在这个过程中,可以与对方聊很多话题,甚至重复的话题。一个会话也是这样,可以重复访问相同的Web页。
Session就是会话(客户端的一次请求,服务端的一次响应)。
Session用于跟踪客户的状态。
Session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。
在一个Session中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。
2.Session的运行机制
当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态的信息(例如购物车)。
Servlet容器为HttpSession分配一个唯一标识符,称为Session ID。
Servlet容器把Session ID作为Cookie保存在客户的浏览器中。
每次客户发出HTTP请求时,Servlet容器可以从HttpServletRequest对象中读取Session ID,然后根据Session ID找到相应的HttpSession对象,从而获取客户的状态信息。
3.Session对象的生命周期
Session对象的生命周期:创建 --> 使用 --> 消亡
3.1 创建
当客户端浏览器第一次访问服务器时,服务器为这个浏览器创建一个Session对象。
在服务器端使用request.getSession()或request.getSession(true)方法来获得Session对象。
request.getSession() --获得Session对象
session.getId() --获得session对象的ID例:HttpSession sess=request.getSession(); //获取Session对象
3.2 使用创建Session对象后,使用Session对象进行数据的存取和传输。
session.setAttribute(String name, Object obj) --将信息保存在session范围内
session.getAttribute(String name) --获取保存在session范围内的信息
session.getAttributeNames(); --返回Session对象中存储的每一个属性对象,枚举型
session.isNew() --判断session对象是不是新的具体过程:
a. 将产生的sessionID存入到Cookie中;
b. 当客户端再次发送请求时,会将sessionID和request一起传送给服务器端;
c. 服务器根据请求过来的SessionID与保存在服务端的Session对应起来,判断是否为同一个Session。
注意:getAttribute()方法返回的是Object对象,如果将获取的信息赋值给String类型的变量,则需要进行强制类型转换或调用其toString()方法,例如,下面的两行代码都是正确的。
String user = (String)session.getAttribute("username");
String user1 = session.getAttribute("username").toString();3.3 消亡
以下3种方法可以结束session对象:
a. 关闭浏览器;
b. 请用HttpSession的invalidate()方法;
c. session超时。
4.设置页面是否使用Session管理会话<%@page session="false"%> //表示该JSP页面的Session不可用,默认是true
sess.setAttribute("username","Join");
sess.getAttribute("username");
方法:
getCreationTime(); //返回Session被创建的时间.单位毫秒
invalidate(); //设置session无效,一般用在[安全退出]
removeAttribute("key"); //删除属性
5. 设置Session对象的有效期
a. 调用setMaxInactiveInterval(long n)进行设定;
b. 在web.xml中修改:
<session-config>
<!-- 会话超时间长为30分钟 -->
<session-timeout>30</session-timeout>
</session-config>
6. HttpSession与URL重写
URL重写是用在客户端不支持Cookie的情况下,它的实现方式是将Session ID添加到URL中,服务器通过解析重写后的URL获取Session ID,这样即使客户端不支持Cookie,也可以用Session来记录状态信息。
response.encodeURL("login.jsp");
或者
response.sendRedirect(response.encodeRedirectURL("login.jsp"));
两种方法效果一样,如果客户端支持Cookie,则生成的URL不变;如果不支持,生成的URL中会带有“login.jsp;jession=……?username=join”字符串的地址。response.sendRedirect("a.jsp");
7. Session对象的判断
在登录后的JSP页面文件中,通过Session来做是否已登录的判断。
String username=session.getAttribute("username");
if(username==null){
response.sendRedirect("login.jsp");
}
cookie对象
1.概念
Cookie的中文意思是“小甜饼”,然而在互联网上的意思与这就完全不同了。它和食品完全没有关系。
在互联网中,Cookie是小段的文本信息,在网络服务器上生成,并发送给浏览器。通过使用cookie可以标识用户身份,记录用户名和密码,跟踪重复用户等。浏览器将cookie以key/value的形式保存到客户机的某个指定目录中。
通过cookie的getCookie()方法即可获取到所有cookie对象的集合;
通过cookie对象的getName()方法可以获取到指定名称的cookie;
通过getValue()方法即可获取到cookie对象的值。
另外,将一个cookie对象发送到客户端,使用response对象的addCookie()方法。
注意:在使用cookie时,应保证客户机上允许使用cookie。这可以通过在IE浏览器中选择“工具”/“Internet选项”命令,在打开对话框的“隐私”选项卡中进行设置。(可以理解客户通过浏览访问服务器时,服务器利用浏览器在客户端上生成了一个文本,该文本用来存储用户的系列信息。)
2.查看网站的cookie
地址栏输入javascript:alert (document. cookie)
cookie所在的位置:C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies
3.Cookie的作用
a. 对特定对象的追踪;
b. 统计网页浏览次数;
c. 简化登录。
4.安全性能
容易信息泄露。
--文本,可破解,安全性不高
--Cookie具备加密
5.Cookie使用
5.1 通过page指令导入包(可省略)
<%@ page import="javax.servlet.http.Cookie" %>
5.2 创建
Cookie newCookie=new Cookie("key",value);
5.3 写入(将Cookie响应到客户端)
response.addCookie(newCookie)
提示:
a. 在创建Cookie后,如未设置Cookie有效期,则该Cookie只保存在浏览上,当浏览重启后,之前设置的Cookie就不在了,如这时用getCookies()方法取就是null,因此会报NullPointerException异常。临时Cookie----保存在浏览器上的Cookie。它随着浏览器的关闭而消失。
要想Cookie真正保存在客户端上,就必须设置Cookie的保存时间。b. Internet临时文件设置,如勾上,则会清掉cookie。
5.4 关于Cookie的删除<别人跑你家里来抢垃圾桶>
Cookie是保存在客户端电脑上的文件,如果服务器可以直接通过代码来清除客户端上的文件,那将是个非常可怕的事情,因为客户端已经变成“肉鸡”了。
所以,客户端的Cookie不能由服务器代码来删,而是客户端自己删。Cookie不能通过代码删,但可以通过代码设置它无效:即设置它的有效时间。
<% Cookie[] cooks=request.getCookies() if(cooks!=null){ for(Cookie c:cooks){ if(c.getName().equals("uname")){ c.setMaxAge(0); //设置Cookie有效期0秒 response.addCookie(c); } } } response.sendRedirect("/login.jsp"); %>
6.Cookie常用方法
void setMaxAge(int e) //设置Cookie有效期,单位秒,正数为多少秒后失效
负数表示当浏览器关闭时,Cookie将会被删除(争议)。
int getMaxAge() //获取Cookie有的效时间,单位秒
void setValue(String value) //在Cookie创建后,对Cookie进行赋值
String getValue() //获取Cookie的值
String getName() //获取Cookie的名称
Cookie[] getCookies() //获取Cookie中所有的属性名
实现七天免登录
登录界面login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Document</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
<style>
* {
outline: none !important;
}
html,
body {
background: #1abe9c;
}
form {
width: 300px;
background: #ebeff2;
box-shadow: 0px 0px 50px rgba(0, 0, 0, .5);
border-radius: 5px;
padding: 20px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.btn-group {
width: 100%;
}
.btn-group button {
width: 50%;
}
</style>
<%
String yh="";
String mm="";
//request.getCookies();//拿到Cookie数组
//为了防止前端没有Cookie而报的空指针:
if(request.getCookies()!=null)
//遍历
for(Cookie cookie : request.getCookies()){
//拿出用户名,密码的COOKIE:如果Cookies的数据名和输入框的一致就赋值
if(cookie.getName().equals("yh")){
yh=cookie.getValue();
}
if(cookie.getName().equals("mm")){
mm=cookie.getValue();
}
}
%>
</head>
<body>
<form action="doLogin.jsp" method="post" id="myForm">
<h3 class="text-center">欢迎使用新闻管理</h3>
<div class="form-group">
<!--将得到的名字密码自动填入输入框:value-->
<input value=<%=yh %> name="yh" type="text" class="form-control" id="username" placeholder="请输入您的用户名">
</div>
<div class="form-group">
<!--将得到的名字密码自动填入输入框:value-->
<input value=<%=mm %> name="mm" type="password" class="form-control" id="password" placeholder="请输入您的密码">
</div>
<div class="btn-group">
<button type="submit" class="btn btn-primary">登录</button>
<button type="button" class="btn btn-danger" onclick='location=href="register.jsp"'>没有账号?</button>
</div>
</form>
<script>
&("myForm").submit(()=>{
if($("#username").val().length==0){
alert("用户名不能为null")
return false //不提交的
}
if($("#password").val().length==0){
alert("密码不能为null")
return false //不提交的
}
return true
})
</script>
</body></html>
处理登录界面 doLogin.jsp
<%@page import="javax.servlet.http.Cookie"%>
<%@page import="java.net.CookieHandler"%>
<%@page import="oracle.jdbc.driver.OracleDriver" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.nio.charset.StandardCharsets" %>
<%@ page import="java.util.Arrays" %>
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%
request.setCharacterEncoding("utf-8");
String yh = request.getParameter("yh");
String mm = request.getParameter("mm");
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//定义连接字符串
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
//获得连接
Connection con = DriverManager.getConnection(url, "scott", "123");
//获得执行对象
PreparedStatement ps = con.prepareStatement("select * from t1_user where t_name=? and t_pwd=?");
ps.setString(1, yh);
ps.setString(2, mm);
//获得结果集
ResultSet rs = ps.executeQuery();
//判断结果
if (rs.next()) {
//1,将用户名存入到服务器的卡库session中/存到后端
//session.setAttribute("uname", yh);//在卡库中开一个空间储存数据session.setAttribute("数据名", 数据值);(红色圈)
//2,cookie的值每次发送请求的时候会被自动带上,不会在路径上传递数据
//cookie默认是在你当前浏览器打开的过程中生生效,浏览器不关,Cookie就不会消失
Cookie c=new Cookie("yh",yh);//导包:javaX
//设置前端数据的存活时间,单位:秒,填-1代表浏览器一打开就生效
//60s*60*24h*7day:7天
c.setMaxAge(60*60*24*7);
Cookie c1=new Cookie("mm",mm);
c1.setMaxAge(60*60*24*7);
//将c,c1存到前端:
//response:响应对象:服务器->客户端
response.addCookie(c);//响应中有两个Cookie,将yh,mm存入前端
response.addCookie(c1);
//7天免登录见登录界面:
// localhost:8080/当前项目/news/index.jsp
//转发:request.getRequestDispatcher("index.jsp").forward(request, response);
//重定向:
response.sendRedirect("index.jsp");//所以主界面要在卡库中拿数据
} else {
//重定向 客户端
response.sendRedirect("login.jsp");
}
//资源关闭
if (!con.isClosed()) {
con.close();
}
ps.close();
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
历史记录查询 history.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>
<%@ page import="java.net.URLDecoder" %>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Document</title>
<meta content="width=device-width, initial-scale=1" name="viewport">
<link href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css" rel="stylesheet">
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
</head>
<body>
<nav class="navbar navbar-default hidden-sm hidden-xs">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" style="font-size: 25px;">当前是您的浏览记录</a>
</div>
<ul class="nav navbar-nav navbar-right" style="margin-right: 20px;">
<li><a href="${pageContext.request.contextPath}/news/index.jsp">返回首页</a></li>
</ul>
</div>
</nav>
<div class="container">
<ul class="list-group">
<%
//7天历史记录:从cookie中取历史记录
String ls="";
for (Cookie cookie : request.getCookies()) {//浏览器向服务器发送request时会自动发送Cookies数据
if(cookie.getName().equals("historyList")){
ls= URLDecoder.decode(cookie.getValue(),"utf-8");//在历史记录中解码改为中文
}
}
System.out.println(ls);
//session:7天历史记录
//从session中拿历史记录的信息
Object obj = session.getAttribute("historyList");
if(obj!=null){//当存在历史记录时再转成集合
List<String> historyList=(List<String>)obj;
for (int i=historyList.size()-1;i>=0;i--) { //用fro循环倒着来
//System.out.println(historyList.get(i));
String[] ss=historyList.get(i).split("@");//title@count根据@切割
//切割报错在前面打印
%>
<li class="list-group-item">
<!--切割后的集合变数组,第1位是count,第0位:title-->
<span class="badge"><%=ss[1]%></span>
<%=ss[0]%>
</li>
<%
}
}
%>
</ul>
</div>
</body>
</html>
你要尽全力保护你的梦想。那些嘲笑你梦想的人,他们注定失败,他们想把你变成和他们一样。我坚信,只要心中有梦想,我就会与众不同。你也是。