springboot中实现(原理一样的)
代码
@Controller
public class Test {
//登陆
@ResponseBody
@GetMapping("/login")
public Object login(String usrname,String password,HttpServletRequest rq){
String str=null;
try {
if (usrname.equals("usr") && password.equals("123")) {
HttpSession session = rq.getSession(true);
session.setAttribute("usrname", usrname);
session.setAttribute("password", password);
session.setMaxInactiveInterval(100);
str = "登陆成功";
}else {
str="登陆失败";
}
}catch (Exception e){
str="登陆失败";
return str;
}
return str;
}
//注销
@ResponseBody
@GetMapping("/logout")
public Object logout(HttpServletRequest rq){
String str=null;
HttpSession session=rq.getSession(false);
if(session!=null){
session.invalidate();
str="注销成功";
}
str="未登陆";
return str;
}
//登陆才能访问等界面
@ResponseBody
@GetMapping("/loged")
public Object loged(HttpServletRequest rq){
String usrname=null,password=null;
HttpSession session=rq.getSession(false);
if(session!=null){
usrname=(String)session.getAttribute("usrname");
password=(String)session.getAttribute("password");
}
return usrname+":"+password;
}
}
原理
- 从请求中获取数据
- 服务器生成session,可以在session域属性中添加属性保存信息,服务器有了一个(JSESSIONID,session对象),可以通过JSESSIONID找到对应的session对象
- 服务器以cookie的形式返回JSESSIONID给前端
- 前端再次请求会带上这个cookie
- 后台服务器用这个cookie找到session验证登陆
这样写一个弊端就是别人拿到你的JSESSIONID就能获取你的信息
稍微增加一个步骤,加个cookie和session的域属性对比
这样就必须同时拿到两个才能完成登陆验证,不会伪造一个JSESSIONID就获取到用户信息
gitee地址