1. 会话
-
web应用的会话指一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,关闭浏览器会话结束。
-
HttpServletRequest对象和ServletContext对象虽然也能对数据进行保存,但是前者只能保存本次请求的数据,无法在多次请求中保留当前数据;后者无法区分不同用户的数据,故均不可使用。
-
Servlet技术提供两个用于保存会话数据的对象,分别是Cookie(浏览器)和Session(服务器)。数据存储到客户端使用客户端会话对象cookie,存储到服务器端使用服务器端会话对象session
2. cookie
2.1 概念
- 浏览器端的会话技术,它通过在浏览器中记录一些服务器传递过来的数据(cookie存储在浏览器缓存目录中的文本文件),通过cookie的有效期决定会话从什么时候开始,到什么时候结束。
- cookie是浏览器编写在本地的不超过4k的文本文件。
2.2 应用场景
- 记住用户名
- 自动登录(记住用户名和密码)
2.3 cookie的基本使用
2.3.1 cookie常用API
-
使用HttpServletRequest调用方法获取cookie:
- Cookie[] getCookies(); 获取浏览器发送的cookie。
-
使用HttpServletResponse调用方法发送cookie
- void addCookie(Cookie cookie); 将cookie发送给浏览器.
-
cookie操作
- public Cookie(String name, String value); 创建cookie对象(构造方法) - String getName(); 获取cookie的键 - String getValue(); 获取cookie的值 - void setPath(String uri); 设置cookie的路径 浏览器根据这个路径判断哪些cookie要发送给服务器;路径格式:/工程名字/资源路径 - void setMaxAge(秒数); 设置cookie的有效期,以秒为单位
如何理解cookie的路径?
- cookie的路径时在服务器创建Cookie时设置的,它的作用是决定浏览器访问服务器的某个资源时,需要将浏览器端保存的那些Cookie归还给服务器。
比如浏览器要访问服务器的路径是http://localhost:8080/Example/test/index.jsp
,那么访问的资源是index.jsp;cookie的路径是http://localhost:8080/Example/test
2.3.1.1 示例代码
模拟浏览器端
@WebServlet(urlPatterns = "/addCookieServlet")
public class AddCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie并写入数据
Cookie cookie = new Cookie("username","admin");
//设置cookie有效期
cookie.setMaxAge(60*60*24); //暂设为1天
//设置cookie的路径,路径格式:/工程名字/资源路径
//使用request对象获得工程名字
cookie.setPath(request.getContextPath() + "/GetCookieServlet");
//将cookie的数据发送给浏览器
response.addCookie(cookie);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
模拟服务器端
@WebServlet(urlPatterns = "/GetCookieServlet")
public class GetCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = request.getCookies();
//如果cookie不为空遍历
if (cookies != null) {
//遍历数组获取数据
for (Cookie cookie : cookies) {
//获取cookie中存储那么为username的数据
if (cookie.getName().equals("username")) {
response.getWriter().write(cookie.getName() + ":" + cookie.getValue());
}
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.3.1.2 cookie运行原理
2.3.2 cookie的特点
- cookie由服务器创建和产生,并通过响应头传递给浏览器,浏览器保存数据在客户端(本地);
- 一个cookie对象存储一个键值对数据;
- cookie存储的值必须是string类型;
- cookie存储在客户端浏览器缓存目录中的一个文本文件,但浏览器不用cookie的数据;
- cookie存储在浏览器后,以后每次提交请求都会将本地的cookie通过*请求头携带到cookie对应有效路径的服务器端;
- 设置有效路径浏览器会根据路径判断,请求路径与有效路径一致就携带,否则不携带。如果不设置有效路径,则访问当前网站内部的所有资源都会携带cookie;
- cookie的默认时间是关闭浏览器的时候失效;cookie如果使用默认有效期,浏览器缓存目录不会产生文本文件,cookie数据只会在浏览器内存中;
- cookie存储在客户端,数据是不安全的,对于敏感数据要进行加密后在存储,cookie文件大小有限制4KB。
2.3.3 删除cookie
- 要删除已经存在的cookie,只需要创建一个一模一样的cookie覆盖已有cookie,新创建的cookie必须名称和路径与原来的cookie一致,value清空和有效期设置为0。
2.3.3.1 删除步骤
-
创建cookie对象,名称保持一致;
-
设置有效期为0;
-
设置cookie的路径,与原来保持一致;
-
发送cookie给浏览器,覆盖已有cookie。
2.3.3.2 示例代码
@WebServlet(urlPatterns = "/RemoveCookieServlet")
public class RemoveCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 创建cookie对象,名称保持一致,值为空字符串;
Cookie cookie = new Cookie("username","");
//2. 设置有效期为0;
cookie.setMaxAge(0);
//3. 设置cookie的路径,与原来保持一致;比如覆盖GetCookieServlet的cookie
cookie.setPath(request.getContextPath() + "/GetCookieServlet");
//4. 发送cookie给浏览器,覆盖已有cookie。
response.addCookie(cookie);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.3.4 经典案例:记录用户上一次访问
/*
整体思路:1.每次登录都会记录时间并保存到cookie中发送给浏览器;2.服务器获取cookies数组,遍历时如果存在cookie名为loginTime
的就输入上次登录时间;如果遍历完没有找到,说明是第一次登录。这里需要用到一个布尔值进行标识
*/
@WebServlet(urlPatterns = "/LastLoginTimeServlet")
public class LastLoginTimeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码问题
response.setContentType("text/html;charset=utf-8");
//记录用户登录的时间
//这里使用的而是dataformate对象,为了设置格式
String dateStr = new SimpleDateFormat("yyyy-MM-dd/HH:mm:ss").format(new Date());
//封装到cookie对象中
Cookie cookie = new Cookie("loginTime", dateStr);
//发送到浏览器中
response.addCookie(cookie);
//读取浏览器传输的cookie数据
Cookie[] cookies = request.getCookies();
//判断是否为第一次登录,可以使用一个Boolean值进行判断,false为默认没有找到,意味着是第一次登录
boolean isFind = false;
//判断有效性,不为空且cookies存在元素
if (cookies != null && cookies.length > 0) {
//遍历获取上一次登录的时间
for (Cookie lastCookie : cookies) {
if ("loginTime".equals(lastCookie.getName())) {
//如果进入这里,说明找到了,有上一次登录时间,输出上次登录的时间
isFind = true;
response.getWriter().write("您上次登录的时间为:" + cookie.getValue());
return; //注意,既然已经找到的话,就不需要继续循环了,使用return结束循环
}
}
}
//根据ifFind的值判断,如果ifFind为false,说明是第一次访问
if (!isFind) {
response.getWriter().write("欢迎您的到来");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
2.3.4.1 注意事项
-
在cookie值中不能使用分号(;)、逗号(,)、等号(=)、空格和中文等字符。否则会报错
java.lang.IllegalArgumentException
-
解决存储非法数据的方法:
- 先将非法数据进行url编码,转换成符号、数字、和字母形式存储,使用时再转换成正常的中文(url解码)
-
使用的API方法:
- Java的URL编码(使用URLEncoder类)
- static String encode(String s, String enc); 将指定的字符串,按指定的编码表编码
- Java的URL解码(URLDecoder类)
- static String decode(String s, String enc); 将指定的字符串,按指定的编码表解码
这里与下载文件名含中文的操作的区别:
-
由于浏览器不读取cookie,不涉及浏览器的解析,所以只需要手动url编码、解码即可;
-
下载文件名含中文涉及到浏览器对该文件名的解析,所以要根据不同浏览器进行对应的解析。
2.3.4.1 案例优化
@WebServlet(urlPatterns = "/LastLoginTimeServlet")
public class LastLoginTimeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码问题
response.setContentType("text/html;charset=utf-8");
//记录用户登录的时间
//这里使用的而是dataformate对象,为了设置格式
/*如果要在cookie中存储中文或特殊符号,则需要对数据手动url编码*/
String dateStr = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date());
/*对此进行手动url编码*/
dateStr = URLEncoder.encode(dateStr,"utf-8");
//封装到cookie对象中
Cookie cookie = new Cookie("loginTime", dateStr);
//发送到浏览器中
response.addCookie(cookie);
//读取浏览器传输的cookie数据
Cookie[] cookies = request.getCookies();
//判断是否为第一次登录,可以使用一个Boolean值进行判断,false为默认没有找到,意味着是第一次登录
boolean isFind = false;
//判断有效性,不为空且cookies存在元素
if (cookies != null && cookies.length > 0) {
//遍历获取上一次登录的时间
for (Cookie lastCookie : cookies) {
if ("loginTime".equals(lastCookie.getName())) {
//如果进入这里,说明找到了,有上一次登录时间,输出上次登录的时间
isFind = true;
/*这里获取到url编码的数据,需要手动url解码才能准确获得数据*/
String lastTime = cookie.getValue();
lastTime = URLDecoder.decode(lastTime,"utf-8");
response.getWriter().write("您上次登录的时间为:" + lastTime);
return; //注意,既然已经找到的话,就不需要继续循环了,使用return结束循环
}
}
}
//根据ifFind的值判断,如果ifFind为false,说明是第一次访问
if (!isFind) {
response.getWriter().write("欢迎您的到来");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
3. session
3.1 概念
- 服务器端会话对象,是服务器为每个浏览器(每个用户)创建的单独私有存储空间。
3.1.1 session的特点
- 运行在服务器端;
- 不同的浏览器产生不同的session;
- 只要没有关闭浏览器(即同一个会话内),不管刷新多少次还是打开多个页面,同一个浏览器的session是同一个;
- 关闭浏览器(会话结束),使用同一个浏览器重新打开,session与前一个不一致;
- 会话对象也是一个域对象,主要用于在服务器端存储每个用户自己的数据,不同的用户之间数据不能共享。
3.1.2 session和cookie的区别
cookie | session | |
---|---|---|
会话数据保存的位置 | 浏览器 | 服务器 |
数据安全性 | 不安全 | 安全 |
存储大小 | 限制4kb | 无 |
3.1.3 session应用场景
- 服务器端存储的用户私有数据都可以使用session存储
-
保存购物车数据
-
保存用户浏览器记录数据
-
保存用户登录信息数据
-
保存验证码
3.2 session的使用
3.2.1 会话域对象
- session是会话域对象,一次会话过程内有效;
- 从客户端浏览器第一次访问服务器开始,到浏览器关闭,期间可以进行一系列的请求与响应,这个过程称作为一次会话过程。
3.2.2 常用API
-
使用HttpServletRequest调用方法获取session
- HttpSession getSession(); 获取session对象
-
HttpSession操作session
- void setAttribute(String name, Object value); 在session中保存数据 - Object getAttribute(String name); 从session中获取数据 - void removeAttribute(String name); 从session中移除数据
-
session操作
- sessionid getId(); 获得session的id
3.2.3 示例代码
添加session:
@WebServlet(urlPatterns = "/AddSessionServlet")
public class AddSessionServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得session对象
HttpSession session = request.getSession();
//添加数据
session.setAttribute("name","admin");
//获得session的id
String sessionId = session.getId();
//输出sessionId,检验一下session是否相同
response.getWriter().write("session write sucessful!sessionid = " + sessionId);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
获取session对象的数据
@WebServlet(urlPatterns = "/GetSessionServlet")
public class GetSessionServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得session对象
HttpSession session = request.getSession();
//获取session的数据
Object object = session.getAttribute("name");
//输出数据
response.getWriter().write("name=" + object);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
3.3 session的运行原理
- session依赖cookie实现
3.3.1 session的有效期
- session的有效期是一次会话内,关闭了浏览器session就没用了,但是session对象依然存储在服务器内存中,session对象并没有销毁,session默认有效期30分钟。距离最后一次请求超过30分钟,session过期。
3.3.2 改变会话过期时间
3.3.2.1 通过web.xml中配置session过期时间
IDEA添加web.xml操作
示例代码
<!-- 配置会话的时间,以分钟为单位 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
其中:session-timeout设置为0或者负数,则会话不过期,但会受限与服务器的内存空间
注意:一般没有人会去更改session默认30分钟有效期!
3.3.2.2 会话立即失效
使用session对象调用方法(常用)
- void invalidate(); 立刻销毁session
或者session对象调用removeAttribute,移除用户名。
应用场景
注销登录
3.3.3 session实现关闭浏览器继续可以访问数据
-
原因:服务器在一次会话中所创建的cookie是默认有效期,关闭浏览器后cookie就过期失效,无法用原有的cookie访问原有session。
-
原理:自行创建一个cookie覆盖服务器默认创建的cookie。使自行创建的cookie有效期变长。
-
注意:
- 自行的cookie的名称是"JSESSIONID",这样才能覆盖默认的cookie;
- 如
Cookie cookie = new Cookie("JSESSIONID",session.getId());
- 如
- 自行cookie的有效期最多设置为30分钟,因为等待时间超过30分钟时,服务器会销毁原有的session。
- 自行的cookie的名称是"JSESSIONID",这样才能覆盖默认的cookie;
3.3.3.1 示例代码
@WebServlet(urlPatterns = "/TimeoutServlet")
public class TimeoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie,覆盖原来的cookie
Cookie cookie = new Cookie("JSESSIONID",request.getSession().getId());
//最多只有30分钟,超过30分钟后session失效
cookie.setMaxAge(60*30);
//输出浏览器,覆盖原有的cookie
response.addCookie(cookie);
//输出sessionid
response.getWriter().write("sessionid:"+request.getSession().getId());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
3.3.4 session的注意事项
session不要存储太多的数据,在批量操作下会耗费服务器的内存。一般企业中,session只存储验证码和登录的用户数据。
3.4 经典案例-使用session存储验证码完成登录功能
- 原理:session存储登录的用户数据,可以用来证明用户是否登录。如果有存储登录数据的session,说明用户有登录;如果session被销毁或者不存在,说明用户没有登录
1、准备登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="LoginServlet" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td>验证码:</td>
<td><input type="text" name="checkcode"/></td>
</tr>
<tr>
<td></td>
<td><img id="img" src="CheckCodeServlet" onclick="imgChange(this);"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登录"/></td>
</tr>
</table>
<script type="text/javascript">
function imgChange(imgObj) {
//刷新图片的原理:url变化
//让图片不断请求CheckCodeServlet,需要改变src,浏览器只要src值不断变化就会重新请求src指定路径资源
imgObj.src="CheckCodeServlet?time="+new Date().getTime();
}
</script>
</form>
</body>
</html>
2、准备实体类
public class User {
private int id;
private String name;
private String password;
public User() {
}
@Override
public String toString() {
return "User{"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';
}
public int getId() {return id;}
public void setId(int id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getPassword() {return password;}
public void setPassword(String password) {this.password = password;}
}
3、准备Utils类和druid配置文件,此处省略
4、dao层
public class UserDao {
public User findByUser(User user) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select * from user where name = ? and password = ?;";
try {
return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), user.getName(), user.getPassword());
} catch (DataAccessException e) {
return null;
}
}
}
5、service层
public class UserService {
private UserDao userDao = new UserDao();
public User login(User user) {
//访问数据库,获得用户对象
User loginUser = userDao.findByUser(user);
return loginUser;
//如果存在这个用户,则代表登录成功,如果返回null,则登录失败
}
}
6、web层
6.1 验证码Servlet
@WebServlet(urlPatterns = "/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
//获取随机数
private Random random = new Random();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建一个缓存图片
//BufferedImage(int width,int height,int imageType)
BufferedImage image = new BufferedImage(90,30,BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics g = image.getGraphics();
//设置画笔的颜色
g.setColor(Color.white);
//设置画布范围
g.fillRect(0,0,90,30);
//画干扰线
//g.drawLine(x1,y1,x2,y2);
for (int i=1;i<=4;i++){
//设置每条线的随机颜色
g.setColor(getColor());
int x1=random.nextInt(91);
int y1=random.nextInt(31);
int x2=random.nextInt(91);
int y2=random.nextInt(31);
g.drawLine(x1,y1,x2,y2);
}
//画验证码
String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890小天使";
//随机选取4个
StringBuilder checkCode = new StringBuilder();
for(int i=0;i<4;i++){
int index = random.nextInt(data.length());
char item = data.charAt(index);
checkCode.append(item);
}
System.out.println("验证码:"+checkCode.toString());
/*
在生成验证码之后要存储到session域对象中!!!!这样服务器才能判断验证码是否正确
*/
request.getSession().setAttribute("checkCode", checkCode.toString());
//将验证码画到图片上
//g.drawString(str,x,y);
int i=0;
for(char item : checkCode.toString().toCharArray()){
//设置每个字符随机颜色
g.setColor(getColor());
//将每个字符画到图片上
g.drawString(item+"",10+(i*20),15);
i++;
}
//将内存图片输出到浏览器中
ImageIO.write(image,"png",response.getOutputStream());
}
/*获取随机颜色*/
public Color getColor(){
int r = random.nextInt(256);
int g = random.nextInt(256);
int b = random.nextInt(256);
//Color(int r, int g, int b)
return new Color(r,g,b);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
6.2 登录Servlet
@WebServlet(urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
private UserService userService = new UserService();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码问题
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
/*在登录前首先要对检验验证码是否准确*/
//获得用户输入的checkCode
String userCheckeCode = request.getParameter("checkcode");
//获得session域中的checkCode
String sessionCheckCode = (String) request.getSession().getAttribute("checkCode");
if (!userCheckeCode.equalsIgnoreCase(sessionCheckCode)) {
//如果验证失败重新跳转回登录页面
response.getWriter().write("<script>alert('验证码错误,请重新登录');history.back();</script>");
//注意!!如果验证通过就继续执行下面的代码,如果验证不通过是不能执行下面代码,所以需要用return结束!!
return;
}
//验证通过走这里
//获得用户输入的信息
Map<String, String[]> parameterMap = request.getParameterMap();
//创建实体类对象
User user = new User();
//使用BeanUtils封装
try {
BeanUtils.populate(user, parameterMap);
System.out.println(user);
//调用service的登录功能
User loginUser = userService.login(user);
//判断loginUser
if (loginUser != null) {
//存在该用户,登录成功
/*将该用户信息封装到session对象中*/
request.getSession().setAttribute("loginUser",loginUser);
//跳转到欢迎页面
response.sendRedirect("/WelcomeServlet");
} else {
//登录失败转到failureServlet中
//因为在跳转的时候要把用户名带到failureServlet中,需要用到request域对象
request.setAttribute("userName",user.getName());
//请求转发页面跳转
request.getRequestDispatcher("/FailureServlet").forward(request,response );
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
6.3 登录成功Servlet
@WebServlet(urlPatterns = "/WelcomeServlet")
public class WelcomeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文输出页面乱码问题
response.setContentType("text/html;charset=utf-8");
//获取session里面的用户信息
User loginUser = (User) request.getSession().getAttribute("loginUser");
response.getWriter().write("<div>欢迎" + loginUser.getName() + "!!<a href='LoginOutServlet'>注销</a></div>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
6.4 登录失败Servlet
@WebServlet(urlPatterns = "/FailureServlet")
public class FailureServlet extends HttpServlet {
/*
思路:跳转到这里后,输出登录失败语句
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决响应乱码问题
response.setContentType("text/html;chatset=utf-8");
PrintWriter out = response.getWriter();
//获得域对象的数据
String userName = (String) request.getAttribute("userName");
out.write("<div>" +userName + ":用户名不存在或者密码错误!<a href='login.html'>返回</a></div>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}
6.5 登出Servlet
@WebServlet(urlPatterns = "/LoginOutServlet")
public class LoginOutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//登出效果:立刻销毁session,并跳转到登录页面
request.getSession().invalidate();
response.sendRedirect("/login.html");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//*如果post方式的执行内容与get不同,则删掉下面代码重写即可
doGet(request, response);
}
}