网站自动登录功能实现

news/2024/5/13 16:08:14/文章来源:https://blog.csdn.net/Megustas_JJC/article/details/53898273

功能:第一次登录时,勾选自动登录,关闭浏览器,再次打开,系统会自动进行用户已经登陆状态

实现用户自动登录的过滤器:

  • 在用户登录成功后,以cookis形式发送用户名、密码给客户端
  • 编写一个过滤器,filter方法中检查cookie中是否带有用户名、密码信息,如果存在则调用业务层登陆方法,登陆成功后则向session(关于session介绍见http://blog.csdn.net/megustas_jjc/article/details/53443012)中存入user对象(即用户登陆标记),以实现程序完成自动登陆。

这里写图片描述

数据库保存用户信息

(1)创建数据表

create table user{id int primary key auto_increment,username varchar(40),password varchar(40),role varchar(40)
}

(2)插入数据

insert into user values(null,'aaa','111','admin');
insert into user values(null,'bbb','111','user');
insert into user values(null,'ccc','111','user');

登录界面

<body>
<h1>登录表单</h1>
<h3 style="color:red;">${msg }</h3>
<form action="/megustas/login" method="post"><table><tr><td>用户名</td><td><input type="text" name="username" /></td></tr><tr><td>密码</td><td><input type="password" name="password" /></td></tr><tr><td><input type="checkbox" name="autologin" value="true" /></td><td>自动登录</td>   </tr><tr><td colspan="2"><input type="submit" value="登录" /></td></tr></table>
</form>
</body>

连接数据库完成登录

(为了简洁,此处不使用DAO模式,直接将数据库的相关操作写入servlet)

定义一个JavaBean存储用户数据

public class User {private int id;private String username;private String password;private String role;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}}

连接数据库进行登录

public class LoginServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获得用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");// MD5 加密password = DigestUtils.md5(password);// 查询数据库String sql = "select * from user where username = ? and password= ?";Object[] args = { username, password };QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());try {User user = queryRunner.query(sql,new BeanHandler<User>(User.class), args);if (user == null) {// 查询用户不存在,登陆失败request.setAttribute("msg", "用户名或者密码错误");//转发可以传数据,重定向不可以传数据request.getRequestDispatcher("/megustas/login.jsp").forward(request, response);} else {// 登陆成功// 判断是否勾选自动登陆if ("true".equals(request.getParameter("autologin"))) {// 用户勾选了 自动登陆// 将用户名和密码 以cookie形式写给客户端Cookie cookie = new Cookie("autologin", URLEncoder.encode(username, "utf-8")+ "." + password);cookie.setMaxAge(60 * 60);cookie.setPath("/megustas");response.addCookie(cookie);}// 将成功信息 保存Sessionrequest.getSession().setAttribute("user", user); // 表示已经登陆response.sendRedirect("/megustas/demo4/welcome.jsp");}} catch (SQLException e) {e.printStackTrace();}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

欢迎界面

<body>
<!-- 根据session中是否存在user对象,判断用户是否登陆 -->
<c:if test="${empty user}"><h1>您还未登陆!去<a href="/megustas/demo4/login.jsp">登陆</a></h1>
</c:if>
<c:if test="${not empty user}"><h1>登陆成功, ${user.username }</h1>
</c:if>
</body>

加密demo

public class DigestUtils {/*** 使用md5的算法进行加密* * @param plainText*            加密原文* @return 加密密文*/public static String md5(String plainText) {byte[] secretBytes = null;try {secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}return new BigInteger(1, secretBytes).toString(16);// 将加密后byte数组// 转换16进制表示}}

自动登录功能

AutoLoginFilter 在什么情况下需要自动登录 ??
1、当前用户必须未登陆
2、存在自动登录cookie信息

  • 自动登陆过滤器,过滤页面一定不包括登录和注册页面

配置(配置自动登录的过滤器,在进入欢迎界面之前检查是否登录)

  <filter><filter-name>AutoLoginFilter</filter-name><filter-class>cn.megustas.demo4.AutoLoginFilter</filter-class></filter><filter-mapping><filter-name>AutoLoginFilter</filter-name><!-- 访问welcome.jsp 时完成自动登录 --><url-pattern>/demo4/welcome.jsp</url-pattern></filter-mapping>

Filter

public class AutoLoginFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 1、判断当前用户是否已经登录HttpServletRequest httpServletRequest = (HttpServletRequest) request;if (httpServletRequest.getSession().getAttribute("user") == null) {// 未登录// 2、判断autologin对应cookie 是否存在 ---- 将cookie 查询写为工具类Cookie cookie = CookieUtils.findCookie(httpServletRequest.getCookies(), "autologin");if (cookie != null) {// 找到了自动登录cookieString username = cookie.getValue().split("\\.")[0];// 如果用户名中文,需要解密username = URLDecoder.decode(username, "utf-8");String password = cookie.getValue().split("\\.")[1];// 获得就是md5 加密密码,此处无需加密// 登录逻辑String sql = "select * from user where username=? and password = ?";Object[] args = { username, password };QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());try {User user = queryRunner.query(sql, new BeanHandler<User>(User.class), args);if (user != null) {httpServletRequest.getSession().setAttribute("user",user);}chain.doFilter(httpServletRequest, response);} catch (SQLException e) {e.printStackTrace();}} else {// 没有自动登录信息chain.doFilter(httpServletRequest, response);}} else {// 已经登录,不需要自动登录chain.doFilter(httpServletRequest, response);}}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}}

其中调用的Utils,cookie查询

public class CookieUtils {// 在cookies 数组中 查找指定name 的cookiepublic static Cookie findCookie(Cookie[] cookies, String name) {if (cookies == null) {// cookie 不存在return null;} else {// cookie 存在for (Cookie cookie : cookies) {if (cookie.getName().equals(name)) {// 找到return cookie;}}// 没有找到return null;}}
}

注意
(1)程序中调用的一些简单的工具包,功能在之前的博客都有实现,故不再赘述
(2)转发和重定向使用
1、使用转发,通过request.setAttribute 传递数据给 页面,路径不要写/工程名 ;

request.setAttribute("msg", "用户名或者密码错误");               request.getRequestDispatcher("/megustas/login.jsp").forward(request, response);

2、使用重定向,不能用request传递数据,路径要写/工程名

response.sendRedirect("/megustas/demo4/welcome.jsp");

3、自动登录过滤器,过滤页面一定不包括登录和注册页面

自动登陆案例问题
1、 如果用户名中文怎么办?

insert into user values(null,'小红','123','user');

解决方案:保存cookie时进行手动编码 URL编码
生成cookie 时 new Cookie(URLEncoder.encode(用户名,"utf-8")); —— LoginServlet
读取cookie时, 对用户进行解码 URLDecoder.decode(用户名,"utf-8"); —- AutoLoginFilter

2、 中文名和密码安全问题
* cookie 是一个文本类型文件,内容非常容易泄露
实际开发中数据库中密码和cookie中密码 都应该加密后保存 —- 单向加密算法 MD5
* MySQL 提供md5 方法进行加密
将数据进行md5 加密

update user set password = md5(password) ;

MD5 破解 —– 多对一映射算法 (运行两个不同明文 产生相同密文 概率很低) —- http://www.cmd5.com/

流程:初次login.jsp进行登录,跳转到welcome.jsp
关闭浏览器,直接登录welcome.jsp,将会由自动登录环节完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_831089.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见实用网站集合(行业研究/政策研究/学习/办公/设计/编程)

常见实用网站集合1.日常办公类1.1 PDF解密1.2 专利查询1.2.1 专利之星检索系统1.2.2 佰腾网2.数据分析及可视化2.1 数据可视化2.1.1 在线画词云图3.设计常用3.1 色谱3.1.1 中国色3.1.2 优色网3.2 创意设计3.2.1 站酷&#xff08;ZCOOL&#xff09;3.3 其他4.程序员常用网站4.1 …

linux 修改 ios 备份文件,linux自动备份网站和数据库,到另外服务器上,为当前用户创建定时任务...

两台服务器111&#xff0c;和117服务器,每天完成111服务器上网站和数据库自动备份到117服务器上1&#xff1a;我的111服务器上是当前用户&#xff1a;sxA: 查看当前用户的计划任务&#xff1a;crontab -l是查看当前用户的任务用 vi crontab -e 是为sxw用户创建一个计划任务第…

虚拟服务器多少够用,虚拟主机放多个网站吗?虚拟主机最多放多少个网站

虚拟主机放多个网站吗&#xff1f;虚拟主机最多放多少个网站&#xff1f;通常来讲&#xff0c;服务商的要求都是一台虚拟主机只能存放一个站点&#xff0c;小站长、博主一般买一台500M-1G空间的虚拟主机完全够用了。但是准备一个新的站点&#xff0c;又不想去买新的虚拟主机&am…

python 爬虫--利用百度图片处理OCR识图API进行验证码识别,并通过python、requests进行网站信息爬取(二)实战

上一篇提到了调用的基础代码&#xff0c;写的很low啊&#xff0c;大家要是有啥优化指示可以直接评论啊谢谢。下面将进行爬虫的实战部分了。 重点声明&#xff1a;本文涉及到基站信息查询网站&#xff0c;这里提示只是学习和参考使用&#xff0c;勿进行商业的暴力用途&#xff…

阿里P9架构师简述从单机至亿级流量大型网站系统架构的演进过程

阶段一、单机构建网站 网站的初期&#xff0c;我们经常会在单机上跑我们所有的程序和软件。此时我们使用一个容器&#xff0c;如tomcat、jetty、jboos&#xff0c;然后直接使用JSP/servlet技术&#xff0c;或者使用一些开源的框架如mavenspringstructhibernate、mavenspringsp…

struts html tld有什么效果_外贸网站域名与网址有什么区别?

在建站过程中&#xff0c;外贸企业都会遇到这样的一个问题&#xff0c;网站应该选择一个什么样的域名呢&#xff1f;可以说&#xff0c;域名就是一个网站的标志&#xff0c;一个好的域名&#xff0c;不仅可以让客户更容易记住&#xff0c;对于网站运营和优化还可以带来意想不到…

不同网站不同网卡_微网站与普通网站究竟有哪些不同之处,优势又在哪

各种网络推广的普及使得一个公司没有网站方面的推广就会大大的落后于同类的有推广的企业。网宣的效果实打实的摆在眼前&#xff0c;这使得人们不得不重视网络的力量。近几年&#xff0c;网上出现了一种新的网站形式&#xff0c;叫微网站。这种网站形式当下也非常的火爆&#xf…

python2.7打开webdriver打不开ie_18个提高效率改变生活的网站,为你打开新世界的大门...

本文由什么值得买用户原创:值行哈喽大家好&#xff0c;这里是值行&#xff0c;我是小编桃子。今天小编要分享18个超赞的网站&#xff0c;每一个都好用到不行&#xff01;如果你之前没用过这些网站&#xff0c;保证这篇文章带你打开新世界的的大门。1.Firefox Send(临时网盘、私…

使用 html 来创建站点,怎样使用HTML创建免费网站

步骤1&#xff1a;子域。要启动基本网站&#xff0c;您需要获取一个子域。子域是作为常规URL的辅助元素的URL。子域的一个示例是woddlegames.bananimated.com或thezombiefuture.webs.com。为了使您的网站正常运行&#xff0c;我们将使用webs.com来获取我们的子域。创建一个Web帐…

html的细节优化,网站图片优化细节放送(seo技巧)

做seo的老铁们难免会遇到网站图片优化处理不到位&#xff0c;大多数的套话都是围绕着数据来说的&#xff0c;其实这也没什么&#xff0c;重点是我们的细节处理不到位就算数据正确也不好办&#xff0c;那么接下来让凯夜seo为您放送一些图片优化的细节&#xff0c;规整数据的使用…

HTMLCSS 入门:《HTML CSS 设计与构建网站》NOTES------CSS

文章目录《HTML & CSS 设计与构建网站》学习笔记CSS简介颜色盒子列表、表格和表单列表表格表单布局图像HTML布局《HTML & CSS 设计与构建网站》学习笔记 CSS简介 CSS通过将规则和**HTML元素相关联的方式来工作&#xff0c;这些规则用来控制指定元素中的内容如何显示一…

怎么取消https访问_Firefox 74稳定版发布:禁止访问TLS 1.0/1.1的HTTPS网站

适用于Windows、macOS和GNU/Linux桌面平台&#xff0c;Mozilla今天刚刚发布了Firefox 74版本更新&#xff0c;目前用户可以访问官方服务器进行下载。不过目前更新日志并未放出&#xff0c;不过可以确认是首个禁止访问使用TLS 1.0和TLS 1.1的HTTPS 网站的浏览器版本。访问&#…

换肤 本地创建不同的scss文件 分别申明不同的变量_vue教程-vue+sass+环境变量实现网站换肤...

今天给大家分享一个vuecli3.x sass .env环境变量实现网站换肤的效果。本教程实现了&#xff0c;文字颜色、图片、背景图片的更换效果。准备物料&#xff1a;脚手架&#xff1a;vuecli3.xnpm包&#xff1a;node-sass&#xff0c;sass-loader环境变量文件&#xff1a;.env.a, .…

阿里云搭建个人网站:Ubuntu16.04+Nginx+Mysql+PHP 搭建wordpress

前言&#xff1a;想必&#xff0c;搭建个人网站是很多技术流同学的梦想&#xff0c;也是对自身知识的一次小小实践。2020疫情在家期间&#xff0c;时间充裕正好趁此机会搭建属于自己的网站。 搭建个人网站一般选择常用、稳定可靠并且花费便宜的方案。综合考虑之下&#xff0c;…

网站服务器抢单,可以用云服务器抢单嘛

可以用云服务器抢单嘛 内容精选换一换场景公有云支持CSBS应用一致性备份对SAP HANA进行备份&#xff0c;在同一可用区内&#xff0c;通过部署单机SAP HANA&#xff0c;用于存放业务数据&#xff0c;随着数据量的增加&#xff0c;之前的备份方式已经满足不了RTO、RPO的要求&…

未备案域名临时跳过备案提示_网站备案及安装网站后台管理系统教程(阿里云为例)...

昨天把我分享了网站的制作流程&#xff0c;从购买域名到设置服务器&#xff0c;基本都给大家做了一个简单的介绍&#xff0c;下面我再来分享一下如何进行网站备案以及安装网站后台管理系统吧。系统什么是网站后台管理系统&#xff1f;网站后台管理系统主要是用于对网站前台的信…

net导出excel页面不自动刷新_EXCEL---爬取网站数据,小白也能学会

今天要给大家安利的是一个Excel里很简单实用却常常被忽略的功能。在生活工作中对爬取网站数据有需求的你千万不要错过啦~&#xff01;最近&#xff0c;朋友LJ在研究P2P公司&#xff0c;看到网贷之家一份网贷指数数据,想把它复制到Excel中&#xff0c;便于整理、分析。网址&…

a标签怎么传参_2020年SEO优化-网页的标题标签(Title Tag)要怎么写才是最优化?...

2020年SEO优化-网页的标题标签&#xff08;Title Tag&#xff09;要怎么写才是最优化&#xff1f;1、网页的标题标签有效长度是64个字节&#xff0c;汉语是32个字。长出来的部分无益有弊。为什么网页的标题标签太长反而不好&#xff1f;2、标题标签中务必出现这个页面的关键词&…

html设置文字超过字数_独立建站,个人网站,网站TDK设置都有哪些原则

网站TDK设置都有哪些原则一个标准的html页面&#xff0c;头部应该至少包含让搜索引擎蜘蛛辨别的网页标题(title)、页面描述(description)、页面关键词(keywords)&#xff0c;这便是我们常说的TDK&#xff0c;用浏览器打开网页&#xff0c;右键查看源代码便可以看到tdk&#xff…

宝塔面板网站一打开cpu百分百_宝塔面板优化之Mysql数据库性能调优

在PHPMYSQL架构网站运行过程中&#xff0c;往往会遇到各种性能问题影响&#xff0c;如MySQL、PHP、CPU、磁盘IO、缓存等&#xff0c;其中MySQL瓶颈就是最常见也最难解决的一种影响网站性能的因素&#xff1b;通常&#xff0c;我们会使用redis、memcached等缓存软件来缓存内容&a…