10.服务器端会话session1-介绍与应用场景【理解】
目标
理解session的介绍与应用场景
session介绍
属于服务器端的会话技术,数据是保存在服务器的内存中,session也叫会话域对象
三个作用域
请求域request,一次请求内有效
会话域session,一个会话内有效
上下文域servletContext,全局有效
Session 和 Cookie 的主要区别
- Cookie 属于客户端会话技术,数据保存在浏览器端文件中,Cookie 中键和值都是 String 类型
- Session 属于服务器端的会话技术,数据保存服务器内存中,Session 中键是 String,值是 Object 类型
session的应用场景
1.存储服务器端生成的验证码—验证码登录
2.用户登录成功后,将登录数据写入session,用于一个会话内不用再次登录
小结
-
什么是session?
服务器端会话对象
-
session的应用场景?
验证码 存储登录数据
11.服务器端会话session2-HttpSession接口介绍
目标
掌握session对象的创建
了解HttpSession接口相关方法
HttpSession接口方法介绍
创建会话的时机:用户第 1 次访问,并且由服务器调用了一个 getSession()方法,创建一个会话对象 HttpSession。
HttpSession类的API
案例需求—session方法的使用效果
实现代码
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
效果
小结
-
session的所属接口是?
HttpSession
-
创建获取session对象的代码是?
request.getSession();
12.服务器端会话session2-是一个会话域对象
目标
掌握session是一个会话域对象
会话域对象介绍
session是会话域对象,一次会话内有效,一个用户多次请求内有效
会话域对象的方法
实现步骤
- 创建一个Servlet写入session数据
- 创建一个Servlet读取session数据
实现代码
代码位置
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
写入效果
读取访问地址
http://localhost:8080/day27_cookie_session_war_exploded/GetSessionDataServlet
读取效果
小结作用域对象区别
作用域对象 | 作用域范围 | 应用场景 |
---|---|---|
request | 一个用户一次请求内 | 请求转发跳转页面传递数据 |
session | 一个用户一次会话内 | 存储验证码,存储用户登录数据 |
servletcontext | 整个应用程序内 | 统计全局的数据,这个数据全局共享,所有用户共享,例如统计登录人数 |
13.服务器端会话session4-原理分析
疑问
疑问:重启浏览器或使用不同浏览器,服务器都会创建新的session(因为sessionid不同),服务器怎么知道我们重启或使用不同的浏览器?
答:需要学习session运行原理
疑问2的session原理分析
第1次请求与第1次响应
第二次请求
小结
疑问:重启浏览器或使用不同浏览器,服务器都会创建新的session(因为sessionid不同),服务器怎么知道我们重启或使用不同的浏览器?
答:重启浏览器cookie失效没有JSESSIONID,服务器就会创建新的session返回; 使用不同的浏览器也没有cookie的JSESSIONID数据,所以服务器也会创建新的返回。以后第二次访问都有cookie的JSESSIONID,服务器返回以后的session,就没有创建新的了
session技术是依赖于cookie技术。
14.服务器端会话session5-默认有效期与修改【应用】
目标
理解session修改过期时间
会话的过期时间
时间间隔的含义:如果你在这段时间内再次发送请求给服务器,服务器将会重新计时。
session默认有效期,有2个方面决定:
- 浏览器关闭,会话结束,导致已有的session没用了,但是依然驻留在内存中.
- session在服务器内存中不是永久的,距离上一次请求间隔超过30分钟会被销毁。
修改过期时间方式有3种
1.使用代码修改session的过期间隔时间
2.配置web.xml设置session过期间隔时间
3.立刻失效
修改过期时间方式1—代码修改session的过期间隔时间
案例需求
设置没间隔5秒session过期
实现代码
代码位置
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
访问效果
间隔5秒后再次访问效果,发现sessionid每5秒都在变化
修改过期时间方式2—配置web.xml的session过期时间
项目没有web.xml,可以配置idea生成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">
<!--修改session过期时间方式2:配置web.xml-->
<session-config>
<!--配置最大非活动时间为30分钟,单位是分钟,默认30分钟
设置为0,代表永久不销毁,一般推荐使用30分钟-->
<session-timeout>30</session-timeout>
</session-config>
</web-app>
修改过期时间方式3—立刻失效
案例需求
访问servlet立刻销毁session
实现代码
代码位置
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
访问效果
每次访问sessionid都不一样
小结
session的会话有效期可以修改,不建议修改,因为30分钟非常好。
-
代码修改
-
修改web.xml配置有效期时间
-
立即销毁
15.session案例1-关闭浏览器后继续访问原有的session数据
目标
掌握延长session的过期时间的cookie操作解决方案
需求
浏览器第一次访问服务器创建会话对象,浏览器先关闭再打开第二次访问服务器,要求浏览器依然使用第一次访问服务器的会话对象
分析
因为浏览器关闭了,默认生成的cookie数据JSESSIONID过期了,导致打开浏览器第二次访问服务器不会携带JSESSIONID,所以服务器自己创建新的session返回使用。
所以,只要延长JSESSIONID过期时间,服务器就会获取其对应的旧session返回使用
实现步骤
- 创建session的同时,手动创建cookie写入JSESSIONID数据
- 修改cookie的JSESSIONID数据有效期,设置时间长一些,覆盖客户端cookie数据
- 浏览器访问观察,是否产生了新的sessionid
实现代码
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
效果
关闭浏览器后再次访问,发现sessionid没有发生变化
小结
-
如何延长session过期?
新建过期时间较长的cookie的JSESSIONID数据覆盖已有JSESSIONIND
16.服务器端会话session6-会话的钝化与激活
思考
判断下面的说法是否正确?
- 浏览器关闭的时候,服务器端的会话就销毁? 不对
- 服务器关闭的时候,服务端的会话就销毁? 不对,服务器会将会话数据持久化到文件中
目标
了解session会话数据有钝化与激活
钝化介绍
服务器正常关闭,会将内存数据持久化到服务器磁盘上,类似于序列化对象过程
序列化磁盘位置:tomcat\work\Catalina\localhost\项目名\SESSIONS.ser
激活介绍
服务器启动时,会将磁盘数据恢复到内存会话域对象中,类似于反序列化对象过程
作用
在cookieJSESSIONID有效的情况下,正常重启服务器会话数据经过钝化与激活依然可用。防止因为服务器重启会话数据丢失的问题。
注意
1.idea无法演示钝化与激活,必须将项目部署到正式tomcat上,单独启动与关闭服务器测试才有效。
2.由于进行序列化与反序列操作,需要会话的中的对象数据所属的类实现可序列化接口
实现步骤
- 部署项目到服务器webapps目录下
- 运行startup.bat启动服务器
- 浏览器访问servlet,获取session里面的数据并打印在浏览器上
- 运行shutdow.bat关闭服务器,观察是否有钝化文件产生
- 运行startup.bat启动服务器,观察钝化文件是否消失
- 再次访问servlet观察数据是否依然存在
运行效果
部署项目到服务器webapps目录下
运行startup.bat启动服务器
访问写入session数据地址
http://localhost:8080/day27_cookie_session_war_exploded/AddSessionDataServlet
写入效果
访问读取session数据地址
http://localhost:8080/day27_cookie_session_war_exploded/GetSessionDataServlet
读取效果
运行shutdow.bat关闭服务器,进行序列化操作,观察是否有钝化文件产生
产生了钝化的文件
运行startup.bat启动服务器,进行反序列化操作,观察钝化文件消失
再次访问读取session数据地址,数据依然在,说明服务器重启数据没有丢
小结
-
服务器重启后session数据是否会丢失?
不会丢,必须在正式tomcat上,idea无法实现
17.服务器端会话session7-禁用Cookie后的session处理
目标
了解浏览器禁用了cookie使用session的解决方案
禁用Cookie后servlet共享数据导致的问题
无法得到原来会话中的信息,每次请求都是新的会话session对象
实现步骤
-
设置浏览器禁用cookie
-
访问servlet观察是否使用旧的session数据
访问地址
http://localhost:8080/day27_cookie_session_war_exploded/AddSessionDataServlet
第一次访问效果
第二次访问效果,会发现每次请求sessiondid都会变
解决方法把会话的ID在地址栏上带给服务器
方法1:重定向的url重写:
response.encodeRedirectURL(path);
URL重写,把会话的ID在地址栏上带给服务器
方法2:链接的url重写:对要访问的链接重新进行编码
response.encodeURL(path);
解决方法1—重定向URL重写解决实现步骤
实现步骤
-
创建2个Servlet1和Servlet2
-
Servlet1写入session数据并重定向到Servlet2
重定向url重写
-
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
运行效果
- 思考:使用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
效果
两者的区别
共同点
都对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的区别
特点 | cookie | session |
---|---|---|
数据存储在哪一端 | 客户端 | 服务器端 |
数据大小是否有限制 | 4kb | 没有 |
存储存储什么类型数据 | string | object |
存储的数据默认有效期 | 会话结束 | 会话结束,有效期默认30分钟。 |
存储数据安全吗? | 不安全 | 安全 |
会话对象保存的数据是用户独享的数据
19.session案例2-使用session存储验证码完成登录功能
验证码校验实现分析
实现需求
效果
验证码错误效果
登录成功的效果
注销的效果
代码结构
实现代码
CheckCodeServlet代码
LoginServlet代码,登录之前先进行验证码校验
登录成功后,将登录数据写入session
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");
}
}