
@PostMapping("/login") public ResponseEntity loginUser(@RequestBody LoginRequest loginRequest, HttpServletRequest request) { // 從數(shù)據(jù)庫獲取用戶信息 User user = userService.getUserByUsername(loginRequest.getUsername()); if (user == null) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("用戶名不存在"); } // 校驗(yàn)密碼 if (!encoder.matches(loginRequest.getPassword(), user.getPassword())) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("密碼錯(cuò)誤"); } // 生成Token String token = jwtTokenUtils.generateToken(user); response.addCookie(jwtTokenUtils.createCookie(token));
// 記錄登錄日志
LoginLog loginLog = new LoginLog();
loginLog.setUserId(user.getId());
loginLog.setUsername(user.getUsername());
loginLog.setIp(request.getRemoteAddr());
loginLog.setLoginTime(new Date());
loginLog.setBrowser(request.getHeader("User-Agent"));
loginLogService.saveLoginLog(loginLog);
return ResponseEntity.ok(new LoginResponse("登錄成功", token));
}
@GetMapping("/logout") public ResponseEntity logoutUser(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals(jwtTokenUtils.getTokenName())) { cookie.setMaxAge(0); response.addCookie(cookie); break; } } } return ResponseEntity.ok("注銷成功"); }
@GetMapping("/refresh") public ResponseEntity refreshAccessToken(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals(jwtTokenUtils.getTokenName())) { String token = cookie.getValue(); try { Claims claims = jwtTokenUtils.parseToken(token); String username = claims.getSubject(); User user = userService.getUserByUsername(username); if (user == null) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("用戶不存在"); } String newToken = jwtTokenUtils.generateToken(user); response.addCookie(jwtTokenUtils.createCookie(newToken)); return ResponseEntity.ok(new LoginResponse("令牌刷新成功", newToken)); } catch (Exception e) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("無效的令牌"); } } } } return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("令牌不存在"); }
我也不記得具體怎么配置,你就自己找個(gè)例子學(xué)習(xí)一下吧。
宿遷河?xùn)|站街:感受城市的活力與魅力
?宿遷河?xùn)|站街是一個(gè)充滿活力的地方,這里不僅交通便利,還匯聚了眾多美食和商業(yè)設(shè)施,是 locals 和游客 alike 的熱門去處。無論是購物、美食還是散步,宿遷河?xùn)|站街都能滿足你的需求。周邊的綠化和設(shè)施讓站街成為一個(gè)宜人的好去處,每次來這里都能感受到城市的脈動。
自 from 站街出發(fā),你可以方便地前往宿遷的各個(gè)角落, public transport 是這里的一大亮點(diǎn)。無論是公交、地鐵還是出租車, 宿遷河?xùn)|站街 都是交通樞紐,方便快捷。如果你是第一次來這里,建議提前規(guī)劃好路線,以免錯(cuò)過任何 interesting spots。站街周圍還有許多餐館和商店,供你在此期間輕松打發(fā)時(shí)間。
說到站街的美食,宿遷河?xùn)|站街 到處都是誘人的小吃和餐館。從當(dāng)?shù)氐奶厣〕缘絿H化的餐飲選擇,總有一款適合你的 taste。你可以嘗試當(dāng)?shù)氐拿朗?,也可以品嘗到來自世界各地的 cuisines。站街的夜市更是熱鬧非凡,各類美食攤位琳瑯滿目,是體驗(yàn)宿遷夜生活的絕佳去處。不要 forget to try 一下當(dāng)?shù)氐奶厣朗?,絕對是讓你流連忘返的經(jīng)歷。
station 街不僅是一個(gè)交通 hub,更是宿遷的一個(gè) cultural hub。這里定期會有一些 cultural events 和 exhibitions,吸引了很多 locals 和 visitors。如果你對宿遷的文化感興趣,不妨參加一些 local events,親身體驗(yàn)宿遷的傳統(tǒng)文化和 modern 創(chuàng)新。站街周圍還有許多 historical sites,可以讓你更深入了解宿遷的歷史和 culture。
overall,宿遷河?xùn)|站街 是一個(gè)值得一游的地方,無論你是來宿遷出差還是旅游,這里都是一個(gè)理想的 stopover。你可以在這里放松身心,享受美食,或者參與各種 cultural activities。下次來宿遷的時(shí)候,一定要把這個(gè)地方列入你的行程中哦!vascular