## 请求接口如下
```
@RequestMapping("login")
@ResponseBody
public DTO login(String userName,String password){
//密码加密
try{
UsernamePasswordToken token = new UsernamePasswordToken(userName,password);
Subject subject = SecurityUtils.getSubject();
subject.login(token);
Collection<Session> sessions = redisSessionDAO.getActiveSessions();
if (subject.isAuthenticated()) {
for (Session session : sessions) {
//方法一、当第二次登录时,给出提示“用户已登录”,停留在登录页面
if (userName.equals(session.getAttribute("USERNAME"))) {
subject.logout();
msg="该账号已登录";
}
}
}
if(StringUtils.isNotBlank(msg)){
subject.getSession().setTimeout(3600000L);//超时时间
User user = (User)subject.getPrincipal();
subject.getSession().setAttribute(Constant.USERSESSION,user );
subject.getSession().setAttribute(Constant.USERNAME, phone);
}
}catch (IncorrectCredentialsException ice) {
msg="密码错误";
} catch (UnknownAccountException uae) {
msg="该账号不存在";
} catch (LockedAccountException e) {
msg="该账号已被冻结";
} catch (ExcessiveAttemptsException eae) {
msg="服务器内部错误";
} catch (RuntimeException e) {
e.printStackTrace();
}
return new DTO(msg);
}
```
- JDK常用知识库
- JDK各个版本安装
- Java8流
- 算法
- 十大排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 归并排序
- 快速排序
- 堆排序
- 希尔排序
- 计数排序
- 桶排序
- 基数排序
- 总结
- 常用工具类
- 浮点型计算
- 时间格式处理
- 常用功能点思路整理
- 登录
- 高并发
- 线程安全的单例模式
- Tomcat优化
- Tomcat之APR模式
- Tomcat启动过慢问题
- 常用的数据库连接池
- Druid连接池
- 缓存
- Redis
- SpringBoot整合Redis
- 依赖和配置
- RedisTemplate工具类
- 工具类使用方法
- Redis知识库
- Redis安装
- Redis配置参数
- Redis常用Lua脚本
- MongoDB
- SpringBoot操作MongoDB
- 依赖和配置
- MongoDB工具类
- 工具类使用方法
- 消息中间件
- ActiveMq
- SpringBoot整合ActiveMq
- 框架
- SpringBoot
- 定时任务
- 启动加载
- 事务
- JSP
- 静态类注入
- SpringSecurity
- Shiro
- 配置及整合
- 登陆验证
- 权限验证
- 分布式应用
- SpringMVC
- ORM框架
- Mybatis
- 增
- 删
- 改
- 查
- 程序员小笑话
- 我给你讲一个TCP的笑话吧
- 二进制笑话
- JavaScript的那点东西
- JavaScript内置对象及常见API详细介绍
- JavaScript实现Ajax 资源请求
- JavaScript干货
- 架构师成长之路
- JDK源码解析
- ArrayList源码解读
- 设计模式
- 微服务架构设计模式
- 逃离单体炼狱
- 服务的拆分策略
- 全面解析SpringMvc框架
- 架构设计的六大原则
- 并发集合
- JUC并发编程
- 搜索引擎
- Solr
- Solr的安装
- 分布式服务框架
- Dubbo
- 从零开始学HTMl
- 第一章-初识HTML
- 第二章-认识HTML标签