需求:
用户为老师,登陆客户端桌面软件,可以上传视频到服务器以便在前端页面展示。老师通过客户端界面上的“查看我的视频”跳转到浏览器向服务器发送请求获取自己上传的视频列表。为了防止用户通过在浏览器直接输入地址访问的情况,要对浏览器请求视频列表进行验证,确保请求是老师登陆后由客户端触发。
问题:
通常情况下验证用户登陆状态,只需要服务器在用户登陆时在当前会话session中设置一个变量:session.setAttribute(arg1,arg2);然后在下一次请求时验证这个变量值是否存在并和之前设置的值相同。
当前情况是浏览器请求和客户端请求不在同一个session,浏览器的请求产生一个新的session,不能通过session范围的变量来判断浏览器请求是否来自客户端登陆用户。
解决方法:
java中有static关键词,用来定义静态变量,也就是java中的全局变量,在类对象创建之前就创建,并且不需要创建类的对象即可直接调用,储存在内存中(有待考证)。
在类TeacherService中定义静态变量SESSION_MAP
public static Map<String,HttpSession> SESSION_MAP=new HashMap<>();
客户端老师登陆时,添加当前session
session.setAttribute(TeacherService.LOGGED_IN_TEACHER_KEY,teacher.getId());
TeacherService.SESSION_MAP.put(session.getId(),session);
客户端触发浏览器时,将当前session(session_c)的id作为参数或url的一部分,通过浏览器请求发送到服务器,服务器获取该参数,通过id获取之前的session(session_c):
@RequestMapping(value="/webteacher/{teacherId}/{sessionId}/videos")
public ModelAndView getVideoList(@PathViariable String sessionId,HttpSession session,@PathViariable long teacherId){
HttpSession session_c=TeacherService.SESSION_MAP.get(sessionId);
Object ob=cursession.getAttribute(TeacherService.LOGGED_IN_TEACHER_KEY);
//验证老师是否登陆
if(ob==null){
return null;
}
long log_in=(long)ob;
if(log_in!=teacherId){
return null;
}
//在当前session,浏览器与服务器之间的session,定义变量
ModelAndView mav=new ModelAndView("teacher_videos");
session.setAttribute(TeacherService.LOGGED_IN_TEACHER_KEY, teacherId);
return mav;
}
之后浏览器的请求都在同一个session中,像一般情况下验证即可