在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
服务器是如何实现一个session为一个用户浏览器服务的?
服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。可以用如下的代码证明:
这里我们通过两个不同的浏览器登录将session数据展示在页面上来证实
前端登录页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<h1>用户登录</h1>
用户名:<input type="text" id="userName"/>
密码:<input type="text" id="password" />
<input type="button" value="登录" onclick="get()"/>
</body>
<script>
function get(){
var url = "http://localhost:8080/BuyechengServlet/LoginServlet";
data = {
"userName":$("#userName").val(),
"password":$("#password").val()
}
$.ajax({
type: "get",//指定提交的类型,get对应doget(),post对应dopost()
url: url,
data:data,//data代表key -value类型的数据
dataType:'JSON',
success: function (data)//success、error代表是否返回成功
{
console.log(data);
if(data.message == '登陆成功'){
window.location.href = "http://localhost:8080/BuyechengServlet/ShowUser.html";
}
},
error:function (XMLHttpRequest, textStatus, errorThrown) {
alert(typeof(errorThrown));
}
});
}
</script>
</html>
//业务逻辑
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
String userNameString = request.getParameter("userName");
String passwordString = request.getParameter("password");
System.out.println(userNameString + "************"+passwordString);
String jsonString = "";
if(IsNullUtil.IsNullTrue(userNameString)) {
jsonString = "{\"code\":\"200\",\"message\":\"用户名为空\"}";
response.getWriter().append(jsonString);
return;
}else if (IsNullUtil.IsNullTrue(passwordString)) {
jsonString = "{\"code\":\"200\",\"message\":\"密码为空\"}";
response.getWriter().append(jsonString);
return;
}else {
String sqlString = "select * from student where userName = '"+userNameString+"' and password = '"+passwordString+"';";
ArrayList<String[]> arrayList = MysqlUtil.showUtil(sqlString,new String[] {"id","userName","password"});
System.out.println("arr.size()"+arrayList.size());
if(arrayList.size() == 0) {
jsonString = "{\"code\":\"200\",\"message\":\"查无此人\"}";
}else if (arrayList.size() == 1) {
jsonString = "{\"code\":\"200\",\"message\":\"登陆成功\"}";
System.out.println( arrayList.get(0)[0]+"******************");
//设置session,服务器可以为每个用户浏览器创建一个会话对象
HttpSession session = request.getSession();
session.setAttribute("userid", arrayList.get(0)[0]);
}
}
response.getWriter().append(jsonString);
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户session展示</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body onload="get()">
<h1>此页面将会把登录session打印出来</h1>
我们这里存储的session信息是数据库当中的id: <div id="show"></div>
</body>
<script>
function get(){
$.ajax({
type: "get", //指定提交的类型 get对应 doGet()方法,post--->doPost()犯法
url: "http://localhost:8080/BuyechengServlet/ShowUserServlet", //传输地址的URL
data: {}, //data代表我们的数据 key -value类型的数据
dataType:'JSON',
async : false, //success和error代表是否返回成功,既后台给前台传输数据是否成功
success: function (data)
{
console.log(data);
//将session信息显示在页面上
$("#show").empty().append(data.message);
},
error:function (XMLHttpRequest, textStatus, errorThrown) {
alert(typeof(errorThrown));
}
});
}
</script>
</html>
新建ShowUserServlet,用来获取登录时设置的session数据,并将其返回个前端页面
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
String jsonString = "";
//首先判断是否登录
if (CheckLoginUtil.check(request)) {
//获取到session值
HttpSession session = request.getSession();
String sessionMessageString = (String) session.getAttribute("userid");
jsonString = "{\"code\":\"300\",\"message\":"+sessionMessageString+"}";
}else {
jsonString = "{\"code\":\"300\",\"message\":\"未登录不能看\"}";
}
response.getWriter().append(jsonString);
判断登录的方法
public class CheckLoginUtil {
public static boolean check(HttpServletRequest request) {
HttpSession session = request.getSession();
if (session.getAttribute("userid") != null) {
return true;
}else {
return false;
}
}
}