From 5fab97cf7e49636d446e063ee6e0eea80c124bd2 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 15 三月 2023 19:05:56 +0800
Subject: [PATCH] 支持不同域的前后端分离部署

---
 src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java |    9 -
 src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java                          |    2 
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java            |    1 
 web_src/src/App.vue                                                                      |   23 --
 src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java                         |    4 
 web_src/src/components/dialog/changePassword.vue                                         |    3 
 src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java                            |   10 -
 src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java                     |   11 +
 web_src/src/components/service/UserService.js                                            |   42 ++++++
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java             |    5 
 web_src/package.json                                                                     |    2 
 src/main/resources/all-application.yml                                                   |    4 
 web_src/package-lock.json                                                                |   14 +-
 src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java                |    4 
 web_src/src/components/Login.vue                                                         |   14 -
 web_src/src/main.js                                                                      |   34 +++-
 src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java           |   15 +
 src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java                 |   99 +++++--------
 src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java                     |   13 -
 src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java                                |   10 +
 web_src/src/layout/UiHeader.vue                                                          |   32 +++-
 src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java                    |   22 ++
 web_src/src/components/dialog/importChannel.vue                                          |    8 +
 23 files changed, 226 insertions(+), 155 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java b/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java
index e30b6db..4d885e8 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java
@@ -14,7 +14,8 @@
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.filter.OncePerRequestFilter;
 
-import javax.servlet.*;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
 import javax.servlet.annotation.WebFilter;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -48,13 +49,6 @@
         long start = System.currentTimeMillis(); // 璇锋眰杩涘叆鏃堕棿
         String uriName = ApiSaveConstant.getVal(servletRequest.getRequestURI());
 
-        String origin = servletRequest.getHeader("Origin");
-        servletResponse.setContentType("application/json;charset=UTF-8");
-        servletResponse.setHeader("Access-Control-Allow-Origin", origin != null ? origin : "*");
-        servletResponse.setHeader("Access-Control-Allow-Credentials", "true");
-        servletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
-        servletResponse.setHeader("Access-Control-Max-Age", "3600");
-        servletResponse.setHeader("Access-Control-Allow-Headers", "token,Content-Type,Content-Length, Authorization, Accept,X-Requested-With,domain,zdy");
         filterChain.doFilter(servletRequest, servletResponse);
 
         if (uriName != null && userSetting != null && userSetting.getLogInDatebase() != null && userSetting.getLogInDatebase()) {
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java b/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java
index 728afb9..dbea741 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java
@@ -32,6 +32,17 @@
         return WVPResult.fail(ErrorCode.ERROR500.getCode(), e.getMessage());
     }
 
+    /**
+     * 榛樿寮傚父澶勭悊
+     * @param e 寮傚父
+     * @return 缁熶竴杩斿洖缁撴灉
+     */
+    @ExceptionHandler(IllegalStateException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public WVPResult<String> exceptionHandler(IllegalStateException e) {
+        return WVPResult.fail(ErrorCode.ERROR400);
+    }
+
 
     /**
      * 鑷畾涔夊紓甯稿鐞嗭紝 澶勭悊controller涓繑鍥炵殑閿欒
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
index 1e7fd36..e944476 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
@@ -55,6 +55,8 @@
 
     private List<String> interfaceAuthenticationExcludes = new ArrayList<>();
 
+    private List<String> allowedOrigins = new ArrayList<>();
+
     public Boolean getSavePositionHistory() {
         return savePositionHistory;
     }
@@ -218,4 +220,12 @@
     public void setSipLog(Boolean sipLog) {
         this.sipLog = sipLog;
     }
+
+    public List<String> getAllowedOrigins() {
+        return allowedOrigins;
+    }
+
+    public void setAllowedOrigins(List<String> allowedOrigins) {
+        this.allowedOrigins = allowedOrigins;
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java b/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java
index 7a178d9..3f70b79 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java
@@ -28,15 +28,6 @@
         String username = jwtUser.getUserName();
         UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, jwtUser.getPassword() );
         SecurityContextHolder.getContext().setAuthentication(token);
-        System.out.println(jwt);
-        // 鍏佽璺ㄥ煙
-        String origin = request.getHeader("Origin");
-        response.setHeader("Access-Control-Allow-Credentials", "true");
-        response.setHeader("Access-Control-Allow-Origin", origin != null ? origin : "*");
-        response.setHeader("Access-Control-Allow-Methods", "PUT,POST,	GET,DELETE,OPTIONS");
-        // 鍏佽鑷畾涔夎姹傚ごtoken(鍏佽head璺ㄥ煙)
-        response.setHeader("Access-Control-Allow-Headers", "token, Accept, Origin, X-Requested-With, Content-Type, Last-Modified");
-        response.setHeader("Content-type", "application/json;charset=UTF-8");
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("code", ErrorCode.ERROR401.getCode());
         jsonObject.put("msg", ErrorCode.ERROR401.getMsg());
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
index 91709aa..8fdcee1 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
@@ -24,14 +24,23 @@
 
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
+
+        // 蹇界暐鐧诲綍璇锋眰鐨則oken楠岃瘉
+        String requestURI = request.getRequestURI();
+        if (requestURI.equalsIgnoreCase("/api/user/login")) {
+            chain.doFilter(request, response);
+            return;
+        }
         String jwt = request.getHeader(JwtUtils.getHeader());
         // 杩欓噷濡傛灉娌℃湁jwt锛岀户缁線鍚庤蛋锛屽洜涓哄悗闈㈣繕鏈夐壌鏉冪鐞嗗櫒绛夊幓鍒ゆ柇鏄惁鎷ユ湁韬唤鍑瘉锛屾墍浠ユ槸鍙互鏀捐鐨�
         // 娌℃湁jwt鐩稿綋浜庡尶鍚嶈闂紝鑻ユ湁涓�浜涙帴鍙f槸闇�瑕佹潈闄愮殑锛屽垯涓嶈兘璁块棶杩欎簺鎺ュ彛
         if (StringUtils.isBlank(jwt)) {
-            chain.doFilter(request, response);
-            return;
+            jwt = request.getParameter(JwtUtils.getHeader());
+            if (StringUtils.isBlank(jwt)) {
+                chain.doFilter(request, response);
+                return;
+            }
         }
-
 
         JwtUser jwtUser = JwtUtils.verifyToken(jwt);
         String username = jwtUser.getUserName();
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
index 378e5d6..57911b0 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
@@ -23,7 +23,7 @@
 
     private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class);
 
-    private static final String HEADER = "Access-Token";
+    private static final String HEADER = "access-token";
     private static final String AUDIENCE = "Audience";
 
     private static final long EXPIRED_THRESHOLD = 10 * 60;
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java b/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
index 76f1162..a8d3568 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
@@ -27,16 +27,13 @@
     public static LoginUser login(String username, String password, AuthenticationManager authenticationManager) throws AuthenticationException {
         //浣跨敤security妗嗘灦鑷甫鐨勯獙璇乼oken鐢熸垚鍣�  涔熷彲浠ヨ嚜瀹氫箟銆�
         UsernamePasswordAuthenticationToken token =new UsernamePasswordAuthenticationToken(username,password);
-//        Authentication authenticate = authenticationManager.authenticate(token);
-//        SecurityContextHolder.getContext().setAuthentication(authenticate);
+        //璁よ瘉 濡傛灉澶辫触锛岃繖閲屼細鑷姩寮傚父鍚庤繑鍥烇紝鎵�浠ヨ繖閲屼笉闇�瑕佸垽鏂繑鍥炲�兼槸鍚︿负绌猴紝纭畾鏄惁鐧诲綍鎴愬姛
+        Authentication authenticate = authenticationManager.authenticate(token);
+        LoginUser user = (LoginUser) authenticate.getPrincipal();
+
         SecurityContextHolder.getContext().setAuthentication(token);
 
-
-//        LoginUser user = (LoginUser) authenticate.getPrincipal();
-        User user = new User();
-        user.setUsername(username);
-        LoginUser loginUser = new LoginUser(user, LocalDateTime.now());
-        return loginUser;
+        return user;
     }
 
     /**
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
index c700b8c..be2850f 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
@@ -18,8 +18,13 @@
 import org.springframework.security.config.http.SessionCreationPolicy;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.CorsConfigurationSource;
+import org.springframework.web.cors.CorsUtils;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 
-import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
 
 /**
  * 閰嶇疆Spring Security
@@ -61,12 +66,6 @@
     @Autowired
     private JwtAuthenticationFilter jwtAuthenticationFilter;
 
-//    @Bean
-//    JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
-//        JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(authenticationManager());
-//        return jwtAuthenticationFilter;
-//    }
-
 
     /**
      * 鎻忚堪: 闈欐�佽祫婧愭斁琛岋紝杩欓噷鐨勬斁琛岋紝鏄笉璧� Spring Security 杩囨护鍣ㄩ摼
@@ -77,27 +76,19 @@
         if (!userSetting.isInterfaceAuthentication()) {
             web.ignoring().antMatchers("**");
         }else {
+            ArrayList<String> matchers = new ArrayList<>();
+            matchers.add("/");
+            matchers.add("/#/**");
+            matchers.add("/static/**");
+            matchers.add("/index.html");
+            matchers.add("/doc.html");
+            matchers.add("/webjars/**");
+            matchers.add("/swagger-resources/**");
+            matchers.add("/v3/api-docs/**");
+            matchers.add("/js/**");
+            matchers.addAll(userSetting.getInterfaceAuthenticationExcludes());
             // 鍙互鐩存帴璁块棶鐨勯潤鎬佹暟鎹�
-            web.ignoring()
-                    .antMatchers("/")
-                    .antMatchers("/#/**")
-                    .antMatchers("/static/**")
-                    .antMatchers("/index.html")
-                    .antMatchers("/doc.html") // "/webjars/**", "/swagger-resources/**", "/v3/api-docs/**"
-                    .antMatchers("/webjars/**")
-                    .antMatchers("/swagger-resources/**")
-                    .antMatchers("/v3/api-docs/**")
-                    .antMatchers("/favicon.ico")
-                    .antMatchers("/js/**");
-            List<String> interfaceAuthenticationExcludes = userSetting.getInterfaceAuthenticationExcludes();
-            for (String interfaceAuthenticationExclude : interfaceAuthenticationExcludes) {
-                if (interfaceAuthenticationExclude.split("/").length < 4 ) {
-                    logger.warn("{}涓嶆弧瓒充袱绾х洰褰曪紝宸插拷鐣�", interfaceAuthenticationExclude);
-                }else {
-                    web.ignoring().antMatchers(interfaceAuthenticationExclude);
-                }
-
-            }
+            web.ignoring().antMatchers(matchers.toArray(new String[0]));
         }
     }
 
@@ -121,7 +112,7 @@
     @Override
     protected void configure(HttpSecurity http) throws Exception {
         http.headers().contentTypeOptions().disable()
-                .and().cors()
+                .and().cors().configurationSource(configurationSource())
                 .and().csrf().disable()
                 .sessionManagement()
                 .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
@@ -129,50 +120,36 @@
                 // 閰嶇疆鎷︽埅瑙勫垯
                 .and()
                 .authorizeRequests()
+                .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
+                .antMatchers(userSetting.getInterfaceAuthenticationExcludes().toArray(new String[0])).permitAll()
                 .antMatchers("/api/user/login","/index/hook/**").permitAll()
                 .anyRequest().authenticated()
                 // 寮傚父澶勭悊鍣�
                 .and()
                 .exceptionHandling()
                 .authenticationEntryPoint(anonymousAuthenticationEntryPoint)
-//                .accessDeniedHandler(jwtAccessDeniedHandler)
-                // 閰嶇疆鑷畾涔夌殑杩囨护鍣�
-//                .and()
-//                .addFilter(jwtAuthenticationFilter)
-                // 楠岃瘉鐮佽繃婊ゅ櫒鏀惧湪UsernamePassword杩囨护鍣ㄤ箣鍓�
-//                .addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class)
+                .and().logout().logoutUrl("/api/user/logout").permitAll()
+                .logoutSuccessHandler(logoutHandler)
         ;
         http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
-//        // 璁剧疆鍏佽娣诲姞闈欐�佹枃浠�
-//        http.headers().contentTypeOptions().disable();
-//        http.authorizeRequests()
-//                // 鏀捐鎺ュ彛
-//                .antMatchers("/api/user/login","/index/hook/**").permitAll()
-//                // 闄や笂闈㈠鐨勬墍鏈夎姹傚叏閮ㄩ渶瑕侀壌鏉冭璇�
-//                .anyRequest().authenticated()
-//                // 绂佺敤session
-//                .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
-//                // 寮傚父澶勭悊(鏉冮檺鎷掔粷銆佺櫥褰曞け鏁堢瓑)
-//                .and().exceptionHandling()
-//                // 鍖垮悕鐢ㄦ埛璁块棶鏃犳潈闄愯祫婧愭椂鐨勫紓甯稿鐞�
-//                .authenticationEntryPoint(anonymousAuthenticationEntryPoint)
-//                // 鐧诲綍 鍏佽鎵�鏈夌敤鎴�
-//                .and().formLogin()
-//                // 鐧诲綍鎴愬姛澶勭悊閫昏緫 鍦ㄨ繖閲岀粰鍑篔WT
-//                .successHandler(loginSuccessHandler)
-//                // 鐧诲綍澶辫触澶勭悊閫昏緫
-//                .failureHandler(loginFailureHandler)
-//                // 鐧诲嚭
-//                .and().logout().logoutUrl("/api/user/logout").permitAll()
-//                // 鐧诲嚭鎴愬姛澶勭悊閫昏緫
-//                .logoutSuccessHandler(logoutHandler)
-//                // 閰嶇疆鑷畾涔夌殑杩囨护鍣�
-//                .and()
-//                .addFilter(jwtAuthenticationFilter())
-//        ;
 
     }
 
+    CorsConfigurationSource configurationSource(){
+        // 閰嶇疆璺ㄥ煙
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
+        corsConfiguration.setAllowedMethods(Arrays.asList("*"));
+        corsConfiguration.setMaxAge(3600L);
+        corsConfiguration.setAllowCredentials(true);
+        corsConfiguration.setAllowedOrigins(userSetting.getAllowedOrigins());
+        corsConfiguration.setExposedHeaders(Arrays.asList(JwtUtils.getHeader()));
+
+        UrlBasedCorsConfigurationSource url = new UrlBasedCorsConfigurationSource();
+        url.registerCorsConfiguration("/**",corsConfiguration);
+        return url;
+    }
+
     /**
      * 鎻忚堪: 瀵嗙爜鍔犲瘑绠楁硶 BCrypt 鎺ㄨ崘浣跨敤
      **/
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java
index 6ad1ed7..d293b8d 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java
@@ -28,6 +28,10 @@
         return new WVPResult<>(ErrorCode.SUCCESS.getCode(), msg, t);
     }
 
+    public static WVPResult success() {
+        return new WVPResult<>(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), null);
+    }
+
     public static <T> WVPResult<T> success(T t) {
         return success(t, ErrorCode.SUCCESS.getMsg());
     }
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java
index eac68ca..544e345 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java
@@ -31,7 +31,6 @@
 import java.util.UUID;
 
 @Tag(name = "鍥芥爣璁惧閰嶇疆")
-
 @RestController
 @RequestMapping("/api/device/config")
 public class DeviceConfig {
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
index 7a8732c..d0accf4 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
@@ -24,6 +24,7 @@
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.commons.compress.utils.IOUtils;
+import org.apache.ibatis.annotations.Options;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -97,8 +98,10 @@
 	@Parameter(name = "page", description = "褰撳墠椤�", required = true)
 	@Parameter(name = "count", description = "姣忛〉鏌ヨ鏁伴噺", required = true)
 	@GetMapping("/devices")
+	@Options()
 	public PageInfo<Device> devices(int page, int count){
-		
+//		if (page == null) page = 0;
+//		if (count == null) count = 20;
 		return storager.queryVideoDeviceList(page, count,null);
 	}
 
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java
index ad2c13b..88126ac 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java
@@ -23,7 +23,6 @@
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -69,9 +68,6 @@
     @Value("${server.port}")
     private int serverPort;
 
-
-    @Autowired
-    private ThreadPoolTaskExecutor taskExecutor;
 
     @Autowired
     private IRedisCatchStorage redisCatchStorage;
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
index 826dd51..035f380 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
@@ -27,7 +27,6 @@
 import java.util.List;
 
 @Tag(name  = "鐢ㄦ埛绠$悊")
-
 @RestController
 @RequestMapping("/api/user")
 public class UserController {
@@ -47,7 +46,7 @@
     @Parameter(name = "username", description = "鐢ㄦ埛鍚�", required = true)
     @Parameter(name = "password", description = "瀵嗙爜锛�32浣峬d5鍔犲瘑锛�", required = true)
     public LoginUser login(HttpServletRequest request, HttpServletResponse response, @RequestParam String username, @RequestParam String password){
-        LoginUser user = null;
+        LoginUser user;
         try {
             user = SecurityUtils.login(username, password, authenticationManager);
         } catch (AuthenticationException e) {
@@ -62,6 +61,25 @@
         return user;
     }
 
+//    @GetMapping("/logout")
+//    @PostMapping("/logout")
+//    @Operation(summary = "鐧诲嚭")
+//    public LoginUser logout(){
+//        LoginUser user;
+//        try {
+//            user = SecurityUtils.login(username, password, authenticationManager);
+//        } catch (AuthenticationException e) {
+//            throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage());
+//        }
+//        if (user == null) {
+//            throw new ControllerException(ErrorCode.ERROR100.getCode(), "鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
+//        }else {
+//            String jwt = JwtUtils.createToken(username, password);
+//            response.setHeader(JwtUtils.getHeader(), jwt);
+//        }
+//        return user;
+//    }
+
     @PostMapping("/changePassword")
     @Operation(summary = "淇敼瀵嗙爜")
     @Parameter(name = "username", description = "鐢ㄦ埛鍚�", required = true)
diff --git a/src/main/resources/all-application.yml b/src/main/resources/all-application.yml
index 3908019..3844971 100644
--- a/src/main/resources/all-application.yml
+++ b/src/main/resources/all-application.yml
@@ -201,6 +201,10 @@
     sip-log: true
     # 鑷姩鏁版嵁搴撳崌绾э紝淇濊瘉琛ㄧ粨鏋勫畬鏁�
     sync-db: true
+    # 璺ㄥ煙閰嶇疆锛岄厤缃綘璁块棶鍓嶇椤甸潰鐨勫湴鍧�鍗冲彲锛� 鍙互閰嶇疆澶氫釜
+    allowed-origins:
+        - http://localhost:8008
+        - http://192.168.1.3:8008
 
 # 鍏抽棴鍦ㄧ嚎鏂囨。锛堢敓浜х幆澧冨缓璁叧闂級
 springdoc:
diff --git a/web_src/package-lock.json b/web_src/package-lock.json
index c6e972a..b8b9a8d 100644
--- a/web_src/package-lock.json
+++ b/web_src/package-lock.json
@@ -23,7 +23,7 @@
         "vue-clipboard2": "^0.3.1",
         "vue-clipboards": "^1.3.0",
         "vue-contextmenujs": "^1.3.13",
-        "vue-cookies": "^1.7.4",
+        "vue-cookies": "^1.8.3",
         "vue-giant-tree": "^0.1.5",
         "vue-router": "^3.1.6",
         "vue-ztree-2.0": "^1.0.4"
@@ -13135,9 +13135,9 @@
       "integrity": "sha1-O9rgI8e9QgleeNpCWAACUNUKuO8="
     },
     "node_modules/vue-cookies": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npm.taobao.org/vue-cookies/download/vue-cookies-1.7.4.tgz?cache=0&sync_timestamp=1598941352058&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-cookies%2Fdownload%2Fvue-cookies-1.7.4.tgz",
-      "integrity": "sha1-0kHQoEMdoHlYN2UdELTXPnyNPo0="
+      "version": "1.8.3",
+      "resolved": "https://registry.npmmirror.com/vue-cookies/-/vue-cookies-1.8.3.tgz",
+      "integrity": "sha512-VBRsyRMVdahBgFfh389TMHPmDdr4URDJNMk4FKSCfuNITs7+jitBDhwyL4RJd3WUsfOYNNjPAkfbehyH9AFuoA=="
     },
     "node_modules/vue-giant-tree": {
       "version": "0.1.5",
@@ -25489,9 +25489,9 @@
       "integrity": "sha1-O9rgI8e9QgleeNpCWAACUNUKuO8="
     },
     "vue-cookies": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npm.taobao.org/vue-cookies/download/vue-cookies-1.7.4.tgz?cache=0&sync_timestamp=1598941352058&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-cookies%2Fdownload%2Fvue-cookies-1.7.4.tgz",
-      "integrity": "sha1-0kHQoEMdoHlYN2UdELTXPnyNPo0="
+      "version": "1.8.3",
+      "resolved": "https://registry.npmmirror.com/vue-cookies/-/vue-cookies-1.8.3.tgz",
+      "integrity": "sha512-VBRsyRMVdahBgFfh389TMHPmDdr4URDJNMk4FKSCfuNITs7+jitBDhwyL4RJd3WUsfOYNNjPAkfbehyH9AFuoA=="
     },
     "vue-giant-tree": {
       "version": "0.1.5",
diff --git a/web_src/package.json b/web_src/package.json
index 18b3332..dd4dfe6 100644
--- a/web_src/package.json
+++ b/web_src/package.json
@@ -25,7 +25,7 @@
     "vue-clipboard2": "^0.3.1",
     "vue-clipboards": "^1.3.0",
     "vue-contextmenujs": "^1.3.13",
-    "vue-cookies": "^1.7.4",
+    "vue-cookies": "^1.8.3",
     "vue-giant-tree": "^0.1.5",
     "vue-router": "^3.1.6",
     "vue-ztree-2.0": "^1.0.4"
diff --git a/web_src/src/App.vue b/web_src/src/App.vue
index 4ae7ea8..e7d45b7 100644
--- a/web_src/src/App.vue
+++ b/web_src/src/App.vue
@@ -5,6 +5,7 @@
 </template>
 
 <script>
+import  userService from './components/service/UserService'
 export default {
   name: 'app',
   data(){
@@ -19,7 +20,7 @@
     }
   },
   created() {
-    if(!this.$cookies.get("session")){
+    if (userService.getToken() == null){
       //濡傛灉娌℃湁鐧诲綍鐘舵�佸垯璺宠浆鍒扮櫥褰曢〉
       this.$router.push('/login');
     }
@@ -33,28 +34,14 @@
     // this.getUserInfo();
   },
   methods: {
-    //璇锋眰鐢ㄦ埛鐨勪竴浜涗俊鎭�
-    getUserInfo(){
-      var userinfo = this.$cookies.get("session");
-    },
     checkLogin(){
       //妫�鏌ユ槸鍚﹀瓨鍦╯ession
-      //cookie鎿嶄綔鏂规硶鍦ㄦ簮鐮侀噷鏈夋垨鑰呭弬鑰冪綉涓婄殑鍗冲彲
-      if(!this.$cookies.get("session")){
+      if (userService.getToken() == null){
         //濡傛灉娌℃湁鐧诲綍鐘舵�佸垯璺宠浆鍒扮櫥褰曢〉
-        this.$router.push('/login');
+        // this.$router.push('/login');
       }
+
     },
-    getCookie: function (cname) {
-      var name = cname + "=";
-      var ca = document.cookie.split(';');
-      for (var i = 0; i < ca.length; i++) {
-        var c = ca[i];
-        while (c.charAt(0) == ' ') c = c.substring(1);
-        if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
-      }
-      return "";
-    }
   },
   components: {}
 };
diff --git a/web_src/src/components/Login.vue b/web_src/src/components/Login.vue
index 37c8a83..64a3cbd 100644
--- a/web_src/src/components/Login.vue
+++ b/web_src/src/components/Login.vue
@@ -35,6 +35,7 @@
 
 <script>
 import crypto from 'crypto'
+import userService from "./service/UserService";
 export default {
   name: 'Login',
   data(){
@@ -85,9 +86,10 @@
         params: loginParam
       }).then(function (res) {
         window.clearTimeout(timeoutTask)
-        console.log(JSON.stringify(res));
+        console.log(res);
+        console.log("鐧诲綍鎴愬姛");
           if (res.data.code === 0 ) {
-            that.$cookies.set("session", {"username": that.username,"roleId":res.data.data.role.id}) ;
+            userService.setUser(res.data.data)
             //鐧诲綍鎴愬姛鍚�
             that.cancelEnterkeyDefaultAction();
             that.$router.push('/');
@@ -105,14 +107,6 @@
         that.$message.error(error.response.data.msg);
         that.isLoging = false;
       });
-    },
-    setCookie: function (cname, cvalue, exdays) {
-      var d = new Date();
-      d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
-      var expires = "expires=" + d.toUTCString();
-      console.info(cname + "=" + cvalue + "; " + expires);
-      document.cookie = cname + "=" + cvalue + "; " + expires;
-      console.info(document.cookie);
     },
     cancelEnterkeyDefaultAction: function() {
         document.onkeydown = function(e) {
diff --git a/web_src/src/components/dialog/changePassword.vue b/web_src/src/components/dialog/changePassword.vue
index 77e1d2a..5ab2d2f 100644
--- a/web_src/src/components/dialog/changePassword.vue
+++ b/web_src/src/components/dialog/changePassword.vue
@@ -35,6 +35,7 @@
 
 <script>
 import crypto from 'crypto'
+import userService from "../service/UserService";
 export default {
   name: "changePassword",
   props: {},
@@ -105,7 +106,7 @@
           this.showDialog = false;
           setTimeout(()=>{
             // 鍒犻櫎cookie锛屽洖鍒扮櫥褰曢〉闈�
-            this.$cookies.remove("session");
+            userService.clearUserInfo();
             this.$router.push('/login');
             this.sseSource.close();
           },800)
diff --git a/web_src/src/components/dialog/importChannel.vue b/web_src/src/components/dialog/importChannel.vue
index 91611e8..e61b642 100644
--- a/web_src/src/components/dialog/importChannel.vue
+++ b/web_src/src/components/dialog/importChannel.vue
@@ -16,6 +16,7 @@
           drag
           :action="uploadUrl"
           name="file"
+          :headers="headers"
           :on-success="successHook"
           :on-error="errorHook"
           >
@@ -33,6 +34,8 @@
 
 import ShowErrorData from './importChannelShowErrorData.vue'
 
+import userService from "../service/UserService";
+
 export default {
   name: "importChannel",
   components: {
@@ -47,7 +50,10 @@
       isEdit: false,
       errorStreams: [],
       errorGBIds: [],
-      uploadUrl: process.env.NODE_ENV === 'development'?`debug/api/push/upload`:`api/push/upload`,
+      headers: {
+        "access-token": userService.getToken()
+      },
+      uploadUrl: process.env.NODE_ENV === 'development'? `http://127.0.0.1:8080/debug/api/push/upload`: (window.baseUrl ? window.baseUrl : "") + `/api/push/upload`,
     };
   },
   methods: {
diff --git a/web_src/src/components/service/UserService.js b/web_src/src/components/service/UserService.js
new file mode 100644
index 0000000..0212dc8
--- /dev/null
+++ b/web_src/src/components/service/UserService.js
@@ -0,0 +1,42 @@
+
+export default {
+
+  /**
+   * 瀛樺偍鐢ㄦ埛淇℃伅
+   * @param username
+   * @param token
+   */
+  setUser(user){
+    localStorage.setItem("wvp-user", JSON.stringify(user));
+  },
+
+  /**
+   * 鑾峰彇鐢ㄦ埛
+   */
+  getUser(){
+    return JSON.parse(localStorage.getItem("wvp-user"));
+  },
+
+
+  /**
+   * 鑾峰彇鐧诲綍token
+   */
+  getToken(){
+    return localStorage.getItem("wvp-token");
+  },
+
+  /**
+   * 娓呯悊鐢ㄦ埛淇℃伅
+   */
+  clearUserInfo(){
+    localStorage.removeItem("wvp-user");
+    localStorage.removeItem("wvp-token");
+  },
+  /**
+   * 鏇存柊token
+   * @param header
+   */
+  setToken(token) {
+    localStorage.setItem("wvp-token", token);
+  }
+}
diff --git a/web_src/src/layout/UiHeader.vue b/web_src/src/layout/UiHeader.vue
index fa9be3e..3e9cca0 100644
--- a/web_src/src/layout/UiHeader.vue
+++ b/web_src/src/layout/UiHeader.vue
@@ -23,9 +23,9 @@
       <!--            </el-submenu>-->
       <!--            <el-menu-item style="float: right;" @click="loginout">閫�鍑�</el-menu-item>-->
       <el-submenu index="" style="float: right;">
-        <template slot="title">娆㈣繋锛寋{ this.$cookies.get("session").username }}</template>
+        <template slot="title">娆㈣繋锛寋{ username }}</template>
         <el-menu-item @click="openDoc">鍦ㄧ嚎鏂囨。</el-menu-item>
-        <el-menu-item >
+        <el-menu-item>
           <el-switch v-model="alarmNotify" inactive-text="鎶ヨ淇℃伅鎺ㄩ��" @change="alarmNotifyChannge"></el-switch>
         </el-menu-item>
         <el-menu-item @click="changePassword">淇敼瀵嗙爜</el-menu-item>
@@ -39,6 +39,7 @@
 <script>
 
 import changePasswordDialog from '../components/dialog/changePassword.vue'
+import userService from '../components/service/UserService'
 
 export default {
   name: "UiHeader",
@@ -47,14 +48,17 @@
     return {
       alarmNotify: false,
       sseSource: null,
+      username: userService.getUser().username,
       activeIndex: this.$route.path,
-      editUser: this.$cookies.get("session").roleId==1
+      editUser: userService.getUser() ? userService.getUser().role.id === 1 : false
     };
   },
   created() {
-    console.log(this.$cookies.get("session"))
+    console.log(4444)
+    console.log(JSON.stringify(userService.getUser()))
     if (this.$route.path.startsWith("/channelList")) {
       this.activeIndex = "/deviceList"
+
     }
   },
   mounted() {
@@ -69,10 +73,13 @@
         method: 'get',
         url: "/api/user/logout"
       }).then((res) => {
-        // 鍒犻櫎cookie锛屽洖鍒扮櫥褰曢〉闈�
-        this.$cookies.remove("session");
+        // 鍒犻櫎鐢ㄦ埛淇℃伅锛屽洖鍒扮櫥褰曢〉闈�
+        userService.clearUserInfo()
         this.$router.push('/login');
-        this.sseSource.close();
+        if (this.sseSource != null) {
+          this.sseSource.close();
+        }
+
       }).catch((error) => {
         console.error("鐧诲嚭澶辫触")
         console.error(error)
@@ -151,16 +158,19 @@
 </script>
 <style>
 #UiHeader .el-switch__label {
-  color: white ;
+  color: white;
 }
+
 .el-menu--popup .el-menu-item .el-switch .el-switch__label {
   color: white !important;
 }
-#UiHeader .el-switch__label.is-active{
+
+#UiHeader .el-switch__label.is-active {
   color: #409EFF;
 }
+
 #UiHeader .el-menu-item.is-active {
-  color: #fff!important;
-  background-color: #1890ff!important;
+  color: #fff !important;
+  background-color: #1890ff !important;
 }
 </style>
diff --git a/web_src/src/main.js b/web_src/src/main.js
index 91bbd47..a6c6e1b 100644
--- a/web_src/src/main.js
+++ b/web_src/src/main.js
@@ -1,5 +1,6 @@
 import Vue from 'vue';
 import App from './App.vue';
+
 Vue.config.productionTip = false;
 import ElementUI from 'element-ui';
 import 'element-ui/lib/theme-chalk/index.css';
@@ -10,15 +11,16 @@
 import VCharts from 'v-charts';
 
 import VueClipboard from 'vue-clipboard2';
-import { Notification } from 'element-ui';
+import {Notification} from 'element-ui';
 import Fingerprint2 from 'fingerprintjs2';
 import VueClipboards from 'vue-clipboards';
 import Contextmenu from "vue-contextmenujs"
+import userService from "./components/service/UserService"
 
 
 // 鐢熸垚鍞竴ID
-Fingerprint2.get(function(components) {
-  const values = components.map(function(component,index) {
+Fingerprint2.get(function (components) {
+  const values = components.map(function (component, index) {
     if (index === 0) { //鎶婂井淇℃祻瑙堝櫒閲孶A鐨剋ifi鎴�4G绛夌綉缁滄浛鎹㈡垚绌�,涓嶇劧鍒囨崲缃戠粶浼欼D涓嶄竴鏍�
       return component.value.replace(/\bNetType\/\w+\b/, '');
     }
@@ -42,13 +44,17 @@
 Vue.use(Contextmenu);
 Vue.use(VCharts);
 
-axios.defaults.baseURL = (process.env.NODE_ENV === 'development') ? process.env.BASE_API : (window.baseUrl?window.baseUrl:"");
+axios.defaults.baseURL = (process.env.NODE_ENV === 'development') ? process.env.BASE_API : (window.baseUrl ? window.baseUrl : "");
 axios.defaults.withCredentials = true;
 // api 杩斿洖401鑷姩鍥炵櫥闄嗛〉闈�
-axios.interceptors.response.use(function (response) {
+axios.interceptors.response.use((response) => {
   // 瀵瑰搷搴旀暟鎹仛鐐逛粈涔�
+  let token = response.headers["access-token"];
+  if (token) {
+    userService.setToken(token)
+  }
   return response;
-}, function (error) {
+}, (error) => {
   // 瀵瑰搷搴旈敊璇仛鐐逛粈涔�
   if (error.response.status === 401) {
     console.log("Received 401 Response")
@@ -56,10 +62,22 @@
   }
   return Promise.reject(error);
 });
+axios.interceptors.request.use(
+  config => {
+    if (userService.getToken() != null && config.url !== "/api/user/login") {
+      config.headers['access-token'] = `${userService.getToken()}`;
+    }
+    return config;
+  },
+  error => {
+    return Promise.reject(error);
+  }
+);
+
 Vue.prototype.$axios = axios;
 Vue.prototype.$cookies.config(60*30);
 
 new Vue({
-	router: router,
-	render: h => h(App),
+  router: router,
+  render: h => h(App),
 }).$mount('#app')

--
Gitblit v1.8.0