登录+Session+Cookie+以及自定义异常类的简单使用
1、Session(存储用户登录后,存储登录对象)
1.1 将登录信息存储到session
//登录(也可以根据HttpServletRequest来获取session对象)
@RequestMapping(value="/login",method=RequestMethod.POST)
@ResponseBody
public String login(HttpSession session){
//将登录信息保存到session里面 (就这一句就行)
//参数1:session的唯一id 参数2:需要存储到session里的内容(一般存储登录成功后的user信息)
session.setAttribute("USER_IN_SESSION", user);
}
1.2 前台获取session
如果前台需要展示谁进行的登录,那么可以这样取到名字
<!-- 直接使用后台传来的USER_IN_SESSION取里面的值(获取名字) -->
<span>${USER_IN_SESSION.name}</span>
1.3 退出登录,清空存储到服务器里面的session对象
//登出
@RequestMapping(value="/logout",method=RequestMethod.GET)
public String logout(HttpSession session){
//移除session(清空服务器对象)
session.invalidate();
//返回到登录界面 login.jsp 这里配置了视图解析器
return "login";
}
2、Cookie存储用户名和密码
- ① 登录的时候点击记住密码,下次关闭浏览器后再回来登录能将密码和账号直接 回显 到输入框里面。
- ② 就是类属于PC端QQ登录,点击记住后下次在来不用再输入账号和密码
- ③ 注意:大致就是将登录的账号和密码值存到cookie里面,然后设置七天过期,他会将这个用户和密码存到磁盘里面,实现以上操做。
2.1 后台代码存储cookie信息
/*
注意:
1.这里返回的Ajax是自己封装的类,里面包含 是否成功 和失败后的失败信息存储类型(String)。
2.Integer remember:这里的参数是接收前台的标签记住密码的值(例:<input type="checkbox" name="remember" value="1">记住我)
这里判读他是否点击了 记住我 这个标签,如果点击了才将登录信息存储到cookie里
*/
//用户点击登录后的判断用户名和密码的操做
@RequestMapping(value="/login",method=RequestMethod.POST)
@ResponseBody
public Ajax submit(String username,String password,Integer remember,HttpSession session,HttpServletResponse resp,HttpServletRequest req){
try {
//1.根据用户名和密码,查询出登录数据(在service层里判断,如果没有就抛异常了)
User user =service.login(username,password);
//2.将登录信息保存到session里面(这是上面将登录信息存储到session里的操做)
session.setAttribute("USER_IN_SESSION", user);
// * 3. 只有在上面登录成功并且选中了的情况下才进行记住密码的操做
if(remember!=null){
//3.1 将用户名和密码存到cookie里面
Cookie c1 = new Cookie("USERNAME",username);
Cookie c2 = new Cookie("PASSWORD",password);
//3.2 设置生命周期(7天有效)
c1.setMaxAge(7*24*60*60);
c2.setMaxAge(7*24*60*60);
//3.3 设置作用域(在根路径下有效)
c1.setPath("/");
c2.setPath("/");
//3.4 响应到页面,上面的操做只是在内存里面,浏览器里面还没有,所以需要响应到浏览器的cookie里
resp.addCookie(c1);
resp.addCookie(c2);
}else{
//* 4.登录成功但是没点记住密码的操做(点击登录,但是没有勾选记住密码的操做,所以就要删除以前记住密码的cookie,下一次就需要重新输入用户名和密码)
//4.1 获取到请求头里面的所有cookie
Cookie[] cookies = req.getCookies();
for (Cookie c : cookies) {
//4.2 获取到username和password的cookie
if("USERNAME".equals(c.getName()) || "PASSWORD".equals(c.getName())){
// * 4.3 删除cookie
c.setMaxAge(0); //只要为0就表示立即删除
c.setPath("/"); //这情况作用于所有根路径
//4.4 上面操做只是在内存里,需要响应到页面
resp.addCookie(c);
}
}
}
return new Ajax();
} catch (Exception e) {
e.printStackTrace();
return new Ajax(false,e.getMessage());
}
}
2.2 前台代码获取后台传来的cookie实现回显的操做
这个代码和提交登录一个界面,刚开始进去的时候他会判断有没有cookie(第一次没有,如果操做过后就有了)
//1、获取到后台存储的所有cookie username=root; password=123
var cookies = document.cookie;
//2、只有cookies存在的情况下才进行回显操做 (不等于-1表示存在,判断这个字符串cookie里面有没有包含登录信息username)
if(cookies.indexOf("username")!=-1){
//3、截取cookie,得到的是一个数组
var cookieArr = cookies.split(";");
var username = null;
var password =null;
//4.循环这个数组,得到用户信息的cookie(就是将用户名和密码进行回显)
for(var i in cookieArr){
if(cookieArr[i].indexOf("username")!=-1){
//截取到用户名
username = cookieArr[i].substring(cookieArr[i].lastIndexOf("=")+1);
}
if(cookieArr[i].indexOf("password")!=-1){
//截取到密码
password = cookieArr[i].substring(cookieArr[i].lastIndexOf("=")+1);
}
}
//截取到用户名
//var password = passwordStr.substring(passwordStr.lastIndexOf("=")+1);
//5.回显(将cookie里的用户名和密码回显到输入框里面)
$("input[name='username']").val(username);
$("input[name='password']").val(password);
//6.回显记住密码的 √
$("input[name='remember']").prop("checked",true);
}
---------------------------- 登录 end---------------------------
3、自定义异常类
/**
* 自定义异常类 继承Exception异常(使用的时候直接new来使用,将错误信息存储到有参构造里面。原本的异常太大了,所以需要自定义异常)
*/
public class AuthenticationException extends Exception{
public AuthenticationException() {
super();
}
public AuthenticationException(String message) {
super(message);
}
}