获取表单信息以及会话技术

本文介绍如何在Servlet中处理表单数据,包括获取表单字段、复选框值及利用工具类进行数据封装。同时,探讨了请求转发、重定向及包含的概念,并详细讲解了会话技术中的Cookie与HttpSession的应用。

获取表单数据

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 设置响应编码格式
    response.setContentType("text/html;charset=UTF-8");
    // 告诉服务器 请求内容是什么编码格式
    request.setCharacterEncoding("utf-8");
    // 获取表单中所有提交的数据打印
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String gender = request.getParameter("gender");
    // 获取复选框的值
    String[] hobby =request.getParameterValues("hobby");
    String city = request.getParameter("city");
    System.out.println(username);
    System.out.println(password);
    System.out.println(gender);
    if (hobby != null) {
        for (String string : hobby) {
            System.out.println(string);
        }
    }
    System.out.println(city);



    // 利用getParameterNames()打印表单数据
    Enumeration<String> parameterNames = request.getParameterNames();
    while (parameterNames.hasMoreElements()) {
        String nextElement = parameterNames.nextElement();
        String[] parameterValues = request.getParameterValues(nextElement);
        for (String string : parameterValues) {
            System.out.println(string);
        }
    }




    // 把表单数据封装到对象中
    // 参数1 要封装的对象 该对象要符合javabean规范
    // 参数2 map集合
    User user = new User();
    Map<String, String[]> map = request.getParameterMap();
    try {
        BeanUtils.populate(user, map);
        System.out.println(user);
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

请求转发 请求重定向 请求包含

Request 也是一个域对象

域对象内部就是维护一个map集合(添加删除获取的方法)

##### request域的作用范围: 一次请求当中 可以获取到域中保存的数据

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("Utf-8");
        // 请求转发 获取转发器
        // 只是服务器内部的访问 
        //      路径始终都在项目路径下
        RequestDispatcher dispatcher = request.getRequestDispatcher("http://www.baidu.com");
        dispatcher.forward(request, response);

        // 获取字符流
        PrintWriter out = response.getWriter();

        // 给request域中 添加值
        request.setAttribute("name", "wanglong");
        // 请求包含
        // 相当于把两个页面的响应合成一个响应 返回给浏览器
        // 请求转发 浏览器只能响应一次数据
        request.getRequestDispatcher("/demo03").forward(request, response);

        // fun1(request, response);
        // 请求重定向 查看是否能获取域中的值
        // 重定向是两次请求 不能获取到request域中值
        // 重定向既可以访问 本地服务器 也可以访问非本地服务器
//      response.setHeader("location", "/sh-web-servlet03/demo03");
//      response.setStatus(302);
//      response.sendRedirect("http://www.baidu.com");
        // 响应一句话
        out.write("123");
    }

public class Demo03 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("456");

        String name = (String)request.getAttribute("name");
        System.out.println("demo03" + name);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

会话技术

客户端和服务端 进行交互

当浏览器关闭时 这次会话结束

例如打电话

会话中的两个技术
1.cookie (客户端技术)

cookie是保存在浏览器中的缓存数据

当我发起一个请求 请求一个Servlet

进行逻辑处理 (添加一个商品进购物车)

处理完成后 给客户端一个响应

响应中携带者记录了购买什么相片的cookie

让浏览器保存起来 可以使保存在内存当中(结束会话 cookie被清除)

也可以保存在硬盘当中 (结束会话 依然存在)

当浏览器再一次访问购物车的时候

会携带这个之前保存的cookie 去访问

每个网站可以保存20个cookie 整个浏览器可以保存300个

注意: 第一次访问服务器的时候 是不会携带着cookie去访问的

因为cookie还没产生 只有第一次请求后的响应中可以把cookie写回到浏览器中

2.HttpSession (服务端技术)

session保存在服务端

显示上次登录的时间
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应编码格式
        response.setContentType("text/html;charset=UTF-8");
        // 告诉服务器 请求内容是什么编码格式
        request.setCharacterEncoding("utf-8");
        // 读取cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
        // 遍历数组
        for (Cookie cookie : cookies) {
        if (cookie.getName().equals("lastTime")) {
        // 取出cookie的值
        String value = cookie.getValue();
        // 字符串转long
        long time = Long.parseLong(value);
        // 转成日期
        Date date = new Date(time);
        // 创建一个显示的日期格式
        // 参数就是你想要显示的日期格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 格式化时间
        String lastTime = dateFormat.format(date);
        // 响应回浏览器
        response.getWriter().write("上次的访问时间"+lastTime);
        }
        }
        }

        // 创建cookie 记录当前时间
        Cookie cookie = new Cookie("lastTime", System.currentTimeMillis()+"");
        // 设置cookie的保存路径 工程名+配置网址路径
        // 读取cookie是按 请求的地址 寻找cookie的
        // 如果你配置请求路径没有一级目录 这样全
        // 所有的网址请求 都能 找到这个cookie
        //      cookie.setPath("/");
        cookie.setPath("/sh-web-servlet03/servlet");
        // 设置cookie存活时间
        // 负值 表示 浏览器 关闭 cookie消失
        // 正值 表示 存货的时间
        // 0 表示 删除cookie
        cookie.setMaxAge(300);
        // 把cookie添加进响应当中
        response.addCookie(cookie);

}

public class Demo05 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应编码格式
        response.setContentType("text/html;charset=UTF-8");
        // 告诉服务器 请求内容是什么编码格式
        request.setCharacterEncoding("utf-8");
        // 读取cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            // 遍历数组
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("lastTime")) {
                    // 取出cookie的值
                    String value = cookie.getValue();
                    // 字符串转long
                    long time = Long.parseLong(value);
                    // 转成日期
                    Date date = new Date(time);
                    // 创建一个显示的日期格式
                    // 参数就是你想要显示的日期格式
                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    // 格式化时间
                    String lastTime = dateFormat.format(date);
                    // 响应回浏览器
                    response.getWriter().write("上次的访问时间"+lastTime);
                }
            }
        }
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
登陆后 记录用户名
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应编码格式
        response.setContentType("text/html;charset=UTF-8");
        // 告诉服务器 请求内容是什么编码格式
        request.setCharacterEncoding("utf-8");
        String username = "";
        // 读取cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("username")) {
                    username = cookie.getValue();
                }
            }
        }
        // 打印一下
        System.out.println(username);
        response.getWriter().write("<form action='/sh-web-servlet03/servlet/demo07' method='post'>");
        response.getWriter().write("用户名:<input type='text' name='username' value=" + username +"><br>");
        response.getWriter().write("密码:<input type='text' name='password'><br>");
        response.getWriter().write("记住:<input type='checkbox' name='remember'><br>");
        response.getWriter().write("<input type='submit' value='登录'>");
        response.getWriter().write("</form>");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }


public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应编码格式
        response.setContentType("text/html;charset=UTF-8");
        // 告诉服务器 请求内容是什么编码格式
        request.setCharacterEncoding("utf-8");
        // 获取请求的参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String remember = request.getParameter("remember");
        // 创建cookie
        Cookie cookie = new Cookie("username", username);
        // 设置cookie路径
        cookie.setPath("/sh-web-servlet03/servlet");
        // 处理业务逻辑
        if (username.equals("zhangsan") &&  password.equals("123")) {
            // 判断是否点 记住按钮
            if (remember != null) {
                // 记住 设置存活时间
                cookie.setMaxAge(Integer.MAX_VALUE);
            } else {
                // 删除原来cookie
                cookie.setMaxAge(0);
            }
            // 添加到响应中
            response.addCookie(cookie);
            response.getWriter().write("登录成功");
        } else {
            response.getWriter().write("登录失败");
            // 三秒后 回登录页面
            response.setHeader("refresh", "3;url=/sh-web-servlet03/servlet/demo06");
        }
    }
<think>首先,用户查询的是:"使用会话会话技术实现用户登录的案例"。意思是用户想知道如何用会话技术(如Cookie和Session)来实现用户登录功能的案例。 我查看系统级指令: - 所有行内数学表达式必须用$...$格式,但这里没有数学内容,所以可能不需要。 - 独立公式用$$...$$格式,单独成段,同样不适用。 - LaTeX语法正确,但文本中可能不需要。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落后缀加引用标识,如[^1]。 引用内容提供了: - [1] 描述了会话技术2,包括Cookie和Session入门,用户登录注册案例。 - [2] 包含会话跟踪技术概述,Cookie和Session的使用细节,用户登录注册案例。 - [3] 强调Session存储在服务端,更安全。 - [4] 提到了Cookie技术会话数据保存在浏览器客户端。 - [5] 详细解释了Cookie的工作流程。 用户的上一次问题和我的回答:用户说:"我想查找使用会话会话技术实现用户登录的案例",这不是一个持续的对话;这是一个新的查询。指令说:"请尽可能多的参考用户上一次的问题和你的回答",但在这里,用户的上一次问题是:"我想查找...案例",我没有之前的回答,因为这是新对话的开始。所以,我应该直接基于引用回答。 回答结构: - 指令要求"回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠"。 - 参考示例:"快速排序"部分有简要描述和代码,然后相关问题。 - 所以,我应该提供一个清晰的结构:介绍会话技术,然后逐步解释用户登录案例,最后添加相关问题。 关键点基于引用: - 会话技术包括Cookie和Session。 - Cookie存储在客户端,Session存储在服务端。 - 用户登录案例涉及: - 需求分析:登录、注册、记住我功能。 - 技术实现:使用Cookie记住登录状态,使用Session管理用户会话- 具体步骤:如引用[1]中提到用户登录功能、设置Cookie、验证码功能;引用[4]提到创建Cookie对象;引用[5]解释Cookie工作流程。 构建回答: 1. **介绍会话技术**:简要解释Cookie和Session的区别和用途。 - Cookie:客户端存储,用于记住用户信息- Session:服务端存储,用于维护用户会话状态,更安全。 - 引用[3]强调了Session的安全性。 2. **用户登录案例概述**: - 需求:用户登录、注册、会话管理。 - 基于引用[1]和[2],有用户登录注册案例。 3. **逐步实现**: - **登录功能**:用户输入用户名和密码,验证后创建Session。 - 服务端创建Session ID,存储在Cookie中发送给客户端。 - 客户端后续请求携带Cookie,服务端通过Session ID检索Session数据。 - **记住我功能**:使用Cookie。 - 如引用[1]中的"记住我-Cookie",设置Cookie存储用户名或token。 - 引用[4]提到创建Cookie对象。 - **注册功能**:用户注册新账户。 - **验证码功能**:防止自动化攻击,如引用[1]中的验证码获取和校验。 4. **代码示例**:类似示例中的Python代码,但由于引用是基于Java或Web开发(如提到Tomcat),我应该使用伪代码或描述性代码。 - 引用[4]有Java代码片段:`Cookie cookie = new Cookie("name","value");` - 我可以提供一个简单伪代码或描述。 5. **强调安全**:基于引用[3],使用Session更安全,因为数据在服务端。 6. **相关问题**:生成至少3个相关问题,类似于示例。 引用添加:在回答中,当引用特定点时,在段落末尾添加[^1], [^2]等。例如,提到Cookie工作流程时添加[^5]。 完整回答结构: - 开头:解释会话技术- 主体:逐步描述用户登录案例实现。 - 代码片段:可选。 - 结尾:相关问题。 相关问题想法: 1. Cookie和Session的区别是什么?[^3] 2. 如何使用Session来管理用户状态? 3. 记住我功能如何实现? 4. 会话技术在安全性方面的考量? 确保中文。 </think>### 会话技术实现用户登录案例 会话技术(如Cookie和Session)是Web应用中管理用户状态的核心机制,常用于实现用户登录、注册和会话管理。Cookie将会话数据存储在客户端(浏览器),而Session则将数据存储在服务端,更安全[^3]。以下是一个基于引用内容的用户登录案例逐步实现过程,包括需求分析、技术细节和关键代码示例。案例以Web开发常见框架(如Java Servlet)为例,结构清晰,便于理解。 --- #### **1. 需求分析** 用户登录案例通常包括以下核心需求: - **用户登录**:用户输入用户名和密码,验证成功后创建会话- **记住我功能**:用户可以选择“记住我”,系统通过Cookie保存登录信息,避免重复登录。 - **注册功能**:新用户输入信息注册账户,包括验证码防作弊。 - **会话管理**:登录后,系统使用Session维护用户状态,确保后续请求有权限访问受限资源[^1][^2][^4]。 引用表明,Cookie用于客户端存储(如记住用户名),而Session用于服务端存储(如用户ID),两者结合确保安全性和便捷性[^3][^5]。 --- #### **2. 逐步实现案例步骤** ##### **步骤1: 用户登录功能** - **描述**:用户提交登录表单(用户名和密码),服务端验证凭证。如果验证成功,创建Session存储用户信息(如用户ID),并返回响应。 - **技术实现**: - 服务端使用Session存储用户数据。Session ID通过Cookie自动发送给客户端。 - 客户端后续请求携带Session ID Cookie,服务端据此检索Session数据,维持登录状态。 - Session存储在服务端,减少数据泄露风险[^3][^5]。 - **伪代码示例(Java Servlet):** ```java // 登录处理Servlet protected void doPost(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); String password = request.getParameter("password"); // 验证用户凭证(例如,查询数据库) if (UserValidator.validate(username, password)) { // 创建或获取Session HttpSession session = request.getSession(); session.setAttribute("user", username); // 存储用户信息到Session // 重定向到主页 response.sendRedirect("home.jsp"); } else { // 返回错误页面 response.sendRedirect("login_error.jsp"); } } ``` - **解释**:Session对象通过`request.getSession()`创建,存储用户数据。客户端自动接收到Session ID的Cookie(如`JSESSIONID`),无需手动设置[^2][^4][^5]。 ##### **步骤2: 记住我功能(使用Cookie)** - **描述**:用户勾选“记住我”时,系统通过Cookie保存用户名或token,下次访问时自动填充登录表单- **技术实现**: - Cookie存储在客户端浏览器,设置存活时间(如7天)。 - 服务端创建Cookie对象并添加到响应头,浏览器自动存储;后续请求中,浏览器自动携带Cookie供服务端读取[^1][^4][^5]。 - **伪代码示例(设置和获取Cookie):** ```java // 设置Cookie(在登录成功时) protected void doPost(HttpServletRequest request, HttpServletResponse response) { // ... 登录验证成功后 if (request.getParameter("rememberMe") != null) { Cookie usernameCookie = new Cookie("username", username); // 创建Cookie usernameCookie.setMaxAge(60 * 60 * 24 * 7); // 设置存活时间(7天) response.addCookie(usernameCookie); // 添加到响应头 } } // 获取Cookie(在登录页面加载时) protected void doGet(HttpServletRequest request, HttpServletResponse response) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("username")) { // 自动填充用户名到表单 request.setAttribute("savedUsername", cookie.getValue()); } } } } ``` - **解释**:Cookie通过`new Cookie(key, value)`创建,`setMaxAge`设置过期时间。浏览器在请求头中自动携带Cookie(如`Cookie: username=john`),服务端通过`request.getCookies()`解析[^1][^4][^5]。 ##### **步骤3: 注册功能与验证码** - **描述**:注册时用户输入信息,系统添加验证码校验(防止机器人注册)。 - **技术实现**: - 验证码生成后存储在Session中,用户提交表单时比较Session中的验证码值。 - 注册成功后,自动创建Session或Cookie管理新用户会话[^1][^2]。 - **伪代码示例(验证码校验):** ```java // 生成验证码并存储到Session protected void doGet(HttpServletRequest request, HttpServletResponse response) { String captcha = CaptchaGenerator.generate(); // 生成随机验证码 HttpSession session = request.getSession(); session.setAttribute("captcha", captcha); // 存储到Session // 将captcha以图片形式输出到响应(省略图像生成代码) } // 注册处理(校验验证码) protected void doPost(HttpServletRequest request, HttpServletResponse response) { String userCaptcha = request.getParameter("captcha"); HttpSession session = request.getSession(); String savedCaptcha = (String) session.getAttribute("captcha"); if (userCaptcha.equals(savedCaptcha)) { // 验证码正确,处理注册逻辑(如保存到数据库) session.removeAttribute("captcha"); // 清除Session中的验证码 response.sendRedirect("login.jsp"); // 跳转到登录页 } else { // 验证码错误 response.sendRedirect("register_error.jsp"); } } ``` - **解释**:验证码存储在Session中,确保服务端验证,避免客户端篡改[^1]。 ##### **步骤4: 会话管理与安全** - **Session钝化与活化**:当服务器重启时,Session数据可序列化存储(钝化),重启后恢复(活化),确保数据不丢失[^2]。 - **Session销毁**:用户注销或Session超时(默认30分钟)时,服务端清除Session数据。 ```java // 用户注销 protected void doGet(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); // 销毁Session } // 清除记住我Cookie(可选) Cookie cookie = new Cookie("username", ""); cookie.setMaxAge(0); // 设置过期时间为0,删除Cookie response.addCookie(cookie); response.sendRedirect("login.jsp"); } ``` - **安全提示**:优先使用Session存储敏感数据(如用户ID),因为它存储在服务端,比Cookie更安全;Cookie只用于非敏感信息(如用户名)[^3][^5]。 --- #### **3. 案例总结** 此案例展示了会话技术如何协同工作:Session处理核心认证(确保安全),Cookie辅助便捷功能(如记住我)。开发中需注意: - **安全性**:Session ID应通过HTTP-only Cookie传输,防止XSS攻击;敏感数据避免存储在Cookie中[^3][^5]。 - **性能**:Session数据量大时,使用数据库或缓存优化存储。 引用[^1][^2]提供了完整的环境准备和测试指南,建议参考实际项目源码加深理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值