JavaEE-Cookie和Session

1. 会话

  • web应用的会话指一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,关闭浏览器会话结束。

  • HttpServletRequest对象和ServletContext对象虽然也能对数据进行保存,但是前者只能保存本次请求的数据,无法在多次请求中保留当前数据;后者无法区分不同用户的数据,故均不可使用。

  • Servlet技术提供两个用于保存会话数据的对象,分别是Cookie(浏览器)和Session(服务器)。数据存储到客户端使用客户端会话对象cookie,存储到服务器端使用服务器端会话对象session

2. cookie

2.1 概念

  • 浏览器端的会话技术,它通过在浏览器中记录一些服务器传递过来的数据(cookie存储在浏览器缓存目录中的文本文件),通过cookie的有效期决定会话从什么时候开始,到什么时候结束。
  • cookie是浏览器编写在本地的不超过4k的文本文件。

2.2 应用场景

  1. 记住用户名
  2. 自动登录(记住用户名和密码)

2.3 cookie的基本使用

2.3.1 cookie常用API
  1. 使用HttpServletRequest调用方法获取cookie:

    - Cookie[] getCookies();  
    	获取浏览器发送的cookie。
    
  2. 使用HttpServletResponse调用方法发送cookie

    - void addCookie(Cookie cookie);
    	将cookie发送给浏览器.
    
  3. 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运行原理

1536652742042

2.3.2 cookie的特点
  1. cookie由服务器创建和产生,并通过响应头传递给浏览器,浏览器保存数据在客户端(本地);
  2. 一个cookie对象存储一个键值对数据
  3. cookie存储的必须是string类型
  4. cookie存储在客户端浏览器缓存目录中的一个文本文件,但浏览器不用cookie的数据;
  5. cookie存储在浏览器后,以后每次提交请求都会将本地的cookie通过*请求头携带到cookie对应有效路径的服务器端
  6. 设置有效路径浏览器会根据路径判断,请求路径与有效路径一致就携带,否则不携带。如果不设置有效路径,则访问当前网站内部的所有资源都会携带cookie;
  7. cookie的默认时间是关闭浏览器的时候失效;cookie如果使用默认有效期,浏览器缓存目录不会产生文本文件,cookie数据只会在浏览器内存中;
  8. cookie存储在客户端,数据是不安全的,对于敏感数据要进行加密后在存储,cookie文件大小有限制4KB
2.3.3 删除cookie
  • 要删除已经存在的cookie,只需要创建一个一模一样的cookie覆盖已有cookie,新创建的cookie必须名称路径与原来的cookie一致,value清空有效期设置为0
2.3.3.1 删除步骤
  1. 创建cookie对象,名称保持一致;

  2. 设置有效期为0;

  3. 设置cookie的路径,与原来保持一致;

  4. 发送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方法:

    1. Java的URL编码(使用URLEncoder类)
    - static String encode(String s, String enc);  将指定的字符串,按指定的编码表编码
    
    1. 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的特点
  1. 运行在服务器端;
  2. 不同的浏览器产生不同的session;
  3. 只要没有关闭浏览器(即同一个会话内),不管刷新多少次还是打开多个页面,同一个浏览器的session是同一个;
  4. 关闭浏览器(会话结束),使用同一个浏览器重新打开,session与前一个不一致;
  5. 会话对象也是一个域对象,主要用于在服务器端存储每个用户自己的数据,不同的用户之间数据不能共享。
3.1.2 session和cookie的区别
cookiesession
会话数据保存的位置浏览器服务器
数据安全性不安全安全
存储大小限制4kb

3.1.3 session应用场景

  • 服务器端存储的用户私有数据都可以使用session存储
  1. 保存购物车数据

  2. 保存用户浏览器记录数据

  3. 保存用户登录信息数据

  4. 保存验证码

3.2 session的使用

3.2.1 会话域对象
  • session是会话域对象,一次会话过程内有效;
  • 从客户端浏览器第一次访问服务器开始,到浏览器关闭,期间可以进行一系列的请求与响应,这个过程称作为一次会话过程。
3.2.2 常用API
  1. 使用HttpServletRequest调用方法获取session

    - HttpSession getSession();  获取session对象
    
  2. HttpSession操作session

    - void setAttribute(String name, Object value);	 在session中保存数据
    - Object getAttribute(String name);  从session中获取数据
    - void removeAttribute(String name);  从session中移除数据
    
  3. 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实现

1536671314421

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操作

1536659697965

示例代码
<!-- 配置会话的时间,以分钟为单位 -->
<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。
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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值