WEB应用程序开发(六)创建Session对象与实现界面安全退出/登录功能
WEB应用程序开发之创建Session对象与实现界面安全退出/登录功能
什么是session
Session对象是javax.servlet.http.HttpSession的实例
它在第一个JSP页面被装载时自动创建,完成会话期管理。
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
Servlet API中,定义了HttpSession接口,用来封装会话对象, HttpSession是接口,会话对象是Web容器创建的,在Servlet中使用
HttpServletRequest中的方法获得会话对象
public HttpSession getSession():获取跟当前请求相关的session,如果不存在session,就创建一个新的session对象返回
下来是展示Session实现会话机制的过程
创建Session思维图
代码方面新增两行代码,放置在之前设置好的LoginServlet对象中
//获取服务器生成的session对象
HttpSession httpSession=req.getSession();
//向session对象设置一段键值,登陆成功后将用户信息储存到一个对象的session对象中
httpSession.setAttribute("user",user);
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = null;
try {
resp.setContentType("text/html;charset=utf-8");//响应格式设置
req.setCharacterEncoding("utf-8");//设置post请求数据解码格式
String account = req.getParameter("account");
String password = req.getParameter("password");
System.out.println(account);
System.out.println(password);
LoginDao loginDao=new LoginDao();
User user= loginDao.checkLogin(account,password);
out= resp.getWriter();
if(user!=null){
//获取服务器生成的session对象
HttpSession httpSession=req.getSession();
//向session对象设置一段键值,登陆成功后将用户信息储存到一个对象的session对象中
httpSession.setAttribute("user",user);
Gson gson=new Gson();
String s=gson.toJson(user);
System.out.println(s);
out.println(s);
}else {
out.println(1);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("服务器响应异常");
}
}
}
代码测试与结果
开始进入测试阶段
1、当容器创建一个新的HttpSession对象后,即生成一个随机数,称为会话ID,并将ID值封装成一个名字为JSESSIONID的session,返回给客户端
2、调用request.getSession方法获得会话对象时,容器先从request中获取JSESSIONID值,根据JSESSIONID值查找到对应的会话对象,返回使用。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
User user=(User)session.getAttribute("user");
session.invalidate();//销毁浏览器
}
success界面只进行请求不作任何响应
<input type="button" value="测试" οnclick="test()">
function test() { $.get("login",function (res) { })}
3、如果没有获取到JSESSIONID值,认为当前的请求没有相关联的会话对象,重复步骤1
注意:利用不同的浏览器同时向网页服务器发送请求,生成出来的Session对象是不同的
Session方法
Session中还有一系列方法,可以参考使用
Session生命周期
创建方式
第一次访问Servlet时在服务器端创建
销毁方式
一. 服务器关闭
二. 长时间不调用自动销毁
会话对象是容器创建的,并保存在容器中,如果客户端连接到服务器后,却置之不理,不做任何操作,那么容器维护这些会话对象将占用很多资源。因此,容器都会在默认时间内销毁会话对象,多数容器默认30分钟销毁会话对象,可以通过以下两种方式进行更改销毁时间
1. 可以在web.xml中进行配置,修改默认时间。例如,修改为50分钟销毁。
<session-config>
<session-timeout>50</session-timeout>
</session-config>
2.可以利用上面的方法
SetMaxInactiveInterval (int interval )设置session的最大非活动时间,以秒为单位,超时将被销毁。
三. 调用invalidate()方法 销毁session
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();//销毁浏览器
}
安全退出
我们来利用销毁清除留在服务器上的Session信息达到安全退出的目的
Session对象已经被销毁了无法找到之前id
function exit() {
if(confirm("您确定要退出吗")){
//删除前端用户信息
window.sessionStorage.removeItem("user");
$.get("login",function (res) {
location.assign("login.html")
})
}
}
<input type="button" value="安全退出" onclick="exit()">
我们也可以利用此方法实现安全登录的目的
$(function () {
var str=window.sessionStorage.getItem("user");
//前端判断用户是否登录
if(str==null){
location.replace("login.html");
}
var user=$.parseJSON(str);
$("#accountId").html(user.account);
})
如果没有登录想要通过链接地址的方式强制进入,界面就会进行闪退,退回事先设置好的Login.html登录界面