@Controller
public class LoginController { @RequestMapping(value="/login")
public @ResponseBody
ResultInfo login(@Valid User user, BindingResult bindingResult,RedirectAttributes redirectAttributes){
ResultInfo info = new ResultInfo(); if(bindingResult.hasErrors()){
info.setCode(ResultStatus.ERROR.getCode());
return info;
} UsernamePasswordToken token = new UsernamePasswordToken(user.getLoginName(), user.getPwd());
//获取当前的Subject
Subject currentUser = SecurityUtils.getSubject();
try {
//在调用了login方法后,SecurityManager会收到AuthenticationToken,并将其发送给已配置的Realm执行必须的认证检查
//每个Realm都能在必要时对提交的AuthenticationTokens作出反应
//所以这一步在调用login(token)方法时,它会走到MyRealm.doGetAuthenticationInfo()方法中,具体验证方式详见此方法
currentUser.login(token);
}catch(UnknownAccountException uae){
// logger.info("对用户[" + username + "]进行登录验证..验证未通过,未知账户");
info.setMsg( "未知账户");
// redirectAttributes.addFlashAttribute("message", "未知账户");
}catch(IncorrectCredentialsException ice){
// logger.info("对用户[" + username + "]进行登录验证..验证未通过,错误的凭证");
info.setMsg( "密码不正确");
// redirectAttributes.addFlashAttribute("message", "密码不正确");
}catch(LockedAccountException lae){
// logger.info("对用户[" + username + "]进行登录验证..验证未通过,账户已锁定");
info.setMsg( "账户已锁定");
// redirectAttributes.addFlashAttribute("message", "账户已锁定");
}catch(ExcessiveAttemptsException eae){
//logger.info("对用户[" + username + "]进行登录验证..验证未通过,错误次数过多");
info.setMsg( "用户名或密码错误次数过多");
// redirectAttributes.addFlashAttribute("message", "用户名或密码错误次数过多");
}catch(AuthenticationException ae){
//通过处理Shiro的运行时AuthenticationException就可以控制用户登录失败或密码错误时的情景
//logger.info("对用户[" + username + "]进行登录验证..验证未通过,堆栈轨迹如下");
info.setMsg( "用户名或密码不正确");
ae.printStackTrace();
// redirectAttributes.addFlashAttribute("message", "用户名或密码不正确");
}
//验证是否登录成功
if(currentUser.isAuthenticated()){
info.setCode(ResultStatus.SUCCESS.getCode());
return info;
}else{
token.clear();
info.setCode(ResultStatus.ERROR.getCode());
return info;
}
} @RequestMapping(value="/logout",method=RequestMethod.GET)
public String logout(RedirectAttributes redirectAttributes ){
//使用权限管理工具进行用户的退出,跳出登录,给出提示信息
SecurityUtils.getSubject().logout();
redirectAttributes.addFlashAttribute("message", "您已安全退出");
return "redirect:/login";
}
}

最新文章

  1. CYQ.Data 批量添加数据性能测试(每秒千、万)
  2. WebGIS中GeoHash编码的研究和扩展
  3. (转)SQL 优化原则
  4. redis数据类型之—List
  5. IOS的一些小技巧
  6. hdu 4006 The kth great number
  7. hdu 4185 二分图匹配
  8. Python计算文件MD5值
  9. 小试.NET代码保护软件(代码混淆、加密)
  10. linux命令之more
  11. Maven-1:下载&安装
  12. Java1.5泛型指南中文版(Java1.5 Generic Tutorial)
  13. 如何让.Net线程支持超时后并自动销毁!
  14. glut 深度测试无不起作用问题解决
  15. v-charts
  16. HDU - 1695 GDU
  17. Day1数据结构和算法
  18. XMLHttpRequest状态码及相关事件
  19. 【C++】 网络编程 01
  20. ABAP表抛FTP通用程序

热门文章

  1. 转: 使用valgrind检查内存问题
  2. Access to Image at 'file:///Users canvas本地图片跨域报错解决方案
  3. 【Arcgis Server】程序动态发布MXD到Arcgis Server
  4. 一例Ext4文件系统fsck后损坏的修复过程
  5. POJ2752 Seek the Name, Seek the Fame 【KMP】
  6. Hibernate中的自己定义类型——UserType、CompositeUserType
  7. 转帖:对linux中半增加半连接数量和防止服务器被dos攻击
  8. [概念理解] UML类建模
  9. DBscan算法及其Python实现
  10. 我的kindle书单