会话
也叫会话,由于服务器⽆法识别每⼀次 HTTP 请求的出处(也就是不知道来自于哪个终端),它只会接受到⼀个请求信号,所以就存在⼀个问题:万一浏览器将用户的响应发送给了其他的⼈,出现数据错误,所以这时候必须有⼀种技术来让服务器知道请求来自哪里,这就是会话技术。
会话:就是客户端和服务器之间发⽣的⼀系列连续的请求和响应的过程,打开浏览器操作到关闭浏览器的过程。
会话状态:指服务器和浏览器在会话过程中产生的状态信息,借助于会话状态,服务器能够把属于同⼀次会话的⼀系列请求和响应关联起来。
实现会话有两种方式:
- session
- cookie
Session
属于同⼀次会话的请求都有⼀个相同的标识符:sessionID
我们到JSP中去测试一下,新建一个jsp页面,就叫sessiontest.jsp吧
代码语言:javascript复制 <body>
<%
String id = session.getId();
%>
<%=id%>
</body>
访问该页面,可以看到获取到了ID,我们新建一个页面,再次访问,会发现ID是一样的。
当我们关闭浏览器后重新打开并访问,会发现此时ID就已经不同啦。这就很好的解释了上面说到的会话,客户端和服务器之间发⽣的⼀系列连续的请求和响应的过程,打开浏览器操作到关闭浏览器的过程。
session 常用的方法:
- String getId(): 获取sessionID
- void setMaxInactiveInterval(int interval): 设置 session 的失效时间,单位为秒
- int getMaxInactiveInterval(): 获取当前 session 的失效时间
- void invalidate(): 设置 session ⽴即失效
- void setAttribute(String key,Object value): 通过键值对的形式来存储数据
- Object getAttribute(String key): 通过键获取对应的数据
- void removeAttribute(String key): 通过键删除对应的数据
登录退出
我们使用session的方式来实现登录和退出功能。
首先需要一提的是,我们在写业务代码时几乎没人会写在jsp里面,也就是上一个博客的案例只是为了演示效果,实际上开发我们需要Servlet和JSP搭配使用,下面我们去看看如何操作。
首先我建一个login2.jsp和weclome.jsp,一个作为登录页面,一个作为登录成功后的页面。
我们先写login2.jsp,将用户名密码传递到login路径下进行验证
代码语言:javascript复制 <form action="login" method="post">
<table>
<tr>
<td>
用户名:
</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>
密码:
</td>
<td>
<input type="password" name="password">
</td>
</tr>
<tr>
<td>
<input type="submit" value="登录">
</td>
<td>
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
我们去写一个Servlet类,起名为Login,映射路径就为login,我们的代码应该写在doPost下,因为我们上面的表单提交的方式为post,我们获取用户名和密码,跟我们预期的进行比较,将用户名保存进session,跳转到weclome.jsp,如果验证不成功则重新回到login2.jsp
这里我们为什么不需要写什么getRequestDispatcher呢,因为我们是使用session的方式保存,不需要将request转发给下一个页面。
代码语言:javascript复制@WebServlet("/login")
public class Login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if (username.equals("admin")&&password.equals("123456")) {
HttpSession session = req.getSession();
session.setAttribute("username",username);
resp.sendRedirect("weclome2.jsp");
}else{
resp.sendRedirect("login2.jsp");
}
}
}
weclome2.jsp,
代码语言:javascript复制 <body>
欢迎回来,亲爱的<%=session.getAttribute("username")%><br>
<a href="loginout">退出登录</a>
</body>
我们再去写一个loginout路径的Servlet类,让session失效即可实现退出登录功能。
代码语言:javascript复制@WebServlet("/loginout")
public class LoginOut extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().removeAttribute("username");
req.getSession().removeAttribute("password");
resp.sendRedirect("login2.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}