javaweb-实验九-复盘

实验九 Cookie

需要资料,详见文章末尾,主打一个免费自提

一、实验目的:

1、理解Cookie的工作原理。
2、掌握操作Cookie的常见API。

二、 实验内容:

1、请在【代码一】~【代码四】中填写正确的代码,实现用户的7天免登录功能。

(1)登录页面:
在这里插入图片描述
(2)如果登录失败,则在页面中显示“用户名或者密码错误”。
(3)如果登录成功,且选中“七天内免登录”复选框,则会将当前用户的用户名以及密码保存到本地Cookie中,在七天内访问登录页面时,用户名及密码会自动显示在文本框中;如果登录成功,但未选中“七天内免登录”复选框,则会清除cookie中已有的用户名及密码。

【实验步骤】:

(1)新建一个名为”web9”的项目(Web应用程序)。在项目中,新建JSP,命名为“login”。

<%@page contentType="text/html" pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
    <body>
        <%
            String username = "";
            String userpass = "";
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
    
    
                for (int i = 0; i < cookies.length; i++) {
    
    
                    if ("username".equals(cookies[i].getName())) {
    
    
                        username = cookies[i].getValue();
                    }
                    if ("userpass".equals(cookies[i].getName())) {
    
    
                        //【代码一】                        
                    }
                }
            }
        %>

        <form action="<%=request.getContextPath()%>/login" method="post">
            username:<input type="text" name="username" value="<%=username%>"/><br>
            password:<input type="password"  name="userpass" value="<%=userpass%>"/><br>
            <input type="checkbox" value="y" name="isLogin" checked>七天内免登录<br>
            <input type="submit" value="登录"/>
        </form>
    </body>
</html>

(3)新建java包“it.servlet”。在该包中新建java类,命名为“LoginServlet”。
LoginServlet.java的功能:实现用户登录的判断以及7天免登录。

package it.servlet;

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

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    
    

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //【代码二】
      

		String username = req.getParameter("username");
        String userpass = req.getParameter("userpass");
        String isLogin = req.getParameter("isLogin");//选中“七天内免登录”,则isLogin返回“y”;否则,返回null
        if ("admin".equals(username) && "123456".equals(userpass)) {
    
    
            resp.getWriter().println("登录成功");
            if ("y".equals(isLogin)) {
    
    //不能写成 isLogin.equals("y")
                Cookie usernameCookie = new Cookie("username", username);
                usernameCookie.setMaxAge(3600 * 24 * 7);
                Cookie userpassCookie = new Cookie("userpass", userpass);
                userpassCookie.setMaxAge(3600 * 24 * 7);
                //【代码三】
                
            } else {
    
    
                //【代码四】
                


            }

        } else {
    
    
            resp.getWriter().println("用户名或密码错误");
        }
    }
}

2、请在【代码一】~【代码四】中填写正确的代码,显示用户浏览过的商品名称。

【实验步骤】

(1)在项目中新建“JSP”文件,命名为“display”。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>

        <h3>商品列表</h3>
        <a href="<%=request.getContextPath()%>/display?name=ThinkPad">ThinkPad</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=Lenovo">Lenovo</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=Apple">Apple</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=Sony">Sony</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=Dell">Dell</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=ACER">ACER</a><br/>
        
        <h3>浏览过的商品</h3>
        <%
           /*【代码一】从Cookie中读取名为“goods”的值,URLDecoder解码后显示在页面中 */
           
        %>

    </body>
</html>

(3)在it.servlet包中新建java类,命名为“DisplayServlet”。 DisplayServlet.java的功能:将用户点击的商品名添加到cookie中。

package it.servlet;

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

@WebServlet("/display")
public class DisplayServlet extends HttpServlet {
    
    

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
       //【代码二】声明并初始化变量goods


       //读取cookie
        Cookie[] cookies = req.getCookies();        
        if (cookies != null) {
    
    
            for (Cookie c : cookies) {
    
    
                if ("goods".equals(c.getName())) {
    
    
					goods = URLDecoder.decode(c.getValue(),"utf-8");
                    break;
                }
            }
        }

        //【代码三】从请求对象中,获取被点击的商品名,赋值给name
		
      
        //判断goods中是否包含被点击的商品名。若不包含,则将商品名添加到goods中。
        if (!goods.contains(name)) {
    
    
            goods =  name +" "+goods; //用空格分隔不同的商品名

        }
       
          //【代码四】将goods进行URLEncoder编码后,存储到客户端浏览器的cookie中
		        

        resp.sendRedirect(req.getContextPath() + "/display.jsp");
    }

}

三、具体实现

1、实现用户的7天免登录功能

<%@page contentType="text/html" pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
    <body>
        <%
            String username = "";
            String userpass = "";
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
    
    
                for (int i = 0; i < cookies.length; i++) {
    
    
                    if ("username".equals(cookies[i].getName())) {
    
    
                        username = cookies[i].getValue();
                    }
                    if ("userpass".equals(cookies[i].getName())) {
    
    
                        userpass = cookies[i].getValue();//【代码一】                        
                    }
                }
            }
        %>

        <form action="<%=request.getContextPath()%>/login" method="post">
            username:<input type="text" name="username" value="<%=username%>"/><br>
            password:<input type="password"  name="userpass" value="<%=userpass%>"/><br>
            <input type="checkbox" value="y" name="isLogin" checked>七天内免登录<br>
            <input type="submit" value="登录"/>
        </form>
    </body>
</html>

package it.servlet;

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

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    
    

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //【代码二】
        // 设置响应的内容类型为 "text/html",表示返回给客户端的内容是 HTML 格式的。
        // charset=UTF-8 部分指定了 HTML 内容的字符编码是 UTF-8。
        resp.setContentType("text/html;charset=UTF-8");
        // 设置响应的字符编码为 UTF-8
        // 确保它能够被浏览器正确解释和显示
        resp.setCharacterEncoding("UTF-8");

		String username = req.getParameter("username");
        String userpass = req.getParameter("userpass");
        String isLogin = req.getParameter("isLogin");//选中“七天内免登录”,则isLogin返回“y”;否则,返回null
        if ("admin".equals(username) && "123456".equals(userpass)) {
    
    
            resp.getWriter().println("登录成功");
            if ("y".equals(isLogin)) {
    
    //不能写成 isLogin.equals("y") 避免空指针异常
                Cookie usernameCookie = new Cookie("username", username);
                usernameCookie.setMaxAge(3600 * 24 * 7);
                Cookie userpassCookie = new Cookie("userpass", userpass);
                userpassCookie.setMaxAge(3600 * 24 * 7);
                //【代码三】
                resp.addCookie(usernameCookie); 
               resp.addCookie(userpassCookie);
            } else {
    
    
                //【代码四】
                Cookie usernameCookie = new Cookie("username", "");
                usernameCookie.setMaxAge(0);
                resp.addCookie(usernameCookie);

                Cookie userpassCookie = new Cookie("userpass", "");
                userpassCookie.setMaxAge(0);
                resp.addCookie(userpassCookie);
            }

        } else {
    
    
            resp.getWriter().println("用户名或密码错误");
        }
    }
}

2、实现显示用户浏览过的商品名称

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>

        <h3>商品列表</h3>
        <a href="<%=request.getContextPath()%>/display?name=ThinkPad">ThinkPad</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=Lenovo">Lenovo</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=Apple">Apple</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=Sony">Sony</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=Dell">Dell</a><br/>
        <a href="<%=request.getContextPath()%>/display?name=ACER">ACER</a><br/>
        
        <h3>浏览过的商品</h3>
        <%
           /*【代码一】从Cookie中读取名为“goods”的值,URLDecoder解码后显示在页面中 */
            String goods = "";
    		Cookie[] cookies = request.getCookies();
    		if (cookies != null) {
    
    
        		for (Cookie c: cookies) {
    
    
            		if ("goods".equals(c.getName())){
    
    
              	 		goods = URLDecoder.decode(c.getValue(),"UTF-8");
               	  		break;
            		}
        		}
    		}
        %>
		<%= goods %>
    </body>
</html>
package it.servlet;

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

@WebServlet("/display")
public class DisplayServlet extends HttpServlet {
    
    

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
       //【代码二】声明并初始化变量goods
		String goods = "";

       //读取cookie
        Cookie[] cookies = req.getCookies();        
        if (cookies != null) {
    
    
            for (Cookie c : cookies) {
    
    
                if ("goods".equals(c.getName())) {
    
    
					goods = URLDecoder.decode(c.getValue(),"utf-8");
                    break;
                }
            }
        }

        //【代码三】从请求对象中,获取被点击的商品名,赋值给name
		String name = req.getParameter("name");
      
        //判断goods中是否包含被点击的商品名。若不包含,则将商品名添加到goods中。
        if (!goods.contains(name)) {
    
    
            goods =  name +" "+goods; //用空格分隔不同的商品名

        }
       
        //【代码四】将goods进行URLEncoder编码后,存储到客户端浏览器的cookie中
		Cookie goodsCookie = new Cookie("goods", URLEncoder.encode(goods, "utf-8"));
        resp.addCookie(goodsCookie);        

        resp.sendRedirect(req.getContextPath() + "/display.jsp");
    }

}

四、资料自提(若过期,请私信)

链接:https://pan.baidu.com/s/1gGdqLeZmlmWBqXrW-pyX7Q?pwd=sdiq
提取码:sdiq

猜你喜欢

转载自blog.csdn.net/qq_52495761/article/details/134962765