浩浩学编程JavaWeb-03Session

Session

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 实现核对功能。

  1. 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>
  1. 信息核对界面—在 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实现映射关系。

  1. 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>
  1. 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>

  1. 退出功能—在 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);
    }
}

01

在这里插入图片描述

在这里插入图片描述

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%>访客。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值