浩浩学编程JavaWeb-03Session

    科技2026-01-13  15

    Session

    目录

    Session1.session常用方法4.JSP内置对象的作用域3案例:网站的访问量统计

    1.session常用方法

    String getId() 获取 sessionID

    主要作用:完成用户会话

    服务器⽆法识别每⼀次 HTTP 请求的出处(不知道来⾃于哪个终端),它只会接受到⼀个请求信号,所以就存在⼀个问题(将⽤户的响应发送给其他⼈),必须有⼀种技术来让服务器知道请求来⾃哪,这就是会话技术。

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

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

    index.jsp

    <%String sessionId = session.getId();%> <h1>sessionId : </h1> <%=sessionId%>

    void setMaxInactiveInterval(int interval) 设置 session 的失效时间,单位为秒

    (短时间内登陆不用重复输入账号密码,7day)

    int getMaxInactiveInterval() 获取当前 session 的失效时间

    void invalidate() 设置 session ⽴即失效

    void setAttribute(String key,Object value) 通过键值对的形式来存储数据

    Object getAttribute(String key) 通过键获取对应的数据

    void removeAttribute(String key) 通过键删除对应的数据

    案例: 实现⽤户登录,如果⽤户名和密码正确,则跳转到首页并且展示⽤户名,否则重新回到登陆。登陆成功后,在浏览器不关闭的情况下,直接访问session会展示用户名(session),实现退出功能,即再次访问主页不会显示用户名。

    注: 在上一个同类型案例中,check.jsp 文件中只用到了java代码,却使用的是 .jsp 文件,并不符合开发规范,这次我们使用 servlet 实现核对功能。

    login.jsp 登录界面提交表单 <%-- Created by IntelliJ IDEA. User: haoqi Date: 2020/10/6 Time: 13:39 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录界面</title> </head> <body> <form action="/login.jsp" method="get"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"></td> </tr> <tr> <%-- 在后端查看--%> <%System.out.println("login.jsp 提交了~~");%> <td><input type="submit" value="登录"></td> <td><input type="reset" value="重置"></td> </tr> </table> </form> </body> </html> 信息核对界面—在 com.hou.session 目录下面—LoginServlet.java package com.hou.session; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * @author haoqi * @Date 2020/10/6 - 13:49 * * 对 login.jsp提交的表单进行检查 */ public class LoginServlet extends HttpServlet { private String myUsername; private String myPassword; @Override public void init(ServletConfig config) throws ServletException { //获取xml中自定义的用户名和密码 myUsername = config.getInitParameter("username"); myPassword = config.getInitParameter("password"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override //在 login.jsp 中标签 <form action="/login.jsp" method="post"> //声明了请求类型位 post ,所以在 doPose里面实现 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //login.jsp 文件框里的值 String username = req.getParameter("username"); String password = req.getParameter("password"); //将用户名,密码 定义位初始化参数,则不能使用注解映射,采用xml if (username.equals(myUsername) && password.equals(myPassword)){ //利用 Session 存储用户名,密码 HttpSession session = req.getSession(); session.setAttribute("username",username); //不用 session 直接 req // req.setAttribute("username",username); req.getRequestDispatcher("welcome.jsp").forward(req,resp); } else //重定向 resp.sendRedirect("/login.jsp"); } }

    注: 在这里,获取正确的用户名和密码的方式是:将用户名和密码初始化为参数,即从XML文件里面获取,用MXL实现映射关系。

    XML文件,实现映射关系—web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>login</servlet-name> <servlet-class>com.hou.session.LoginServlet</servlet-class> <!-- 初始化自定义参数--> <init-param> <param-name>username</param-name> <param-value>haoqi</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> </web-app><?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>login</servlet-name> <servlet-class>com.hou.session.LoginServlet</servlet-class> <!-- 初始化自定义参数--> <init-param> <param-name>username</param-name> <param-value>haoqi</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> </web-app> welcom.jsp <%-- Created by IntelliJ IDEA. User: haoqi Date: 2020/10/6 Time: 14:08 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>welcome</title> </head> <body> <h1>Hello Welcome !</h1> <!--欢迎回来~! <%=request.getAttribute("username")%>--从request里面取--> <!--从session里面取,因为在LoginServlet.java是用session发送的信息--> 欢迎回来~! <%=session.getAttribute("username")%> <a href="logout.jsp">推出~~</a><!--退出,销毁session--> </body> </html> 退出功能—在 com.hou.session目录下面—LogoutServlet.java package com.hou.session; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * @author haoqi * @Date 2020/10/6 - 14:13 */ @WebServlet("/logout") //对应welcome.jsp中的推出 public class LogoutServlet extends HttpServlet { //a标签的请求类型是 get ,所以在 doGet 里面实现 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.invalidate(); //立刻失效 resp.sendRedirect("login.jsp"); //回到登录页面 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }

    4.JSP内置对象的作用域

    在这里我们仅讨论4个

    page、 request、 session、 application

    因为它们都具有:setAttribute、 getAttribute 方法

    page 作⽤域:对应的内置对象是 pageContext。

    request 作⽤域:对应的内置对象是 request。

    session 作⽤域:对应的内置对象是 session。

    application 作⽤域:对应的内置对象是 application。

    范围大小:page < request < session < application

    page 只在当前⻚⾯有效。

    <body> <% pageContext.setAttribute("name","Tom"); %> <h1>pageContext</h1> <% String name=(String) pageContext.getAttribute("name"); out.write(name); %> </body>

    request 在⼀次请求内有效。

    session 在⼀次会话内有效

    application 对应整个 WEB 应⽤的。

    只要tomcat不关闭,关闭浏览器,其他浏览器均可访问

    3案例:网站的访问量统计

    当刷新浏览器或更换浏览器访问时,次数会增加

    <% Integer count=(Integer)application.getAttribute("count"); if (count==null){ count=1; application.setAttribute("count",count); }else{ count++; application.setAttribute("count",count); } %> 你是当前的第<%=count%>访客。

    增加

    <% Integer count=(Integer)application.getAttribute("count"); if (count==null){ count=1; application.setAttribute("count",count); }else{ count++; application.setAttribute("count",count); } %> 你是当前的第<%=count%>访客。
    Processed: 0.019, SQL: 9