06.HttpSession

HttpSession

回话跟踪

为什么需要会话跟踪?

  • HTTP协议是一种无状态的协议(一般情况下,在响应客户后,服务器就与客户断开连接)

  • 需要对用户在访问同一WEB应用时对用户进行跟踪(如:是否登录)

HttpSession

HttpSession是javaWeb对用户进行会话跟踪的一个接口。

HttpSession由Servlet容器的提供者实现。

HttpSession通过HttpServletRequest的getSession()或getSession(boolean b)方法获取:

  • getSession():如果会话没有被创建则创建并返回。

  • getSession(boolean b):如果参数时false,如果会话存在则返回,否则返回null。

常用方法

  • String getId():返回包含分配给此会话的唯一标识符的字符串。

  • void invalidate():使会话无效,然后取消任何绑定到此会话的对象的绑定。

  • void setAttribute(String name, Object value):使用指定名称将对象绑定到此会话。

  • Object getAttribute(String name):返回此会话中的指定名称绑定在一起的对象(经常需要进行类型转换)。

  • void removeAttribute(String name):从此会话汇总移出与指定名称绑定在一起的对象。

  • void setMaxInactiveInterval(int interval):设置servlet容器在客户端访问之间保持此会话的最大时间间隔。

  • int getInactiveInterval():返回servlet容器在客户端访问之间将使此会话保持打开状态的最大时间间隔。

  • ServletContext getServletContext():返回此会话的ServletContext。

  • boolean isNew():如果客户端还不知道该会话,或者客户端选择不加入该会话,则返回true。例如,如果服务器仅适用基于cookie的会话,而客户端已经禁用了cookie的使用,则每个请求上的会话都将是新的会话。

使用HttpSession完成登录验证

用户没有登录则不能访问除登录之外的Servlet。

  • 创建index.html

  • 创建login.html

  • 创建LoginServlet和TestServlet(TestServlet需要登录之后才能访问)

  • web.xml

示例代码

首页:index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <p>
    <a href="pages/login.html">登录</a>
    </p>

    <p>
    <a href="control/test">访问TestServlet(需要登录之后才能访问)</a>
    </p>

</body>
</html>

登录页面:login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <fieldset>
        <legend>用户登录</legend>
        <!-- 注意login.html文件的路径,这里访问的是该路径下的login服务 -->
        <!-- 也可以使用"../login"(返回上一级)表示访问根路径下的login服务 -->
        <!-- 
        另外一种方式,在头标签里面加此标签<base  href="/SessionTrack/">,
        表示此页面所有的访问都是相对于该位置下的页面或服务
         -->
        <form action="login" method="post">
            <p>
                用户名:<input type="text" name="name" />
            </p>
            <p>
                <!-- 不要使用普通空格,中间使用一个全角空格字符,间隔刚好是一个中文文字 -->
                密 码:<input type="password" name="password" />
            </p>
            <p>
                <input type="submit" value="登录" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset" value="取消" />
            </p>
        </form>
    </fieldset>
</body>
</html>

登录服务验证页面:LoginServlet.java

package com.li.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String name=req.getParameter("name");
        String password=req.getParameter("password");
        if("admin".equals(name) && "123456".equals(password)) {
            //获取会话
            HttpSession session=req.getSession();
            session.setAttribute("uesr", name);
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("<strong>欢迎"+name+"!</strong><br/><a href='../index.html'>返回首页</a>");
        }
        else {
            //登录失败,通过重定向的方式重新返回登录页面
            /*由于我们在配置文件中已经把服务配置到pages文件下,
             *所以,此处我们使用的是相对路径,不在需要加重定向位置所在的文件夹。
             */
            resp.sendRedirect("login.html");
        }
    }
}

访问服务测试页面:TestServlet.java

package com.li.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class TestServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //注意参数,session可以为null, 也可以不使用参数从而判断session是否为新的
        HttpSession session=req.getSession(false);
        if(session==null || session.getAttribute("uesr")==null) {
            //如果没有登录,则重定向到登录页(该Servlet配置在control路径下,也可以使用绝对路径)
            resp.sendRedirect("../pages/login.html");
            //System.out.println(getContextPath());
        }
        else {
            resp.setContentType("text/html; charset=UTF-8");
            resp.getWriter().write("<h3>欢迎"+session.getAttribute("uesr")+"访问TestServelt</h3><a href='../index.html'>返回首页</a>");
        }
    }
}

配置文件:web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>SessionTrack</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.li.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <!-- 将服务配置到pages文件下,否则将直接针对工程的根路径而配置到根路径下 -->
    <url-pattern>/pages/login</url-pattern>
  </servlet-mapping>

   <servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.li.servlet.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <!-- 将服务直接配置到根路径下的control路径下 -->
    <url-pattern>/control/test</url-pattern>
  </servlet-mapping>


</web-app>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值