首先需要知道,dolphinscheduler的拦截有哪些
前台的url拦截;后台的ur拦截
拦截的英文(Interceptor),就全局搜这单词肯定会有收获
很多时候去看一个项目,有点摸不着头脑,那就去搜吧,搜关键词,就比如url的拦截,我们就搜Interceptor这个英文单词
前台的拦截器
index.js
走的是一个get方法,什么方法呢,这个方法藏在config里面
/datastudio/users/get-user-info
那么 /datastudio/users/get-user-info 这个方法会经过几层呢,答案是:两层
1、拦截器一层,拦截器就是LoginHandlerInterceptor(这个,在后台的拦截器部分有提到),所以需要走到免密那边,把用户塞到session_user
2、get-user-info 获取user信息一层,userController的getUserInfo方法
我们会发现,getUserInfo这个方法需要用到session_user这个参数数据,所以①先走拦截器②再走getUserInfo这个顺序是ok的,不然会就会报用户找不到的错误
后台的拦截器
1、拦截的英文(Interceptor),就全局搜这单词肯定会有收获
很多时候去看一个项目,有点摸不着头脑,那就去搜吧,搜关键词,就比如url的拦截,我们就搜Interceptor这个英文单词
这个文件夹里不就是么
2、LoginHandlerInterceptor,一看这个名字就是登录拦截
登录有二种形式
1、token(这个咱不用)
2.、用户名密码,咱就直接校验用户名或者id(所以userid是必须要有的)就让user的基础信息,塞入到session里面,我这里是直接写死的,你们可以,做一个时间戳,和加密
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// get token
String token = request.getHeader("token");
String userid = request.getParameter("userid");
User user = null;
if(!StringUtils.isEmpty(userid)){
//BI免密登陆
//userid,time,token,
String time = request.getParameter("timeString");
String tk = request.getParameter("tk");
//TODO
//再次加密校验 userid+time 加密后 跟tk 验证 一致
//登陆
String tkMD5 = getMD5Str(userid + time);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("user_name", userid);
user = userMapper.selectOne(wrapper);
/* session 的内容*/
String ip = BaseController.getClientIpAddress(request);
String sessionId = sessionService.createSession(user, ip);
response.setStatus(HttpStatus.SC_OK);
Map<String, String> cookieMap = Collections.singletonMap(Constants.SESSION_ID, sessionId);
for (Map.Entry<String, String> cookieEntry : cookieMap.entrySet()) {
Cookie cookie = new Cookie(cookieEntry.getKey(), cookieEntry.getValue());
cookie.setPath("/");
cookie.setHttpOnly(false);
response.addCookie(cookie);
}
/* session 的内容 */
/*if(tk.equals(tkMD5)){
}*/
}else{
if (StringUtils.isEmpty(token)){
user = authenticator.getAuthUser(request);
// if user is null
if (user == null) {
response.setStatus(HttpStatus.SC_UNAUTHORIZED);
logger.info("user does not exist");
return false;
}
}else {
user = userMapper.queryUserByToken(token);
if (user == null) {
response.setStatus(HttpStatus.SC_UNAUTHORIZED);
logger.info("user token has expired");
return false;
}
}
}
request.setAttribute(Constants.SESSION_USER, user);
return true;
}
3、PasswordAuthenticator,密码校验,在有token的情况下,会走用户校验,因为之前已经
@Override
public User getAuthUser(HttpServletRequest request) {
Session session = sessionService.getSession(request);
if (session == null) {
logger.info("session info is null ");
return null;
}
//get user object from session
return userService.queryUser(session.getUserId());
}
特别重要的一个东西!!!!Session的一个返回,保持登录的秘密
代码里面的这个部分特别重要
cookie.setPath("/");
cookie.setHttpOnly(false);
为什么要加这个呢,首先加上 cookie.setPath(“/”); ,表示全局的路径,不然前台js获取不了,其次cookie.setHttpOnly(false); 也是
/* session 的内容*/
String ip = BaseController.getClientIpAddress(request);
String sessionId = sessionService.createSession(user, ip);
response.setStatus(HttpStatus.SC_OK);
Map<String, String> cookieMap = Collections.singletonMap(Constants.SESSION_ID, sessionId);
for (Map.Entry<String, String> cookieEntry : cookieMap.entrySet()) {
Cookie cookie = new Cookie(cookieEntry.getKey(), cookieEntry.getValue());
cookie.setPath("/");
cookie.setHttpOnly(false);
response.addCookie(cookie);
}
/* session 的内容 */