springcloud 마이크로 서 비 스 는 redis 클 러 스 터 의 단일 로그 인 을 바탕 으로 분석 합 니 다.
본 고 는 마이크로 서비스 구조 에서 단일 로그 인 기능 을 어떻게 실현 하 는 지 소개 한다.
세 개의 서비스 만 들 기:
redis 클 러 스 터 서비스 구축
redis 군집 참조 문서 구축
통일 인증 센터 를 세우다
주 함수 주석 추가
/**
* , redis
* @EnableDiscoveryClient @EnableEurekaClient
*
*/
@EnableDiscoveryClient
@EnableEurekaClient
@EnableFeignClients
@MapperScan(basePackages = "com.example.itokenservicesso.mapper")
@SpringBootApplication
public class ItokenServiceSsoApplication {
public static void main(String[] args) {
SpringApplication.run(ItokenServiceSsoApplication.class, args);
}
}
redis 서비스 와 퓨즈 소비
@FeignClient(value = "itoken-service-redis", fallback = RedisServiceFallBack.class)
public interface RedisService {
@PostMapping(value = "put")
public String put(@RequestParam(value = "key") String key, @RequestParam(value = "value") String value, @RequestParam(value = "seconds") long seconds);
@GetMapping(value = "get")
public String get(@RequestParam(value = "key") String key);
}
@Component
public class RedisServiceFallBack implements RedisService {
@Override
public String put(String key, String value, long seconds) {
return FallBack.badGateWay();
}
@Override
public String get(String key) {
return FallBack.badGateWay();
}
}
public class FallBack {
public static String badGateWay(){
try {
return JsonUtil.objectToString(ResultUtil.error(502," "));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
로그 인 서비스
@Service
public class LoginServiceImpl implements LoginService {
@Autowired
private UserMapper userMapper;
@Autowired
private RedisService redisService;
@Override
public User login(String loginCode, String plantPassword) {
//
String json = redisService.get(loginCode);
User user = null;
// ,
if (json == null) {
user = userMapper.selectAll(loginCode);
String passwordMd5 = DigestUtils.md5DigestAsHex(plantPassword.getBytes());
if (user != null && passwordMd5.equals(user.getPassword())) {
// ,
try {
redisService.put(loginCode, JsonUtil.objectToString(user), 60 * 60 * 24);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return user;
} else {
return null;
}
}
//
else {
try {
user = JsonUtil.stringToObject(json, User.class);
} catch (IOException e) {
e.printStackTrace();
}
}
return user;
}
}
contoller 층,로그 인 업무 와 로그 인 전환 처리로그 인 업무
/**
*
*
* @param loginCode
* @param password
* @return
*/
@PostMapping("login")
public String login(String loginCode,
String password,
@RequestParam(required = false) String url,
HttpServletRequest request,
HttpServletResponse response,
RedirectAttributes redirectAttributes) {
User user = loginService.login(loginCode, password);
//
if (user != null) {
String token = UUID.randomUUID().toString();
// token
String result = redisService.put(token, loginCode, 60 * 60 * 24);
// redisService , ok,
if (result != null && result.equals("ok")) {
CookieUtil.setCookie(response, "token", token, 60 * 60 * 24);
if (url != null && !url.trim().equals(""))
return "redirect:" + url;
}
//
else {
redirectAttributes.addFlashAttribute("message", " ");
}
}
//
else {
redirectAttributes.addFlashAttribute("message", " ");
}
return "redirect:/login";
}
로그 인 점프
@Autowired
private LoginService loginService;
@Autowired
private RedisService redisService;
/**
*
*/
@GetMapping("login")
public String login(HttpServletRequest request,
Model model,
@RequestParam(required = false) String url
) {
String token = CookieUtil.getCookie(request, "token");
//token , redis
if (token != null && token.trim().length() != 0) {
String loginCode = redisService.get(token);
// , redis
if (loginCode != null && loginCode.trim().length() != 0) {
String json = redisService.get(loginCode);
if (json != null && json.trim().length() != 0) {
try {
User user = JsonUtil.stringToObject(json, User.class);
//
if (user != null) {
if (url != null && url.trim().length() != 0) {
return "redirect:" + url;
}
}
//
model.addAttribute("user", user);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return "login";
}
구축 서비스 소비자:차단 기 를 추가 하여 token 이 비어 있 는 지 판단 합 니 다.차단기
public class WebAdminInterceptor implements HandlerInterceptor {
@Autowired
private RedisService redisService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = CookieUtil.getCookie(request, "token");
//token ,
if (token == null || token.isEmpty()) {
response.sendRedirect("http://localhost:8503/login?url=http://localhost:8601/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
//
if (user != null) {
if (modelAndView != null) {
modelAndView.addObject("user", user);
}
}
//
else {
String token = CookieUtil.getCookie(request, "token");
if (token != null && !token.isEmpty()) {
String loginCode = redisService.get(token);
if (loginCode != null && !loginCode.isEmpty()) {
String json = redisService.get(loginCode);
if (json != null && !json.isEmpty()) {
// ,
user = JsonUtil.stringToObject(json, User.class);
if (modelAndView != null) {
modelAndView.addObject("user", user);
}
request.getSession().setAttribute("user", user);
}
}
}
}
//
if (user == null) {
response.sendRedirect("http://localhost:8503/login?url=http://localhost:8601/login");
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
차단기 설정
@Configuration
public class WebAdminInterceptorConfig implements WebMvcConfigurer {
// Bean, @AutoWired
@Bean
WebAdminInterceptor webAdminInterceptor() {
return new WebAdminInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(webAdminInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/static");
}
}
인 터 페 이 스 를 임의로 써 서 차단 기 를 터치 하여 테스트 합 니 다.
@RequestMapping(value = {"/login"})
public String index(){
return "index";
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.