博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Web--使用Filter和Cookie实现自动登录
阅读量:2442 次
发布时间:2019-05-10

本文共 5677 字,大约阅读时间需要 18 分钟。

自动登录

在用户登录后进入首页,关闭浏览器后,下次打开浏览器进入首页时往往需要重新登录。

自动登录功能:再次打开浏览器的时候,不需要重新登录就可以进入首页。

实现原理

用户登录后,将用户的用户名和密码保存到Cookie中发送给浏览器,浏览器下次再访问的时候会把cookie内容带回来,服务器从Cookie中取出用户名和密码进行验证,如果验证通过,允许进入首页,从而达到自动登录的目的。

代码实现

首页index.jsp:

<%@ page contentType="text/html;charset=utf-8"%>  test欢迎你:${sessionScope.username }

登录页面login.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title
用户名:
密码:
自动登录:

模拟后台登录的Service方法:

package pers.zhang.service;/** * @author zhang * @date 2019/9/21 - 9:46 */public class LoginServiceImpl {
public boolean login(String username,String password) {
//假设从数据库中查出的用户名为root,密码为1234 return "root".equals(username)&&"1234".equals(password); }}

控制器LoginServlet:

package pers.zhang.servlet;import pers.zhang.service.LoginServiceImpl;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 java.io.IOException;/** * @author zhang * @date 2019/9/21 - 9:48 */public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username"); String password = request.getParameter("password"); String auto = request.getParameter("auto"); //是否自动登录 if(new LoginServiceImpl().login(username, password)) {
//如果登录成功 request.getSession().setAttribute("username", username); if(auto==null) {
//未勾选自动登录 Cookie cookie = new Cookie("auto", null); cookie.setMaxAge(60*60*24);//cookie有效时间 cookie.setPath(request.getContextPath()+"/"); response.addCookie(cookie); }else {
//勾选自动登录 Cookie cookie = new Cookie("auto", username+"_"+password); cookie.setMaxAge(60*60*24);//cookie有效时间 cookie.setPath(request.getContextPath()+"/"); response.addCookie(cookie); } //登录成功,跳转 response.sendRedirect("index.jsp"); }else {
//未登录成功,重新登录 response.sendRedirect("login.jsp"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response); }}

配置:

LoginServlet
pers.zhang.servlet.LoginServlet
LoginServlet
/login

实现自动登录的过滤器LoginFilter:

package pers.zhang.filter;import pers.zhang.service.LoginServiceImpl;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import pers.zhang.utils.CookieUtil;/** * @author zhang * @date 2019/9/21 - 9:56 */public class LoginFilter implements Filter {
public void destroy() {
} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; if(request.getRequestURI().contains("login")) {
//如果访问login,直接放行 chain.doFilter(request, response); return; }else {
String username = (String) request.getSession().getAttribute("username"); if(username==null) {
//sesion中没有,去Cookie中找 String val = CookieUtil.getCookieValByKey("auto", request); if(val!= null&& !val.equals("")) {
String name = val.split("_")[0]; String pass = val.split("_")[1]; if(new LoginServiceImpl().login(name, pass)) {
//重新验证登录 request.getSession().setAttribute("username", name);//登录成功,放入Session,并放行 chain.doFilter(request, response); return; }else {
//验证失败,重新登录 response.sendRedirect("login.jsp"); } }else {
//Cookie中也没有,第一次访问,跳转登录页面 response.sendRedirect("login.jsp"); } }else {
//session中有,放行 chain.doFilter(request, response); return; } } } public void init(FilterConfig config) throws ServletException {
}}

配置:

loginFilter
pers.zhang.filter.LoginFilter
loginFilter
/*

从Cookie中获取用户名的工具类CookieUtil:

package pers.zhang.utils;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;/** * @author zhang * @date 2019/9/21 - 9:57 */public class CookieUtil {
public static String getCookieValByKey(String key, HttpServletRequest request) {
String value = null; Cookie[] cookies = request.getCookies(); if(cookies!= null && cookies.length>0) {
for (Cookie cookie : cookies) {
if(key.equals(cookie.getName())){
value = cookie.getValue(); } } } return value; }}

测试:

启动服务器,访问login.jsp:
在这里插入图片描述
点击登录,成功后跳转index.jsp:
在这里插入图片描述
退出浏览器,再次打开重新访问index.jsp:
在这里插入图片描述
自动登录成功!

注 意 : 在 实 际 开 发 中 , 用 户 名 和 密 码 不 是 明 文 放 在 c o o k i e 中 的 , 需 要 先 进 行 加 密 处 理 后 再 存 入 c o o k i e 中 。 \color{red}{注意:在实际开发中,用户名和密码不是明文放在cookie中的,需要先进行加密处理后再存入cookie中。} cookiecookie

转载地址:http://disqb.baihongyu.com/

你可能感兴趣的文章
GNOME帮助Linux应用于商业桌面环境(转)
查看>>
linux网络知识:与网络设置有关的几个文件(转)
查看>>
Linux文件内容查询命令(转)
查看>>
libc.a 文件恢复(转)
查看>>
SCO UNIX上cpio命令详细用法(转)
查看>>
思考-两个大表的关联.txt
查看>>
WIDTH_BUCKET和NTILE函数.txt
查看>>
sql plan baseline(二)
查看>>
第十章 sqlplus的安全性
查看>>
第十三章 sqlplus命令(一)
查看>>
第三章(backup and recovery 笔记)
查看>>
第一章(backup and recovery 笔记)
查看>>
第六章(backup and recovery 笔记)
查看>>
oracle备份功能简述
查看>>
[转]数据库三大范式
查看>>
恢复编录的创建和使用.txt
查看>>
truncate 命令使用
查看>>
[script]P_CHECK_BLACK.sql 检查当前用户下是否有varchar2字段的末尾包含空格
查看>>
实验-数据分布对执行计划的影响.txt
查看>>
实验-闪回数据库
查看>>