1.登錄功能
①流程分析

②抽取接口
被抽取接口的類:member-manager工程的com.rgh.crowd.controller.MemberController
抽取得到的接口:common工程的com.rgh.crowd.api.MemberOperationRemoteService
@FeignClient("member-manager")
public interface MemberOperationRemoteService {
@RequestMapping("/retrieve/member/launch/info/by/member/token")
public ResultEntity<MemberLaunchInfoPO> retrieveMemberLaunchInfoByMemberToken(@RequestParam("token") String token);
@RequestMapping("/member/manager/logout")
public ResultEntity<String> logout(@RequestParam("token") String token);
@RequestMapping("/member/manager/login")
public ResultEntity<MemberSignSuccessVO> login(
@RequestParam("loginAcct") String loginAcct,
@RequestParam("userPswd") String userPswd);
@RequestMapping("/member/manager/register")
public ResultEntity<String> register(@RequestBody MemberVO memberVO);
@RequestMapping("/member/manager/send/code")
public ResultEntity<String> sendCode(@RequestParam("phoneNum") String phoneNum);
}
③確認(rèn)在Eureka注冊中心注冊member-manager

3.登錄功能具體實現(xiàn)
①SpringBoot環(huán)境下SpringMVC詳細(xì)配置
創(chuàng)建配置類,實現(xiàn)org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口
所在工程: distribution-crowd-7-webui
所在類: com.rgh.crowd.config.SpringMVCConfig
@Configuration
public class SpringMVCConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 相當(dāng)于:<mvc:view-controller path="/to/login/page.html" view-name="member-login" />
// 跳轉(zhuǎn)到登錄頁面
String urlPath = "/member/to/login/page.html";
String viewName = "member-login";
registry.addViewController(urlPath).setViewName(viewName);
// 跳轉(zhuǎn)到個人中心頁面
urlPath = "/member/to/member/center/page.html";
viewName = "member-center";
registry.addViewController(urlPath).setViewName(viewName);
}
}
②實體類序列化問題
member-manager調(diào)用database-provider和redis-provider時并沒有要求實體類序列化。但是webui調(diào)用member-manager時要求序列化。所以需要給實體類附加序列化支持。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MemberSignSuccessVO implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String email;
private String token;
}
③webui工程的Controller方法
@RequestMapping("/member/do/login.html")
public String doLogin(MemberVO memberVO, Model model, HttpSession session) {
String loginAcct = memberVO.getLoginacct();
String userPswd = memberVO.getUserpswd();
// 調(diào)用遠(yuǎn)程方法執(zhí)行登錄操作
ResultEntity<MemberSignSuccessVO> resultEntity = memberManagerRemoteService.login(loginAcct, userPswd);
// 檢查遠(yuǎn)程方法調(diào)用結(jié)果
String result = resultEntity.getResult();
if(ResultEntity.FAILED.equals(result)) {
String message = resultEntity.getMessage();
model.addAttribute(CrowdConstant.ATTR_NAME_MESSAGE, message);
return "member-login";
}
// 如果登錄成功,則獲取MemberSignSuccessVO對象
MemberSignSuccessVO memberSignSuccessVO = resultEntity.getData();
// 將MemberSignSuccessVO對象存入Session域
session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_MEMBER, memberSignSuccessVO);
return "redirect:/member/to/member/center/page.html";
}
④個人中心頁面訪問Session域顯示用戶昵稱
[[${session['LOGIN-MEMBER'].username}]]
2.退出登錄
@RequestMapping("/member/logout.html")
public String logout(HttpSession session) {
// 1.從現(xiàn)有Session中獲取已登錄的Member
MemberSignSuccessVO memberSignSuccessVO = (MemberSignSuccessVO) session.getAttribute(CrowdConstant.ATTR_NAME_LOGIN_MEMBER);
// 2.如果memberSignSuccessVO為null,則已經(jīng)退出,不必繼續(xù)執(zhí)行
if(memberSignSuccessVO == null) {
return "redirect:/";
}
// 3.獲取token值
String token = memberSignSuccessVO.getToken();
// 4.調(diào)用遠(yuǎn)程方法刪除Redis中存儲的token
ResultEntity<String> resultEntity = memberManagerRemoteService.logout(token);
// 5.如果調(diào)用遠(yuǎn)程方法失敗,拋出異常
String result = resultEntity.getResult();
if(ResultEntity.FAILED.equals(result)) {
throw new RuntimeException(resultEntity.getMessage());
}
// 6.釋放當(dāng)前Session
session.invalidate();
return "redirect:/index.html";
}
⑤登錄頁面
文件路徑:/distribution-crowd-7-webui/src/main/resources/templates/member_login.html
⑥個人中心頁面
文件路徑:/distribution-crowd-7-webui/src/main/resources/templates/member_center.html