package com.iformall.controller; import com.google.code.kaptcha.Constants; import com.google.code.kaptcha.Producer; import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.controller.base.BaseController; import com.iformall.domain.po.MallUserInfo; import com.iformall.exception.MallinkException; import com.iformall.shiro.UserSession; import com.iformall.utils.ShiroUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; @RestController @Api(description = "登录相关接口") public class HomeController extends BaseController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Value("${version}") private String version; @Autowired private Producer producer; @GetMapping("/captcha.jpg") public void captcha(HttpServletResponse response)throws ServletException, IOException { logger.debug("[" + getIpAddr() + "] HomeController::captcha"); response.setHeader("Cache-Control", "no-store, no-cache"); response.setContentType("image/jpeg"); //生成文字验证码 String text = producer.createText(); //生成图片验证码 BufferedImage image = producer.createImage(text); //保存到shiro session ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text); ServletOutputStream out = response.getOutputStream(); ImageIO.write(image, "jpg", out); IOUtils.closeQuietly(out); } @ApiOperation("登录") @PostMapping("/doLogin") public ResultData login(@RequestBody MallUserInfo user, HttpServletResponse response) { logger.debug("[" + getIpAddr() + "] HomeController::login"); try { String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY); if(!user.getCaptcha().equalsIgnoreCase(kaptcha)){ return new ResultData(ErrorCode.KAPCHA_NOT_EQUAL); } } catch (MallinkException e) { logger.error("验证码" + e.getMessage()); return new ResultData(ErrorCode.KAPCHA_NOT_VALID.getCode(), e.getMessage()); } ResultData data = new ResultData(); if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())) { // throw new SystemException(ErrorCode.LOGIN_USER_OR_PWD_ERROR); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } try { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword()); subject.login(token); MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo); info.setPassword("保密"); info.setBopenId("保密"); if(StringUtils.isNotBlank(info.getWebOpenId())) { info.setWebOpenId("保密"); } Cookie unameCookie = new Cookie("uname", info.getUsername()); unameCookie.setMaxAge(60); response.addCookie(unameCookie); data.data = info; } catch (Exception e) { return new ResultData(ErrorCode.USER_PASSWD_ERR); } return data; } @ApiOperation("登出") @GetMapping("/logout") public ResultData logout() { logger.debug("[" + getIpAddr() + "] HomeController::logout"); ResultData data = new ResultData(); SecurityUtils.getSubject().logout(); return data; } @ApiOperation("获取后端版本号") @GetMapping("/version") public ResultData version() { return new ResultData(version); } }