Quellcode durchsuchen

[Improvement-3369][api] Introduce session service interface for clear code (#3408)

* [Improvement][api] Introduce session service interface for clear code

* Update SessionService.java

* [Improvement][api] Add @Service

* Add licenses
Yichao Yang vor 4 Jahren
Ursprung
Commit
379203b306

+ 5 - 9
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/interceptor/LoginHandlerInterceptor.java

@@ -16,32 +16,28 @@
  */
 package org.apache.dolphinscheduler.api.interceptor;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.lang.StringUtils;
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.security.Authenticator;
-import org.apache.dolphinscheduler.api.service.SessionService;
 import org.apache.dolphinscheduler.common.Constants;
 import org.apache.dolphinscheduler.common.enums.Flag;
 import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.dao.mapper.UserMapper;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.servlet.HandlerInterceptor;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /**
  * login interceptor, must login first
  */
 public class LoginHandlerInterceptor implements HandlerInterceptor {
   private static final Logger logger = LoggerFactory.getLogger(LoginHandlerInterceptor.class);
 
-  @Autowired
-  private SessionService sessionService;
-
   @Autowired
   private UserMapper userMapper;
 

+ 10 - 7
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/BaseService.java

@@ -16,6 +16,12 @@
  */
 package org.apache.dolphinscheduler.api.service;
 
+import java.text.MessageFormat;
+import java.util.Map;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.utils.Result;
 import org.apache.dolphinscheduler.common.Constants;
@@ -24,11 +30,6 @@ import org.apache.dolphinscheduler.common.utils.HadoopUtils;
 import org.apache.dolphinscheduler.common.utils.StringUtils;
 import org.apache.dolphinscheduler.dao.entity.User;
 
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import java.text.MessageFormat;
-import java.util.Map;
-
 /**
  * base service
  */
@@ -96,6 +97,7 @@ public class BaseService {
 
     /**
      * get cookie info by name
+     *
      * @param request request
      * @param name 'sessionId'
      * @return get cookie info
@@ -115,10 +117,11 @@ public class BaseService {
 
     /**
      * create tenant dir if not exists
+     *
      * @param tenantCode tenant code
      * @throws Exception if hdfs operation exception
      */
-    protected void createTenantDirIfNotExists(String tenantCode)throws Exception{
+    protected void createTenantDirIfNotExists(String tenantCode) throws Exception {
 
         String resourcePath = HadoopUtils.getHdfsResDir(tenantCode);
         String udfsPath = HadoopUtils.getHdfsUdfDir(tenantCode);
@@ -129,7 +132,7 @@ public class BaseService {
         HadoopUtils.getInstance().mkdir(udfsPath);
     }
 
-    protected boolean hasPerm(User operateUser, int createUserId){
+    protected boolean hasPerm(User operateUser, int createUserId) {
         return operateUser.getId() == createUserId || isAdmin(operateUser);
     }
 }

+ 5 - 105
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/SessionService.java

@@ -16,36 +16,15 @@
  */
 package org.apache.dolphinscheduler.api.service;
 
+import javax.servlet.http.HttpServletRequest;
 
-import org.apache.dolphinscheduler.api.controller.BaseController;
-import org.apache.dolphinscheduler.common.Constants;
-import org.apache.dolphinscheduler.common.utils.CollectionUtils;
 import org.apache.dolphinscheduler.dao.entity.Session;
 import org.apache.dolphinscheduler.dao.entity.User;
-import org.apache.dolphinscheduler.dao.mapper.SessionMapper;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
 
 /**
  * session service
  */
-@Service
-public class SessionService extends BaseService{
-
-  private static final Logger logger = LoggerFactory.getLogger(SessionService.class);
-
-  @Autowired
-  private SessionMapper sessionMapper;
+public interface SessionService {
 
   /**
    * get user session from request
@@ -53,26 +32,7 @@ public class SessionService extends BaseService{
    * @param request request
    * @return session
    */
-  public Session getSession(HttpServletRequest request)  {
-    String sessionId = request.getHeader(Constants.SESSION_ID);
-
-    if(StringUtils.isBlank(sessionId)) {
-      Cookie cookie = getCookie(request, Constants.SESSION_ID);
-
-      if (cookie != null) {
-        sessionId = cookie.getValue();
-      }
-    }
-
-    if(StringUtils.isBlank(sessionId)) {
-      return null;
-    }
-
-    String ip = BaseController.getClientIpAddress(request);
-    logger.debug("get session: {}, ip: {}", sessionId, ip);
-
-    return sessionMapper.selectById(sessionId);
-  }
+  Session getSession(HttpServletRequest request);
 
   /**
    * create session
@@ -81,55 +41,7 @@ public class SessionService extends BaseService{
    * @param ip ip
    * @return session string
    */
-  @Transactional(rollbackFor = RuntimeException.class)
-  public String createSession(User user, String ip) {
-    Session session = null;
-
-    // logined
-    List<Session> sessionList = sessionMapper.queryByUserId(user.getId());
-
-    Date now = new Date();
-
-    /**
-     * if you have logged in and are still valid, return directly
-     */
-    if (CollectionUtils.isNotEmpty(sessionList)) {
-      // is session list greater 1 , delete other ,get one
-      if (sessionList.size() > 1){
-        for (int i=1 ; i < sessionList.size();i++){
-          sessionMapper.deleteById(sessionList.get(i).getId());
-        }
-      }
-      session = sessionList.get(0);
-      if (now.getTime() - session.getLastLoginTime().getTime() <= Constants.SESSION_TIME_OUT * 1000) {
-        /**
-         * updateProcessInstance the latest login time
-         */
-        session.setLastLoginTime(now);
-        sessionMapper.updateById(session);
-
-        return session.getId();
-
-      } else {
-        /**
-         * session expired, then delete this session first
-         */
-        sessionMapper.deleteById(session.getId());
-      }
-    }
-
-    // assign new session
-    session = new Session();
-
-    session.setId(UUID.randomUUID().toString());
-    session.setIp(ip);
-    session.setUserId(user.getId());
-    session.setLastLoginTime(now);
-
-    sessionMapper.insert(session);
-
-    return session.getId();
-  }
+  String createSession(User user, String ip);
 
   /**
    * sign out
@@ -138,17 +50,5 @@ public class SessionService extends BaseService{
    * @param ip   no use
    * @param loginUser login user
    */
-  public void signOut(String ip, User loginUser) {
-    try {
-        /**
-         * query session by user id and ip
-         */
-        Session session = sessionMapper.queryByUserIdAndIp(loginUser.getId(),ip);
-
-        //delete session
-        sessionMapper.deleteById(session.getId());
-    }catch (Exception e){
-        logger.warn("userId : {} , ip : {} , find more one session",loginUser.getId(),ip);
-    }
-  }
+  void signOut(String ip, User loginUser);
 }

+ 158 - 0
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SessionServiceImpl.java

@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.api.service.impl;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.dolphinscheduler.api.controller.BaseController;
+import org.apache.dolphinscheduler.api.service.BaseService;
+import org.apache.dolphinscheduler.api.service.SessionService;
+import org.apache.dolphinscheduler.common.Constants;
+import org.apache.dolphinscheduler.common.utils.CollectionUtils;
+import org.apache.dolphinscheduler.dao.entity.Session;
+import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.mapper.SessionMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * session service implement
+ */
+@Service
+public class SessionServiceImpl extends BaseService implements SessionService {
+
+    private static final Logger logger = LoggerFactory.getLogger(SessionService.class);
+
+    @Autowired
+    private SessionMapper sessionMapper;
+
+    /**
+     * get user session from request
+     *
+     * @param request request
+     * @return session
+     */
+    public Session getSession(HttpServletRequest request) {
+        String sessionId = request.getHeader(Constants.SESSION_ID);
+
+        if (StringUtils.isBlank(sessionId)) {
+            Cookie cookie = getCookie(request, Constants.SESSION_ID);
+
+            if (cookie != null) {
+                sessionId = cookie.getValue();
+            }
+        }
+
+        if (StringUtils.isBlank(sessionId)) {
+            return null;
+        }
+
+        String ip = BaseController.getClientIpAddress(request);
+        logger.debug("get session: {}, ip: {}", sessionId, ip);
+
+        return sessionMapper.selectById(sessionId);
+    }
+
+    /**
+     * create session
+     *
+     * @param user user
+     * @param ip ip
+     * @return session string
+     */
+    @Transactional(rollbackFor = RuntimeException.class)
+    public String createSession(User user, String ip) {
+        Session session = null;
+
+        // logined
+        List<Session> sessionList = sessionMapper.queryByUserId(user.getId());
+
+        Date now = new Date();
+
+        /**
+         * if you have logged in and are still valid, return directly
+         */
+        if (CollectionUtils.isNotEmpty(sessionList)) {
+            // is session list greater 1 , delete other ,get one
+            if (sessionList.size() > 1) {
+                for (int i = 1; i < sessionList.size(); i++) {
+                    sessionMapper.deleteById(sessionList.get(i).getId());
+                }
+            }
+            session = sessionList.get(0);
+            if (now.getTime() - session.getLastLoginTime().getTime() <= Constants.SESSION_TIME_OUT * 1000) {
+                /**
+                 * updateProcessInstance the latest login time
+                 */
+                session.setLastLoginTime(now);
+                sessionMapper.updateById(session);
+
+                return session.getId();
+
+            } else {
+                /**
+                 * session expired, then delete this session first
+                 */
+                sessionMapper.deleteById(session.getId());
+            }
+        }
+
+        // assign new session
+        session = new Session();
+
+        session.setId(UUID.randomUUID().toString());
+        session.setIp(ip);
+        session.setUserId(user.getId());
+        session.setLastLoginTime(now);
+
+        sessionMapper.insert(session);
+
+        return session.getId();
+    }
+
+    /**
+     * sign out
+     * remove ip restrictions
+     *
+     * @param ip no use
+     * @param loginUser login user
+     */
+    public void signOut(String ip, User loginUser) {
+        try {
+            /**
+             * query session by user id and ip
+             */
+            Session session = sessionMapper.queryByUserIdAndIp(loginUser.getId(), ip);
+
+            //delete session
+            sessionMapper.deleteById(session.getId());
+        } catch (Exception e) {
+            logger.warn("userId : {} , ip : {} , find more one session", loginUser.getId(), ip);
+        }
+    }
+
+}

+ 6 - 5
dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SessionServiceTest.java

@@ -16,7 +16,12 @@
  */
 package org.apache.dolphinscheduler.api.service;
 
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.dolphinscheduler.api.service.impl.SessionServiceImpl;
 import org.apache.dolphinscheduler.common.Constants;
 import org.apache.dolphinscheduler.common.enums.UserType;
 import org.apache.dolphinscheduler.common.utils.DateUtils;
@@ -38,10 +43,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.mock.web.MockCookie;
 import org.springframework.mock.web.MockHttpServletRequest;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
 
 @RunWith(MockitoJUnitRunner.class)
 public class SessionServiceTest {
@@ -49,7 +50,7 @@ public class SessionServiceTest {
     private static final Logger logger = LoggerFactory.getLogger(SessionServiceTest.class);
 
     @InjectMocks
-    private SessionService sessionService;
+    private SessionServiceImpl sessionService;
 
     @Mock
     private SessionMapper sessionMapper;