session

10.服务器端会话session1-介绍与应用场景【理解】
目标

理解session的介绍与应用场景

session介绍

属于服务器端的会话技术,数据是保存在服务器的内存中,session也叫会话域对象

三个作用域
请求域request,一次请求内有效
会话域session,一个会话内有效
上下文域servletContext,全局有效
Session 和 Cookie 的主要区别
  1. Cookie 属于客户端会话技术,数据保存在浏览器端文件中,Cookie 中键和值都是 String 类型
  2. Session 属于服务器端的会话技术,数据保存服务器内存中,Session 中键是 String,值是 Object 类型
session的应用场景

1.存储服务器端生成的验证码—验证码登录

[外链图片转存失败(img-grWq3qAP-1566372634284)(assets/)]

2.用户登录成功后,将登录数据写入session,用于一个会话内不用再次登录

小结
  • 什么是session?

    服务器端会话对象
    
  • session的应用场景?

    验证码
    存储登录数据
    
11.服务器端会话session2-HttpSession接口介绍
目标

掌握session对象的创建

了解HttpSession接口相关方法

HttpSession接口方法介绍

创建会话的时机:用户第 1 次访问,并且由服务器调用了一个 getSession()方法,创建一个会话对象 HttpSession。

[外链图片转存失败(img-bKu2Rtch-1566372634284)(assets/)]

HttpSession类的API

[外链图片转存失败(img-5OdHdyAu-1566372634284)(assets/)]

案例需求—session方法的使用效果

[外链图片转存失败(img-Nlvwpn8S-1566372634285)(assets/1566161566667.png)]

实现代码
package com.itheima.session._01HttpSession接口介绍;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;

@WebServlet(name = "HttpSessionServlet", urlPatterns = "/HttpSessionServlet")
public class HttpSessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //目标:输出session一些信息到浏览器显示

        response.setContentType("text/html;charset=utf8");
        PrintWriter out = response.getWriter();

        //1.获取session对象【重要】
        HttpSession session = request.getSession();

        //2.打印会话id【重要】
        String sessionId = session.getId();
        out.write("会话id:"+sessionId+"<br/><hr/>");

        //3.打印会话创建时间
        out.write("会话创建时间:"+new Timestamp(session.getCreationTime()).toString()+"<br/><hr/>");

        //4.打印上次访问的时间
        out.write("上次访问的时间:"+new Timestamp(session.getLastAccessedTime())+"<br><hr/>");

        //5.打印是否新的会话
        out.write("是否新的会话:"+session.isNew()+"<br/><hr/>");

        //6.使用session获取上下文对象并打印
        out.write("上下文对象:"+session.getServletContext()+"<br/><hr/>");
    }
}
运行效果

访问地址

http://localhost:8080/day27_cookie_session_war_exploded/HttpSessionServlet

效果

[外链图片转存失败(img-5KAfKZo3-1566372634285)(assets/)]

小结
  • session的所属接口是?

    HttpSession
    
  • 创建获取session对象的代码是?

    request.getSession();
    
12.服务器端会话session2-是一个会话域对象
目标

掌握session是一个会话域对象

会话域对象介绍

session是会话域对象,一次会话内有效,一个用户多次请求内有效

会话域对象的方法

[外链图片转存失败(img-vJKhZtV4-1566372634285)(assets/]

实现步骤
  1. 创建一个Servlet写入session数据
  2. 创建一个Servlet读取session数据
实现代码

代码位置 

[外链图片转存失败(img-I6O3aSI1-1566372634286)(assets/1566198517511.png)] 

AddSessionDataServlet代码

package com.itheima.session._02使用会话域对象存取数据;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "AddSessionDataServlet", urlPatterns = "/AddSessionDataServlet")
public class AddSessionDataServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //目标:写入session数据

        //1.获取session
        HttpSession session = request.getSession();

        //2.写入数据
        session.setAttribute("name","itheima117");

        //3.输出写入成功
        //获取sessionid并打印
        String sessionId = session.getId();
        response.getWriter().write("session write success,sessionId="+sessionId);
    }
}

GetSessionDataServlet代码

package com.itheima.session._02使用会话域对象存取数据;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "GetSessionDataServlet", urlPatterns = "/GetSessionDataServlet")
public class GetSessionDataServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //目标:从session里面读取数据

        //1.获取session
        HttpSession session = request.getSession();

        //2.获取数据
        String name = (String) session.getAttribute("name");

        //3.打印数据
        response.getWriter().write("name="+name);
    }
}
运行效果

写入访问地址

http://localhost:8080/day27_cookie_session_war_exploded/AddSessionDataServlet

写入效果

[外链图片转存失败(img-kZT8iCdA-1566372634286)(assets/1566198537923.png)]

读取访问地址

http://localhost:8080/day27_cookie_session_war_exploded/GetSessionDataServlet

读取效果

[外链图片转存失败(img-Mmht6RtX-1566372634286)(assets/)]

小结作用域对象区别
作用域对象作用域范围应用场景
request一个用户一次请求内请求转发跳转页面传递数据
session一个用户一次会话内存储验证码,存储用户登录数据
servletcontext整个应用程序内统计全局的数据,这个数据全局共享,所有用户共享,例如统计登录人数
13.服务器端会话session4-原理分析
疑问

疑问:重启浏览器或使用不同浏览器,服务器都会创建新的session(因为sessionid不同),服务器怎么知道我们重启或使用不同的浏览器?
答:需要学习session运行原理

疑问2的session原理分析

[外链图片转存失败(img-pDTDzlGj-1566372634287)(assets/]

第1次请求与第1次响应

[外链图片转存失败(img-5JPYvG3n-1566372634287)(assets/1566199645366.png)]

第二次请求

[外链图片转存失败(img-j7O5aZkB-1566372634287)(assets/1566200436605.png)]

小结
疑问:重启浏览器或使用不同浏览器,服务器都会创建新的session(因为sessionid不同),服务器怎么知道我们重启或使用不同的浏览器?
答:重启浏览器cookie失效没有JSESSIONID,服务器就会创建新的session返回; 使用不同的浏览器也没有cookie的JSESSIONID数据,所以服务器也会创建新的返回。以后第二次访问都有cookie的JSESSIONID,服务器返回以后的session,就没有创建新的了

session技术是依赖于cookie技术。

14.服务器端会话session5-默认有效期与修改【应用】
目标

理解session修改过期时间

会话的过期时间

[外链图片转存失败(img-ffMSeAVG-1566372634288)(assets/)]

时间间隔的含义:如果你在这段时间内再次发送请求给服务器,服务器将会重新计时。

session默认有效期,有2个方面决定:
  1. 浏览器关闭,会话结束,导致已有的session没用了,但是依然驻留在内存中.
  2. session在服务器内存中不是永久的,距离上一次请求间隔超过30分钟会被销毁。
修改过期时间方式有3种
1.使用代码修改session的过期间隔时间
2.配置web.xml设置session过期间隔时间
3.立刻失效
修改过期时间方式1—代码修改session的过期间隔时间

[外链图片转存失败(img-X5pVsPcb-1566372634288)(assets/]

案例需求

设置没间隔5秒session过期

实现代码

代码位置

[外链图片转存失败(img-4uOyd4l0-1566372634288)(assets/1566201703983.png)] 

package com.itheima.session._03修改session的过期时间;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "SessionTimeOutServlet1", urlPatterns = "/SessionTimeOutServlet1")
public class SessionTimeOutServlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //目标:使用代码方式设置session的非活动时间间隔
        //1.获取session
        HttpSession session = request.getSession();

        //2.设置非活动时间间隔,设置为5秒
        session.setMaxInactiveInterval(5);

        //3.打印sessionid
        response.getWriter().write("sessionid="+session.getId());
    }
}
实现效果

访问地址

http://localhost:8080/day27_cookie_session_war_exploded/SessionTimeOutServlet1

访问效果

[外链图片转存失败(img-KBjZjj6n-1566372634289)(assets/)]

间隔5秒后再次访问效果,发现sessionid每5秒都在变化

[外链图片转存失败(img-gQuNzxVL-1566372634289)(assets/)]

修改过期时间方式2—配置web.xml的session过期时间

项目没有web.xml,可以配置idea生成web.xml的配置

[外链图片转存失败(img-aiOvGSXp-1566372634290)(assets/)]

<?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">

    <!--修改session过期时间方式2:配置web.xml-->
    <session-config>
        <!--配置最大非活动时间为30分钟,单位是分钟,默认30分钟
        设置为0,代表永久不销毁,一般推荐使用30分钟-->
        <session-timeout>30</session-timeout>
    </session-config>
</web-app>
修改过期时间方式3—立刻失效

[外链图片转存失败(img-NQEW0F2I-1566372634290)(assets/)]

案例需求

访问servlet立刻销毁session

实现代码

代码位置

[外链图片转存失败(img-TmDJLUBz-1566372634290)(assets/)] 

package com.itheima.session._03修改session的过期时间;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "SessionTimeOutServlet2", urlPatterns = "/SessionTimeOutServlet2")
public class SessionTimeOutServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //目标:让session立刻销毁
        //1.获取session
        HttpSession session = request.getSession();

        //2.打印sessionid
        response.getWriter().write("sessionid="+session.getId());

        //3.让session立刻销毁
        session.invalidate();

    }
}
实现效果

访问地址

http://localhost:8080/day27_cookie_session_war_exploded/SessionTimeOutServlet2

访问效果

[外链图片转存失败(img-BX1kk6FK-1566372634291)(assets/)]

每次访问sessionid都不一样

小结

session的会话有效期可以修改,不建议修改,因为30分钟非常好。

  1. 代码修改

  2. 修改web.xml配置有效期时间

  3. 立即销毁

15.session案例1-关闭浏览器后继续访问原有的session数据
目标

掌握延长session的过期时间的cookie操作解决方案

需求

浏览器第一次访问服务器创建会话对象,浏览器先关闭再打开第二次访问服务器,要求浏览器依然使用第一次访问服务器的会话对象

分析

因为浏览器关闭了,默认生成的cookie数据JSESSIONID过期了,导致打开浏览器第二次访问服务器不会携带JSESSIONID,所以服务器自己创建新的session返回使用。

所以,只要延长JSESSIONID过期时间,服务器就会获取其对应的旧session返回使用

实现步骤
  1. 创建session的同时,手动创建cookie写入JSESSIONID数据
  2. 修改cookie的JSESSIONID数据有效期,设置时间长一些,覆盖客户端cookie数据
  3. 浏览器访问观察,是否产生了新的sessionid
实现代码

[外链图片转存失败(img-EsHjopkt-1566372634291)(assets/)] 

package com.itheima.session._04关闭浏览器后依然访问旧的session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(name = "SessionCookieTimeOutServlet", urlPatterns = "/SessionCookieTimeOutServlet")
public class SessionCookieTimeOutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //目标:关闭浏览器后继续访问原有的session数据
        //这个案例的实现有前提:
        //      1.必须同一个浏览器
        //      2.关闭与再打开间隔不可以超过30分钟


        //1.获取session
        HttpSession session = request.getSession();

        String sessionId = session.getId();

        //2.创建cookie,写入JSESSIONID(目的覆盖已有的cookie的JSESSIONID)
        Cookie cookie = new Cookie("JSESSIONID",sessionId);

        //3.设置cookie过期时间长一点
        cookie.setMaxAge(60*60*24);//1天

        //4.将cookie输出给浏览器保存
        response.addCookie(cookie);

        //5.打印sessionid
        response.getWriter().write("sessionid="+sessionId);
    }
}

运行效果

访问地址

http://localhost:8080/day27_cookie_session_war_exploded/SessionCookieTimeOutServlet

效果

[外链图片转存失败(img-uZGjfylD-1566372634291)(assets/)]

关闭浏览器后再次访问,发现sessionid没有发生变化

小结
  • 如何延长session过期?

    新建过期时间较长的cookie的JSESSIONID数据覆盖已有JSESSIONIND
    
16.服务器端会话session6-会话的钝化与激活
思考

判断下面的说法是否正确?

  1. 浏览器关闭的时候,服务器端的会话就销毁? 不对
  2. 服务器关闭的时候,服务端的会话就销毁? 不对,服务器会将会话数据持久化到文件中
目标

了解session会话数据有钝化与激活

钝化介绍

服务器正常关闭,会将内存数据持久化到服务器磁盘上,类似于序列化对象过程

序列化磁盘位置:tomcat\work\Catalina\localhost\项目名\SESSIONS.ser

激活介绍

服务器启动时,会将磁盘数据恢复到内存会话域对象中,类似于反序列化对象过程

作用

在cookieJSESSIONID有效的情况下,正常重启服务器会话数据经过钝化与激活依然可用。防止因为服务器重启会话数据丢失的问题。

注意
1.idea无法演示钝化与激活,必须将项目部署到正式tomcat上,单独启动与关闭服务器测试才有效。
2.由于进行序列化与反序列操作,需要会话的中的对象数据所属的类实现可序列化接口

[外链图片转存失败(img-jgkfG96C-1566372634292)(assets/)]

实现步骤
  1. 部署项目到服务器webapps目录下
  2. 运行startup.bat启动服务器
  3. 浏览器访问servlet,获取session里面的数据并打印在浏览器上
  4. 运行shutdow.bat关闭服务器,观察是否有钝化文件产生
  5. 运行startup.bat启动服务器,观察钝化文件是否消失
  6. 再次访问servlet观察数据是否依然存在
运行效果

部署项目到服务器webapps目录下

[外链图片转存失败(img-GoMyz82d-1566372634292)(assets/)]

运行startup.bat启动服务器

[外链图片转存失败(img-iSxULKK8-1566372634292)(assets/)]

访问写入session数据地址

http://localhost:8080/day27_cookie_session_war_exploded/AddSessionDataServlet

写入效果

[外链图片转存失败(img-omWjghrl-1566372634293)(assets/)]

访问读取session数据地址

http://localhost:8080/day27_cookie_session_war_exploded/GetSessionDataServlet

读取效果

[外链图片转存失败(img-qJrRP6oS-1566372634293)(assets/)]

运行shutdow.bat关闭服务器,进行序列化操作,观察是否有钝化文件产生

[外链图片转存失败(img-TlB1y1Q9-1566372634294)(assets/)]

产生了钝化的文件

[外链图片转存失败(img-hXtx4SbX-1566372634294)(assets/)]

运行startup.bat启动服务器,进行反序列化操作,观察钝化文件消失

[外链图片转存失败(img-vthA925Z-1566372634294)(assets/)]

再次访问读取session数据地址,数据依然在,说明服务器重启数据没有丢

[外链图片转存失败(img-4sT59le8-1566372634294)(assets/)]

小结
  • 服务器重启后session数据是否会丢失?

    不会丢,必须在正式tomcat上,idea无法实现
    
17.服务器端会话session7-禁用Cookie后的session处理
目标

了解浏览器禁用了cookie使用session的解决方案

禁用Cookie后servlet共享数据导致的问题

无法得到原来会话中的信息,每次请求都是新的会话session对象

实现步骤
  1. 设置浏览器禁用cookie

    [外链图片转存失败(img-69vRZRm1-1566372634295)(assets/)]

    [外链图片转存失败(img-rzwGzSgD-1566372634295)(assets/)]

    [外链图片转存失败(img-vTUQuKIv-1566372634295)(assets/)]

  2. 访问servlet观察是否使用旧的session数据

    访问地址

    http://localhost:8080/day27_cookie_session_war_exploded/AddSessionDataServlet
    

    第一次访问效果

    [外链图片转存失败(img-bkMdoLib-1566372634296)(assets/)]

    第二次访问效果,会发现每次请求sessiondid都会变

    [外链图片转存失败(img-YxAdJTc0-1566372634296)(assets/)]

解决方法把会话的ID在地址栏上带给服务器

方法1:重定向的url重写:
response.encodeRedirectURL(path);
URL重写,把会话的ID在地址栏上带给服务器
方法2:链接的url重写:对要访问的链接重新进行编码
response.encodeURL(path);

解决方法1—重定向URL重写解决实现步骤
实现步骤
  1. 创建2个Servlet1和Servlet2

  2. Servlet1写入session数据并重定向到Servlet2

    重定向url重写

  3. Servlet2读取Session数据

实现代码

Servlet1代码

package com.itheima.session._05重定向URL重写解决cookie禁用session依然可用;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "Servlet1", urlPatterns = "/Servlet1")
public class Servlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.获取session
        HttpSession session = request.getSession();

        //2.写入数据
        session.setAttribute("name","admin");

        //3.重定向到Servlet2
        //重定向url重写(本质就是给url拼接jsessionid=sessionid)
        String url = request.getContextPath()+"/Servlet2";
        String encodeRedirectURL = response.encodeRedirectURL(url);
        //重定向跳转
        response.sendRedirect(encodeRedirectURL);
    }
}

Servlet2代码

package com.itheima.session._05重定向URL重写解决cookie禁用session依然可用;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "Servlet2", urlPatterns = "/Servlet2")
public class Servlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.获取session
        HttpSession session = request.getSession();

        //2.读取name数据
        String name = (String) session.getAttribute("name");

        //3.打印
        response.getWriter().write("name="+name);
    }
}

运行效果

访问的url

http://localhost:8080/day27_cookie_session_war_exploded/Servlet1

重写前的URL

http://localhost:8080/day27_cookie_session_war_exploded/Servlet2

重写后的URL:

http://localhost:8080/day27_cookie_session_war_exploded/Servlet2;jsessionid=2E594C6CBC413CAD73B8B9AD84D04B70

运行效果

[外链图片转存失败(img-tiowU1DR-1566372634296)(assets/)]

  1. 思考:使用URL重写以后,不同的浏览器可不可以访问其它浏览器的会话数据?

​ 可以

解决方法2—超链接URL重写实现步骤
实现代码
package com.itheima.session._06超链接url重写解决cookie禁用session依然可用;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "Servlet3", urlPatterns = "/Servlet3")
public class Servlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //url重写的目的,给url添加jsessionid=sessionid

        //访问servlet2的url
        String url = request.getContextPath()+"/Servlet2";

        request.getSession().setAttribute("name","123");

        //超链接url重写
        String encodeURL = response.encodeURL(url);

        response.getWriter().write("<a href='"+encodeURL+"'>link</a>");
    }
}
运行效果

访问地址

http://localhost:8080/day27_cookie_session_war_exploded/Servlet3

重写前的URL

http://localhost:8080/day27_cookie_session_war_exploded/Servlet2

重写后的URL

http://localhost:8080/day27_cookie_session_war_exploded/Servlet2;jsessionid=80F2CD40B0CC268735AF5B831F3343EA

效果

[外链图片转存失败(img-TUKwWxve-1566372634296)(assets/)]

两者的区别
共同点

都对url附加上jsessionid参数进行了处理,如果需要,则在url的path后面附加上;jsessionid=xxx;如果不需要则直接返回传入的url。

不同点

encodeURL在附加jsessionid之前还对url做了判断处理:

如果url为空字符串(长度为0的字符串),则将url转换为完整的URL(http或https开头的);

如果url是完整的URL,但不含任何路径(即只包含协议、主机名、端口,例如http://127.0.0.1),则在末尾加上根路径符号/。

也就是如果使用encodeURL编码,则返回的URL一定是完整URL而不是相对路径;而encodeRedirectURL则不对URL本身进行处理,只添加jsessionid参数。

18.session与cookie的区别
特点cookiesession
数据存储在哪一端客户端服务器端
数据大小是否有限制4kb没有
存储存储什么类型数据stringobject
存储的数据默认有效期会话结束会话结束,有效期默认30分钟。
存储数据安全吗?不安全安全

会话对象保存的数据是用户独享的数据

19.session案例2-使用session存储验证码完成登录功能
验证码校验实现分析

[外链图片转存失败(img-tW6NyflE-1566372634297)(assets/)]

实现需求

[外链图片转存失败(img-I37zzm7Q-1566372634297)(assets/)]

效果

验证码错误效果

[外链图片转存失败(img-7KvpDQo6-1566372634297)(assets/)]

登录成功的效果

[外链图片转存失败(img-Fm02MByD-1566372634298)(assets/)]

注销的效果

[外链图片转存失败(img-Az4pk7Qo-1566372634298)(assets/)]

代码结构

[外链图片转存失败(img-xUkaas2s-1566372634298)(assets/)] 

实现代码

[外链图片转存失败(img-5V0EcVQm-1566372634298)(assets/)] 

CheckCodeServlet代码

[外链图片转存失败(img-5gsYsUI3-1566372634299)(assets/)]

LoginServlet代码,登录之前先进行验证码校验

[外链图片转存失败(img-4EjHM60x-1566372634300)(assets/)]

登录成功后,将登录数据写入session

[外链图片转存失败(img-lx9JOnc8-1566372634300)(assets/)]

WelcomeServlet代码

package com.itheima.web;

import com.itheima.entity.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "WelComeServlet", urlPatterns = "/WelComeServlet")
public class WelComeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //目标:判断是否的登录
        response.setContentType("text/html;charset=utf8");

        //1.从session获取登录数据
        User loginUser = (User) request.getSession().getAttribute("loginUser");

        if(loginUser!=null) {
            //2.登录数据有效,说明登录了,显示“欢迎xx登录,注销”,注销超链接
            response.getWriter().write("<div>欢迎"+loginUser.getUsername()+"登录,<a href='loginOut'>注销</a></div>");
        }else {
            //3.登录数据无效,说明没有登录,显示“登录”超链接
            response.getWriter().write("<div><a href='login.html'>登录</a></div>");
        }
    }
}

LoginOutServlet代码

package com.itheima.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "LoginOutServlet", urlPatterns = "/loginOut")
public class LoginOutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //目标:注销登录

        //立即销毁session
        request.getSession().invalidate();

        //跳转到登录页面
        response.sendRedirect(request.getContextPath()+"/login.html");
    }
}

20.总结

port javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = “WelComeServlet”, urlPatterns = “/WelComeServlet”)
public class WelComeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //目标:判断是否的登录
    response.setContentType("text/html;charset=utf8");

    //1.从session获取登录数据
    User loginUser = (User) request.getSession().getAttribute("loginUser");

    if(loginUser!=null) {
        //2.登录数据有效,说明登录了,显示“欢迎xx登录,注销”,注销超链接
        response.getWriter().write("<div>欢迎"+loginUser.getUsername()+"登录,<a href='loginOut'>注销</a></div>");
    }else {
        //3.登录数据无效,说明没有登录,显示“登录”超链接
        response.getWriter().write("<div><a href='login.html'>登录</a></div>");
    }
}

}


LoginOutServlet代码

```java
package com.itheima.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "LoginOutServlet", urlPatterns = "/loginOut")
public class LoginOutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //目标:注销登录

        //立即销毁session
        request.getSession().invalidate();

        //跳转到登录页面
        response.sendRedirect(request.getContextPath()+"/login.html");
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值