为了方便用户登录,差点儿全部的站点都实现了“记住password”、“自己主动登陆”这样似乎人性化的功能。

我也非常喜欢这个功能,由于我自己的脑子实在是讨厌记东西。

为了安全起见。我的password都设置的非常复杂,满足“数字+特殊符号+英文字母大写和小写”。

但password一复杂,我就总记不住,就想让站点替我记住。

但殊不知。这背后隐藏着巨大的风险。

我先劝大家一声:“危急,不要任意让站点记住password自己主动登陆。”

要了解事情的真相,请随我来看一看怎样利用cookie实现记住password自己主动登陆。

第一步、构建form表单

<form class="form-signin required-validate" action="${ctx}/login?callbackType=forward">
${token}
<div class="form-group">
<div class="row">
<input class="form-control" type="text" autofocus name="username" value="${username}" placeholder="请输入会员编号" />
</div>
</div> <div class="blank10"></div> <div class="form-group">
<div class="row">
<input class="form-control" type="password" name="password" value="${password}" placeholder="请输入登录password" />
</div>
</div> <div class="form-group">
<div class="row">
<div class="checkbox">
<label> <input type="checkbox" value="1" <c:if test="${isSave == 'true'}">checked</c:if> name="isSave" /> 下次自己主动登录
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
</div>
</div> </form>

第二步、登陆时利用cookie记住password

@RequestMapping("/login")
public ModelAndView login(HttpServletResponse response,
@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password", required = false) String password) {
try {
boolean isSave = getParaToBoolean("isSave", false);
logger.debug("isSaved " + isSave); // 尝试获取cookie
String cookieUser = CookieUtil.getCookieByName(request, Constants.COOKIE_USER);
logger.debug("cookie的值为:" + cookieUser); // 验证用户信息
Members user = memberService.selectByUsername(username);
// 假设IP不同。则清除cookie
if (cookieUser != null) {
if (!user.getLastip().equals(request.getRemoteAddr())) {
// 移除自己主动登录cookie信息
CookieUtil.removeCookie(response, Constants.COOKIE_USER);// 删除cookie
}
} MembersValidator.checkPassword(password, user.getPassword()); user.setLastip(request.getRemoteAddr());// 更新登录id 和最后登录时间
memberService.updateLastvisit(user); checkToken(); int max_age = Variables.cookie_expire * 3600 * 24;
if (isSave) {
// 将自己主动登录信息存入cookie
CookieUtil.setCookie(response, Constants.COOKIE_USER,
DesUtils.encrypt(username + "," + password + "," + isSave), max_age);
} else {
// 移除自己主动登录cookie信息
CookieUtil.removeCookie(response, Constants.COOKIE_USER);// 删除cookie
} logger.debug("登陆成功后跳转");
return ajaxDoneSuccess(user.getUid().toString(), (String) getSessionAttr(Constants.BEFORE_LOGIN_URL));
} catch (Exception e) {
logger.error(e.getMessage());
logger.error(e.getMessage(), e); return ajaxDoneError(Constants.SERVER_ERROR);
}
}

这部分代码也非常清晰明了,就不做多的解释。

附上CookieUtil.java类

/**
* Cookie工具类
*
*/
public class CookieUtil { /**
* 加入cookie
*
* @param response
* @param name
* @param value
* @param maxAge
*/
public static void setCookie(HttpServletResponse response, String name, String value, int maxAge) {
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
if (maxAge > 0) {
cookie.setMaxAge(maxAge);
}
response.addCookie(cookie);
} /**
* 删除cookie
*
* @param response
* @param name
*/
public static void removeCookie(HttpServletResponse response, String name) {
Cookie uid = new Cookie(name, null);
uid.setPath("/");
uid.setMaxAge(0);
response.addCookie(uid);
} /**
* 获取cookie值
*
* @param request
* @return
*/
public static String getCookieByName(HttpServletRequest request, String cookieName) {
Cookie cookies[] = request.getCookies();
if (cookies == null) {
return null;
} for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
return cookie.getValue();
}
}
return null;
}
}

第三步、从cookie中取出登陆用户名、password等关键信息

@RequestMapping("/initLogin")
public ModelAndView initLogin() {
logger.debug("进入登陆页");
try {
ModelAndView initView = new ModelAndView("login"); String cookieUser = CookieUtil.getCookieByName(request, Constants.COOKIE_USER);
if (cookieUser != null) {
String decode = DesUtils.decrypt(cookieUser);
String[] cookieUsers = decode.split(",");
initView.addObject("username", cookieUsers[0]);
initView.addObject("password", cookieUsers[1]);
initView.addObject("isSave", cookieUsers[2]);
} createToken(); return initView;
} catch (Exception e) {
logger.error(e.getMessage());
logger.error(e.getMessage(), e); return error300(Constants.SERVER_ERROR);
} }

当我输入了账号、以及password后。勾选上“下次自己主动登陆”。那么系统在验证通过后,就会通过cookie记住我的用户名和password,下次不用再输入账号和password。直接点击登陆就进入系统。

到此为止,自己主动登陆的功能已经实现了。

那么,如今能够说一些负责任的话了。

在浏览器的开发人员模式下,注意红色框中的“type=’password’”,此时我们将type改动为text。

注意,注意,你是不是已经发现了,password不再是password了。成了明文了。

你,此刻是否心惊肉跳了?

对,XX(这文章会被和谐吗,不至于吧,这早已经不是秘密了。是个程序猿都知道)也这样!

所以。作为一个不务正业的IT狗来说,我奉劝各位,“危急。不要任意让站点记住password自己主动登陆!



假如你的电脑这会被我用。而你又选择让站点记住password。那对不起了,你再复杂的password也只是是一串明文而已!

当然了。放心了。我是不会去看你的password了。

只是浏览器会不会看你的password我就不敢保证了。

既然为了安全,设置了超长超复杂的password,那么每次就手动输一下嘛,不麻烦,安全得非常!

不务正业的IT狗,喜欢读书和写作!

微信扫一扫下方二维码就可以关注 沉默王二 公众号:

危急,不要任意让站点记住password自己主动登陆!的更多相关文章

  1. Linux下无需输入password自己主动登陆sshserver方法

    用OpenSSH在linux下登陆sshserver时.每次都提示要输入password,并且使用vim 的netrw插件编辑远程文件时每次改动后保存都要输password,很麻烦. 查看了netrw ...

  2. Android记住password后自己主动登录

    /**  *   * @author alex  * @version 2014-7-31下午5:25:45  *  */ public class LoginActivity extends Act ...

  3. Android之记住密码与自动登陆实现

    本文主要讲述了利用sharedpreference实现记住密码与自动登陆功能 根据checkbox的状态存储用户名与密码 将结果保存在自定义的application中,成为全局变量 布局文件 < ...

  4. sharepreference实现记住password功能

        SharePreference是用于保存数据用的.主要调用Context.getSharePreferences(String name, int mode)方法来得到SharePrefere ...

  5. 下次自己主动登录(记住password)功能

    1:进入cookie插件 <script src="jquery.cookie.js" type="text/javascript"></sc ...

  6. android记住密码和自动登陆

    import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences ...

  7. php实现记住密码下次自动登陆

    这篇博客里面还写到 实现“记住我的登录状态”的功能方法,简言之,就是对首先对session进行用户信息赋值,检测session,失效后,利用cookie对其赋值: 在实现过程中,根据网上一些代码贴,整 ...

  8. web站点,同一个浏览器只能登陆一个用户的原因(cookie不能跨浏览器)

    我的web站点,比如  http://ip/testsite/default.aspx, 当我在我的机器上,用chrome打开,用账号user1登陆,那么当我再新开个tab,再打开这个web站点,这时 ...

  9. 【转载】SSH login without password 免密登陆

    Your aim You want to use Linux and OpenSSH to automate your tasks. Therefore you need an automatic l ...

随机推荐

  1. Python-S9-Day114——Flask开始实战

    01 今日内容概要 02 课前分享 03 内容回顾 04 路飞学城表结构(一) 05 路飞学城表结构(二) 06 路飞学城立即支付思路 07 今日作业 08 初识Flask 09 werkzug 10 ...

  2. vue知识

    https://juejin.im/post/5af16a2cf265da0b8636353b

  3. 聊聊、CA机构认证CSR生成

    https://search.thawte.com/support/ssl-digital-certificates/index?page=content&id=SO832 https://s ...

  4. html基础标签之head和body标签

    什么是标签标签是由一对尖括号包裹的单词构成的,也有一些单闭和标签,仅仅就自己出现就可以了,例如meta,link 1. 这里介绍了几种html语言里常见的head标签 <!DOCTYPE htm ...

  5. bzoj1902【Zju2116】 Christopher

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1902 sol  :一眼可以看出此题应用了lucas定理(逃~ 将n,m都化为p进制,记为a[] ...

  6. 笔记:CS231n+assignment2(作业二)(一)

    第二个作业难度很高,但做(抄)完之后收获还是很大的.... 一.Fully-Connected Neural Nets 首先是对之前的神经网络的程序进行重构,目的是可以构建任意大小的全连接的neura ...

  7. Origin 2018 的坐标轴中文标签发生倒立/翻转

    问题: 在使用 origin 2018 作图时,坐标轴或者是标签中输入中文后,将其更换中文字体(英文字体没有该问题)后发生倒立的情况 解决: 后来发现 Origin 2018 中存在两种中文字体,其中 ...

  8. 通过Xode上传代码到GIthub---步骤

    ---恢复内容开始--- 一:打开终端,git命令进行全局配置 由于本人已经配置完成,so,直接查看配置信息 然后在本地创建一个文件夹, 然后在gitHub上创建一个代码库 在终端clone到本地创建 ...

  9. [AGC002D] Stamp Rally (并查集+整体二分)

    Description 给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的变的最大编号最小. Input ...

  10. HDU3308 LCIS

    Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Description Given n ...