会话

也叫会话,由于服务器⽆法识别每⼀次 HTTP 请求的出处(也就是不知道来自于哪个终端),它只会接受到⼀个请求信号,所以就存在⼀个问题:万一浏览器将用户的响应发送给了其他的⼈,出现数据错误,所以这时候必须有⼀种技术来让服务器知道请求来自哪里,这就是会话技术。

会话:就是客户端和服务器之间发⽣的⼀系列连续的请求和响应的过程,打开浏览器操作到关闭浏览器的过程。

会话状态:指服务器和浏览器在会话过程中产生的状态信息,借助于会话状态,服务器能够把属于同⼀次会话的⼀系列请求和响应关联起来。

实现会话有两种方式:

  • session
  • cookie

Session

属于同⼀次会话的请求都有⼀个相同的标识符:sessionID

我们到JSP中去测试一下,新建一个jsp页面,就叫sessiontest.jsp吧

    <body>
        <%
            String id = session.getId();
        %>
        <%=id%>
    </body>

访问该页面,可以看到获取到了ID,我们新建一个页面,再次访问,会发现ID是一样的。

当我们关闭浏览器后重新打开并访问,会发现此时ID就已经不同啦。这就很好的解释了上面说到的会话,客户端和服务器之间发⽣的⼀系列连续的请求和响应的过程,打开浏览器操作到关闭浏览器的过程。

常用的方法

  • 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路径下进行验证

        <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转发给下一个页面。

@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,

    <body>
        欢迎回来,亲爱的<%=session.getAttribute("username")%><br>
        <a href="loginout">退出登录</a>
    </body>

我们再去写一个loginout路径的Servlet类,让session失效即可实现退出登录功能。

@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 {

    }
}


Last modification:April 15, 2021
如果觉得我的文章对你有用,请随意赞赏