Selaa lähdekoodia

小文件合并功能取消, 作为一个实验性项目, 应该尽量简单

reghao 3 vuotta sitten
vanhempi
commit
994aa871f0

+ 0 - 2
Dockerfile

@@ -2,8 +2,6 @@ FROM adoptopenjdk/openjdk11:x86_64-alpine-jre-11.0.15_10
 
 WORKDIR /app
 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
-# TODO 应该挂载到宿主机目录
-RUN mkdir -p /var/tmp/tnb
 COPY target/dfs-store.jar /app/dfs-store.jar
 
 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/dfs-store.jar"]

+ 17 - 3
src/main/java/cn/reghao/dfs/store/config/WebConfig.java

@@ -1,11 +1,17 @@
 package cn.reghao.dfs.store.config;
 
 import cn.reghao.dfs.store.inerceptor.FileAccessInterceptor;
+import cn.reghao.dfs.store.inerceptor.JwtTokenFilter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
 
+import javax.servlet.Filter;
+
 /**
  * @author reghao
  * @date 2021-12-30 12:34:26
@@ -31,8 +37,8 @@ public class WebConfig extends WebMvcConfigurationSupport {
         registry.addInterceptor(fileAccessInterceptor);
     }
 
-    // TODO gateway 中处理了跨域, 这里不再处理
-    /*@Override
+    // TODO 若 dfs-gw 中处理了跨域, 那么这里需要注释
+    @Override
     public void addCorsMappings(CorsRegistry registry) {
         registry.addMapping("/**")
                 .allowedOrigins("*")
@@ -40,5 +46,13 @@ public class WebConfig extends WebMvcConfigurationSupport {
                 .allowCredentials(true)
                 .maxAge(3600)
                 .allowedHeaders("*");
-    }*/
+    }
+
+    @Bean
+    public FilterRegistrationBean<Filter> jwtTokenFilter() {
+        FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
+        registrationBean.setFilter(new JwtTokenFilter());
+        registrationBean.addUrlPatterns("*");
+        return registrationBean;
+    }
 }

+ 1 - 1
src/main/java/cn/reghao/dfs/store/controller/VideoFileController.java

@@ -69,7 +69,7 @@ public class VideoFileController {
             long userId = Long.parseLong(arr[1]);
             long timestamp = Long.parseLong(arr[2]);
 
-            Long accessUserId = ServletUtil.getUserId();
+            long accessUserId = Long.parseLong(ServletUtil.getUserId());
             if (userId != accessUserId) {
                 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                 String errMsg = "url 不是为当前用户生成";

+ 4 - 4
src/main/java/cn/reghao/dfs/store/db/repository/FileRepository.java

@@ -52,7 +52,7 @@ public class FileRepository {
         FileInfo fileInfo = new FileInfo(fileId, sha256sum, filename, size, fileContentType, false);
 
         String uploadId = idGenerator.getUuid();
-        String currentUserId = String.valueOf(ServletUtil.getUserId());
+        String currentUserId = ServletUtil.getUserId();
         FileUser fileUser = new FileUser(uploadId, fileId, currentUserId);
 
         fileInfoMapper.save(fileInfo);
@@ -65,7 +65,7 @@ public class FileRepository {
         FileInfo fileInfo = new FileInfo(fileId, sha256sum, filename, size, fileContentType, true);
 
         String uploadId = idGenerator.getUuid();
-        String currentUserId = String.valueOf(ServletUtil.getUserId());
+        String currentUserId = ServletUtil.getUserId();
         FileUser fileUser = new FileUser(uploadId, fileId, currentUserId);
 
         fileInfoMapper.save(fileInfo);
@@ -74,7 +74,7 @@ public class FileRepository {
     }
 
     public String getOrCreateUploadId(String fileId) {
-        String currentUserId = String.valueOf(ServletUtil.getUserId());
+        String currentUserId = ServletUtil.getUserId();
         FileUser fileUser = fileUserMapper.findByFileAndUserId(fileId, currentUserId);
         if (fileUser != null) {
             return fileUser.getUploadId();
@@ -109,7 +109,7 @@ public class FileRepository {
 
     @Transactional(rollbackFor = Exception.class)
     public void deleteFile(String uploadId) {
-        String currentUserId = String.valueOf(ServletUtil.getUserId());
+        String currentUserId = ServletUtil.getUserId();
         FileUser fileUser = fileUserMapper.findByUploadAndUserId(uploadId, currentUserId);
         if (fileUser == null) {
             log.error("{} 试图删除不是自己上传的文件", currentUserId);

+ 79 - 0
src/main/java/cn/reghao/dfs/store/inerceptor/JwtTokenFilter.java

@@ -0,0 +1,79 @@
+package cn.reghao.dfs.store.inerceptor;
+
+import cn.reghao.jutil.tool.jwt.Jwt;
+import cn.reghao.jutil.tool.jwt.JwtPayload;
+import io.jsonwebtoken.ExpiredJwtException;
+import io.jsonwebtoken.JwtException;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.function.Consumer;
+
+/**
+ * @author reghao
+ * @date 2022-08-25 21:14:23
+ */
+public class JwtTokenFilter implements Filter {
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response,
+                         FilterChain chain) throws IOException, ServletException {
+        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+        MutableHttpServletRequest mutableHttpServletRequest = new MutableHttpServletRequest(httpServletRequest);
+        String jwtToken = getJwtToken(httpServletRequest);
+        if (jwtToken != null) {
+            try {
+                JwtPayload jwtPayload = Jwt.parse(jwtToken);
+                String userId = jwtPayload.getUserId();
+                mutableHttpServletRequest.putHeader("x-user-id", userId);
+            } catch (JwtException jwtException) {
+                String msg;
+                if (jwtException instanceof ExpiredJwtException) {
+                    msg = "登录已过期, 请重新登录";
+                } else {
+                    // token 无效
+                    msg = "token is invalid";
+                }
+
+                HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+                writeResponse(httpServletResponse, msg);
+                return;
+            }
+        } else {
+            mutableHttpServletRequest.putHeader("x-user-id", "-1");
+        }
+
+        chain.doFilter(mutableHttpServletRequest, response);
+    }
+
+    private void writeResponse(HttpServletResponse response, String msg) throws IOException {
+        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        response.setContentType("text/html; charset=utf-8");
+        PrintWriter printWriter = response.getWriter();
+        printWriter.write(msg);
+    }
+
+    private String getJwtToken(HttpServletRequest request) {
+        String headerValue = request.getHeader(Jwt.AUTH_HEADER);
+        if (headerValue != null && headerValue.startsWith(Jwt.JWT_PREFIX)) {
+            return headerValue.replace(Jwt.JWT_PREFIX, "");
+        }
+
+        return null;
+    }
+
+    @Override
+    public void destroy() {
+    }
+}

+ 40 - 0
src/main/java/cn/reghao/dfs/store/inerceptor/MutableHttpServletRequest.java

@@ -0,0 +1,40 @@
+package cn.reghao.dfs.store.inerceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.util.*;
+
+/**
+ * @author reghao
+ * @date 2022-08-25 21:45:31
+ */
+public final class MutableHttpServletRequest extends HttpServletRequestWrapper {
+    private final Map<String, String> customHeaders;
+
+    public MutableHttpServletRequest(HttpServletRequest request) {
+        super(request);
+        this.customHeaders = new HashMap<>();
+    }
+
+    public void putHeader(String name, String value) {
+        customHeaders.put(name, value);
+    }
+
+    public String getHeader(String name) {
+        String value = customHeaders.get(name);
+        if (value != null) {
+            return value;
+        }
+
+        return ((HttpServletRequest) getRequest()).getHeader(name);
+    }
+
+    public Enumeration<String> getHeaderNames() {
+        Set<String> set = new HashSet<>(customHeaders.keySet());
+        Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
+        while (e.hasMoreElements()) {
+            set.add(e.nextElement());
+        }
+        return Collections.enumeration(set);
+    }
+}

+ 2 - 2
src/main/resources/application.yml

@@ -3,9 +3,9 @@ dubbo:
     base-packages: cn.reghao.dfs.store.rpc
   protocol:
     name: dubbo
-    port: 8102
+    port: 8110
 server:
-  port: 8002
+  port: 8010
 spring:
   servlet:
     multipart: