三天自动登陆项目源码GitHub地址-LoginSystem


一、请求乱码问题解决

     // 设置请求、响应编码格式req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");

二、Servlet 的使用流程总结

Servlet 的使用流程

(1)设置请求编码格式
(2)设置响应编码格式
(3)获取请求信息
(4)处理请求信息
(5)响应处理结果

数据流转流程

浏览器------>服务器------->数据库
浏览器<------服务器<-------数据库


三、请求转发、重定向、Cookie学习笔记

1、请求转发

问题:
服务器在接收到浏览器的请求后,仅仅使用一个Servlet 进行请求处理,会造成不同的Servlet 逻辑代码冗余,Servlet 的职责不明确。

解决:
使用请求转发。

 // 请求转发req.setAttribute("str", "用户名或密码错误");req.getRequestDispatcher("PageServlet").forward(req, resp);return;

特点:
一次请求
地址栏信息不改变。

请求转发中,Request 对象作用域

问题:
使用请求转发后,不同的Servlet 之间怎么进行数据的共享呢?或者说数据怎么从一个servlet 流转给另外一个Servlet 呢?

解决:
使用request 对象的作用域

使用:

//发送request的servlet
request.setAttribute(Object name,Object value);//接收request的servlet
request.getAttribute(Object obj);

作用:
解决了一次请求内的不同Servlet 的数据(请求数据+其他数据)共享问题。

作用域:
基于请求转发,一次请求中的所有Servlet 共享。

注意:
使用Request 对象进行数据流转,数据只在一次请求内有效。

特点:
服务器创建
每次请求都会创建
生命周期一次请求


2、重定向

问题:
如果当前的请求,Servlet 无法进行处理怎么办?
如果使用请求转发,造成表单数据重复提交怎么办?

解决:
使用重定向

使用:
response.sendRedirect(“路径”).
本地路径为:uri
网络路径为:定向资源的URL 信息

特点:
两次请求
浏览器地址栏信息改变
避免表单重复提交


3、Cookie

目前大家对于浏览器和服务器的交互模式,以及请求的处理都有了理解,并且也能够进行请求的处理。本节课围绕整个流程再次进行技术优化,重点学习 Cookie 技术,此技术的应用面是非常广的。

问题:
HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁。
如果第二次的请求需要使用相同的请求数据怎么办呢?
难道是让用户再次请求书写吗?

解决
使用Cookie 技术

解释:
Cookie 技术其实是浏览器端的数据存储技术,解决了不同请求需要使用相同的请求数据的问题。
我们把请求需要共享的请求数据,存储在浏览器端,避免用户进行重复的书写请求数据。
但是哪些数据需要使用Cookie 技术存储起来是一个主观问题,需要在后台进行响应的时候来告诉浏览器,有些数据其他请求还会使用,需要存储起来。

特点:
浏览器端的数据存储技术
适合少量数据
键值对
不安全

使用:

(1)Cookie 数据存储:

  • 临时存储:不设置cookie 信息的存储时间,周期为一次会话,存储在浏览器内存中
  • 定时存储:设置存储时间,周期为时间设置,存储在用户电脑中。
Cookie c = new Cookie("uid", ((User) result).getUid() + "");c.setMaxAge(5 * 60);// 定时存储5分钟c.setPath("CookieServlet");resp.addCookie(c);

(2)Cookie 数据获取:

Cookie[] cks = req.getCookies();

总结:
Cookie 技术解决了不同请求发送之间的数据共享问题。


4、Cookie 学习案例之三天免登录

(1)PageServlet.java

用于打印html登录页面

package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class PageServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");String str = (String) req.getAttribute("str") == null ? "" : (String) req.getAttribute("str");// 错误提示resp.getWriter().write("<html>");resp.getWriter().write("<head>");resp.getWriter().write("</head>");resp.getWriter().write("<body>");resp.getWriter().write("<font color='red' size='20px'>" + str + "</font>");resp.getWriter().write("<form action='LoginServlet' method='get'>");resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>");resp.getWriter().write("密码:<input type='password' name='upwd' value=''/><br/>");resp.getWriter().write("<input type='submit'  value='登录'/><br/>");resp.getWriter().write("</form>");resp.getWriter().write("</body>");resp.getWriter().write("</html>");}
}

(2)MainServlet.java

登陆成功后的欢迎界面

package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MainServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 设置请求、响应编码格式req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// 获取请求信息// 处理请求信息// 响应处理结果resp.getWriter().write("<html>");resp.getWriter().write("<head>");resp.getWriter().write("</head>");resp.getWriter().write("<body>");resp.getWriter().write("<h3>欢迎 " + req.getParameter("uname") + " 访问尚学堂管理系统</h3>"); // 只有请求转发才有效resp.getWriter().write("<hr>");resp.getWriter().write("</body>");resp.getWriter().write("</html>");}
}

(3)LoginServlet.java

点击登录按钮后的检测界面

  • 如果直接访问/登录失败,将重定向至PageServlet页
  • 如果登陆成功,则重定向至MainServlet页
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import cn.hanquan.orm.core.Query;
import cn.hanquan.orm.core.QueryFactory;
import cn.hanquan.orm.po.User;public class LoginServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置请求、响应编码格式req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// 获取请求信息String uname = req.getParameter("uname");String upwd = req.getParameter("upwd");System.out.println("获取到uname=" + uname + "upwd=" + upwd);// 处理请求信息if (uname == null || upwd == null) {// 避免直接访问此页报空指针resp.sendRedirect("PageServlet");return;}User u = new User();u.setUname(uname);u.setUpwd(upwd);Query q = QueryFactory.createQuery();Object result = q.queryUniqueRow("select * from user where uname=? and upwd=?", User.class,new String[] { uname, upwd });System.out.println(result);// 登录结果if (result != null) {// rightCookie c = new Cookie("uid", ((User) result).getUid() + "");c.setMaxAge(5 * 60);c.setPath("CookieServlet");resp.addCookie(c);// 请求转发req.setAttribute("uname", u.getUname());req.getRequestDispatcher("MainServlet").forward(req, resp);
//          // 重定向
//          resp.sendRedirect("MainServlet");return;} else {// wrong// 请求转发req.setAttribute("str", "用户名或密码错误");req.getRequestDispatcher("PageServlet").forward(req, resp);return;}}
}

(4)CookieServlet

缓存检测界面

  • 如果有之前登录记录的缓存数据uid,则二次验证用户是否存在,然后重定向至MainServlet页
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import cn.hanquan.orm.core.Query;
import cn.hanquan.orm.core.QueryFactory;
import cn.hanquan.orm.po.User;public class CookieServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");Cookie[] cks = req.getCookies();if (cks != null) {String uid = "";for (Cookie c : cks) {if ("uid".equals(c.getName())) {uid = c.getValue();}}if ("".equals(uid)) {// 部分cookie被用户删除req.setAttribute("str", "你清理了cookie吗");req.getRequestDispatcher("page").forward(req, resp);return;} else {// 二次验证用户存在User u = new User();u.setUid(Integer.parseInt(uid));Query q = QueryFactory.createQuery();Object result = q.queryUniqueRow("select * from user where uid=?", User.class, new String[] { uid });if (result != null) {resp.sendRedirect("MainServlet");return;} else {req.setAttribute("str", "你似乎不在数据库里了");req.getRequestDispatcher("/PageServlet").forward(req, resp);return;}}} else {req.getRequestDispatcher("page").forward(req, resp);return;}}
}

5、运行效果示例

(1)数据库表结构

(2)登录页面

(3)成功登录结果页面


【Servlet】请求转发、重定向、Cookie使用之三天自动登陆相关推荐

  1. Servlet 请求转发(forword)与重定向(sendredirect)的区别

    servlet请求转发与重定向的区别: request.setAttribute("test","hello"); request.getRequestDisp ...

  2. 解决servlet请求转发、响应重定向无法实现页面跳转问题

    问题:login.html能正常运行,但当用户名和密码正确后,点击登录按钮,通过html页面的action属性值和servlet页面的urlPatterns属性值,实现servlet请求转发,无法实现 ...

  3. Servlet--06--解决乱码问题; 请求转发; 重定向;

    乱码问题: 一.  请求-乱码问题:服务器获取的请求数据,在console显示时,出现了乱码. (1)post请求方式解决:req.serCharacterEncoding("utf-8&q ...

  4. httpservletresponse 重定向浏览器不变的原因_JavaWeb——Servlet——请求转发与响应重定向...

    导语:在实际的软件开发过程中,往往需要多个Servlet来实现不同的功能,就需要对多个Servlet进行组合调用.多个Servlet之间如何进行通信和跳转?而这就需要用到请求转发与响应重定向技术. 原 ...

  5. 重定向 请求转发 与cookie

    什么是cookie cookie可以说是一种缓存,cookie不是jsp内置对象,所以我们在使用的时候需要创建它,而cookie是由服务器创建,然后发送给客户端. 服务器端创建cookie Cooki ...

  6. Servlet请求转发中文乱码解决

    2019独角兽企业重金招聘Python工程师标准>>> 在Servlet的使用过程中,如果在请求转发的同时需要获得输出流并且写出数据的时候,需要设定resp 的编码格式,否则的话,跳 ...

  7. springmvc重定向到另一个项目_SpringMVC结合Ajax、请求转发重定向、视图解析器

    每日总结 一.Spring结合Ajax的处理方式 1.传统解决方案 直接输出 2.使用SpringMVC框架提供的处理方法 注意: A.方法的返回值可以是对象或者集合 B.响应给前台的数据直接是jso ...

  8. servlet请求转发

    来源:http://www.2cto.com/kf/201610/554591.html 请求转发:Servlet(源组件)先对客户请求做一些预处理操作(数据处理),然后把请求转发给其他Web组件(目 ...

  9. php 请求转发 重定向,PHP怎么实现页面重定向?(图文+视频)

    本篇文章主要给大家介绍PHP实现页面重定向的三种方法详解. 那什么是页面重定向呢? 在网站开发过程中,当我们遇到网页迁移或者网站调整等情况,我们都需要做个重定向,防止流量错失.页面重定向就是通过各种方 ...

最新文章

  1. java 两个日期的天数_java计算两个日期之间的天数
  2. [CODEVS1258]关路灯
  3. java中的值传递和引用传递问题
  4. 快速开发基于 HTML5 网络拓扑图应用之 DataBinding 数据绑定篇
  5. 投资学习网课笔记(part1)--基金第一课
  6. bootstrap guide
  7. 【HDU - 6118】度度熊的交易计划(最小费用可行流,网络流费用流变形 )
  8. yii2 ajax访问控制器,如何在yii2中运行控制器动作作为ajax
  9. Linux安装到一半没有内存了,无论手机运行内存有多大平时都会占用了一半,原来是因为这个...
  10. 如何使用putExtra()和getExtra()来表示字符串数据
  11. Hibernate-03-Hibernate的检索方式
  12. android手机抓包工具 tcp协议,Android常用抓包工具之TcpDump
  13. jar文件不能在nokia s60 sdk模拟器中运行
  14. 推行5S现场管理的心得体会
  15. 微信群打卡小程序_微信群不好管理?这几款小程序帮你管理微信群
  16. IDEA解决打开properties乱码问题
  17. |spoj 694|后缀数组|Distinct Substrings
  18. ElasticSearch03_Mapping字段映射、常用类型、数据迁移、ik分词器、自定义分词器
  19. Python虚拟环境之pyenv
  20. 在旧时的桃花里,喊疼

热门文章

  1. js检测鼠标是否在操作_原生JS趣味demo:炫酷头像鼠标追随效果的实现
  2. Gh0st源码学习(三)生成DLL和DAT文件
  3. STL算法学习-- 算法分类
  4. 使用mybatis-generator自动生成代码的方法介绍及踩坑
  5. 面试官给我挖坑:单台服务器并发TCP连接数到底可以有多少 ?
  6. 旋转排序数组系列题详解
  7. 北京冬奥黑科技; 揭秘虎年春晚硬核科技;全球首款AR隐形眼镜问世;索尼3D显示技术路径曝光...
  8. 音视频技术开发周刊 | 216
  9. 【视频编解码的新挑战与新机会】
  10. Netflix在安卓移动启用AV1格式 较VP9编码效率提升20%