自动登录原理

利用cookie保存用户登录信息,从cookie中获取用户名和密码,不需要用户自己再次输入


为什么用Filter

如果不用Filter,请求每个servlet时,都要有操作cookie的相同代码来处理自动登录,由于filter能够拦截请求,那么我们可以提取相同的代码到filter中,在filter中处理自动登录。


创建user

package cn.itcast.chapter08.entity;
public class User {private String username;private String password;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;}
}

实现登录页面和首页

login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<html>
<head></head>
<center><h3>用户登录</h3></center>
<body style="text-align: center;">
<form action="${pageContext.request.contextPath }/LoginServlet"
method="post">
<table border="1" width="600px" cellpadding="0" cellspacing="0"
align="center" ><tr><td height="30" align="center">用户名:</td><td>&nbsp;&nbsp;<input type="text" name="username" />${errerMsg }</td></tr><tr><td height="30" align="center">密   &nbsp; 码:</td><td>&nbsp;&nbsp;<input type="password" name="password" /></td></tr><tr><td height="35" align="center">自动登录时间</td><td><input type="radio" name="autologin" value="${60*60*24*31 }" />一个月<input type="radio" name="autologin" value="${60*60*24*31*3 }" />三个月<input type="radio" name="autologin" value="${60*60*24*31*6 }" />半年<input type="radio" name="autologin" value="${60*60*24*31*12 }" />一年</td></tr><tr><td height="30" colspan="2" align="center"><input type="submit" value="登录" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset" value="重置" /></td></tr>
</table>
</form>
</body>
<html>

index.jsp(需要添加支持jstl的jar【jstl.jar和standard.jar】)

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>显示登录的用户信息</title>
</head>
<body><br /><center><h3>欢迎光临</h3></center><br /><br /><c:choose><c:when test="${sessionScope.user==null }"><a href="${pageContext.request.contextPath }/login.jsp">用户登录</a></c:when><c:otherwise>欢迎你,${sessionScope.user.username }!<a href="${pageContext.request.contextPath }/LogoutServlet">注销</a></c:otherwise></c:choose><hr />
</body>
</html>

创建两个servlet

LoginServlet

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");// 检查用户名和密码if ("itcast".equals(username) && "123456".equals(password)) {// 登录成功// 将用户状态 user 对象存入 session域User user = new User();user.setUsername(username);user.setPassword(password);request.getSession().setAttribute("user", user);// 获取用户选择的自动登录有效时间String autoLogin = request.getParameter("autologin");if (autoLogin != null) {// 注意 cookie 中的密码要加密Cookie cookie = new Cookie("autologin", username + "-"+ password);cookie.setMaxAge(Integer.parseInt(autoLogin));cookie.setPath(request.getContextPath());response.addCookie(cookie);}// 跳转至首页response.sendRedirect(request.getContextPath()+"/index.jsp");} else {request.setAttribute("errerMsg", "用户名或密码错");request.getRequestDispatcher("/login.jsp").forward(request,response);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

LogoutServlet

public class LogoutServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 用户注销request.getSession().removeAttribute("user");// 从客户端删除自动登录的cookieCookie cookie = new Cookie("autologin", "msg");cookie.setPath(request.getContextPath());cookie.setMaxAge(0);response.addCookie(cookie);response.sendRedirect(request.getContextPath()+"/index.jsp"); }public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

创建过滤器AutoLoginFilter

public class AutoLoginFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest req, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;// 获得一个名为 autologin 的cookieCookie[] cookies = request.getCookies();String autologin = null;for (int i = 0; cookies != null && i < cookies.length; i++) {if ("autologin".equals(cookies[i].getName())) {// 找到了指定的cookieautologin = cookies[i].getValue();break;}}if (autologin != null) {// 做自动登录String[] parts = autologin.split("-");String username = parts[0];String password = parts[1];// 检查用户名和密码if ("itcast".equals(username)&& ("123456").equals(password)) {// 登录成功,将用户状态 user 对象存入 session域User user = new User();user.setUsername(username);user.setPassword(password);request.getSession().setAttribute("user", user);}}// 放行chain.doFilter(request, response);}public void destroy() {}
}

配置映射信息

  <filter><filter-name>AutoLoginFilter</filter-name><filter-class>cn.itcast.chapter08.filter.AutoLoginFilter</filter-class></filter><filter-mapping><filter-name>AutoLoginFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

运行项目,查看结果

http://localhost:8080/chapter08/login.jsp

输入用户名、密码,选择自动登录时间

点击”登录“,结果如下

此时,再打开一个相同的浏览器,访问首页,结果如下 

说明实现了自动登录功能。

单击”注销“,结果如下

再开启一个相同的浏览器,访问首页,结果如上,说明cookie被删除了,也说明自动登录功能只有在用户登录期间才可用。

使用Filter实现用户自动登录相关推荐

  1. win7优化大师_Win7设置某个用户自动登录的方法

    win7系统如何设置用户自动登录呢? 方法一. 1.打开魔方优化大师,找到优化设置大师,依次"用户管理","用户登录管理"功能: 2.勾选"以下列账号 ...

  2. java+filter加密_Javaweb之Filter案例练习-自动登录问题和MD5加密

    自动登录问题和MD5加密 前面已经完成了Filter的自动登录,但是有问题,我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截.这肯定不合适 ...

  3. java实现自动登录_java实现用户自动登录

    自动登录,是为了帮助用户多次使用这个网页时,不用再次输入用户名和密码就可以登录. 自动登录是指用户将用户的登录信息,人,保存到本地的文件中Cookie中. Name,value -声明时 new Co ...

  4. java 自动登录功能_jsp实现用户自动登录功能

    理解并掌握cookie的作用以及利用cookie实现用户的自动登录功能,实现下图效果 当服务器判断出该用户是首次登录的时候,会自动跳转到登录界面等待用户登录,并填入相关信息.通过设置cookie的有效 ...

  5. Linux centos7 配置用户自动登录

    1.编辑文件 [root@CentOS6 ~]# vim /etc/gdm/custom.conf GDM configuration storage [daemon] AutomaticLoginE ...

  6. 【转载】xp用户自动登录

    单击"开始/运行",输入"rundll32 netplwiz.dll,UsersRunDll",按回车键后弹出"用户帐户"窗口,看清楚,这可 ...

  7. windows7系统设置默认用户自动登录

    1. 在开始菜单中搜索"运行",回车打开,或者Win+R打开运行窗口,键入"control userpasswords2"或者"rundll32 ne ...

  8. windows7下实现用户自动登录

    使用情景: 1.所用的用户有时要用到远程登录或者网上邻居之类的,设有密码,但又不想每次开机时输入密码登陆,实现开机自动登陆到桌面. 2.有多个用户,想实现开机自动登陆到某一个用户. 3.装了VMwar ...

  9. Debian 8.0桌面系统root用户登录和root用户自动登录

    Debian桌面环境默认不允许root登录,所以需要修改配置. 一.让Debian可以使用root登录 1)首先修改gdm3的设定文件(/etc/gdm3/daemon.conf),在[securit ...

最新文章

  1. python和c++的相互调用教程
  2. Science:“每周工作进展汇报”在博士培养中的作用
  3. 6.13spring随笔
  4. android 覆盖安装问题
  5. LTV(CLV)模型的实战案例
  6. 关于Hibernate 3
  7. Oracle入门(十四H)之良好的编程实践
  8. java比较时间的先后utc时间,日期、时间与UTC
  9. 【原创】技术人员如何去面试?
  10. 显卡风扇不转电脑黑屏_隔壁妹子电脑坏了怎么办,简单易懂电脑维修方法与技巧收藏备用...
  11. java+io+scanner_Java知识点总结(JavaIO- Scanner类 )
  12. 一、2.结构化解题流程细节
  13. java定时器 多线程_Java多线程 定时器
  14. php微博采集,微博采集方法
  15. 【云存储】IOPS概念及测试方法
  16. ydisk安卓版本_mydisktest
  17. windows10、windows11、windows-server官方下载安装
  18. speedoffice(Word)怎么修改纸张方向
  19. 【软件之道】Word模板的制作及使用
  20. java 将set转成数组,Java程序将Set转换为数组

热门文章

  1. 合并两个有序链表 java_合并两个有序链表
  2. 【Elasticsearch】es 集群健康值 红色 red 分片 未分配
  3. 【elasticsearch】You AutoComplete Me
  4. 【lucene】lucene查询操作
  5. 【Clickhouse】mutation 操作
  6. 【LogStash】LogStash 配置后无法启动的问题
  7. Flink UI: Flink 1.10 如何查看 数据源 的背压(反压)情况(消费kafka)
  8. 【Spring】Spring Bean 定义继承
  9. JVM :执行jinfo命令报错Can't attach symbolicator to the process
  10. spark学习-SparkSQL一些函数的使用