You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
4.5 KiB

  1. package com.iformall.controller;
  2. import com.google.code.kaptcha.Constants;
  3. import com.google.code.kaptcha.Producer;
  4. import com.iformall.common.ErrorCode;
  5. import com.iformall.common.ResultData;
  6. import com.iformall.controller.base.BaseController;
  7. import com.iformall.domain.po.MallUserInfo;
  8. import com.iformall.exception.MallinkException;
  9. import com.iformall.shiro.UserSession;
  10. import com.iformall.utils.ShiroUtils;
  11. import io.swagger.annotations.Api;
  12. import io.swagger.annotations.ApiOperation;
  13. import org.apache.commons.io.IOUtils;
  14. import org.apache.commons.lang3.StringUtils;
  15. import org.apache.shiro.SecurityUtils;
  16. import org.apache.shiro.authc.UsernamePasswordToken;
  17. import org.apache.shiro.subject.Subject;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.beans.factory.annotation.Value;
  22. import org.springframework.web.bind.annotation.GetMapping;
  23. import org.springframework.web.bind.annotation.PostMapping;
  24. import org.springframework.web.bind.annotation.RequestBody;
  25. import org.springframework.web.bind.annotation.RestController;
  26. import javax.imageio.ImageIO;
  27. import javax.servlet.ServletException;
  28. import javax.servlet.ServletOutputStream;
  29. import javax.servlet.http.Cookie;
  30. import javax.servlet.http.HttpServletResponse;
  31. import java.awt.image.BufferedImage;
  32. import java.io.IOException;
  33. @RestController
  34. @Api(description = "登录相关接口")
  35. public class HomeController extends BaseController {
  36. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  37. @Value("${version}")
  38. private String version;
  39. @Autowired
  40. private Producer producer;
  41. @GetMapping("/captcha.jpg")
  42. public void captcha(HttpServletResponse response)throws ServletException, IOException {
  43. logger.debug("[" + getIpAddr() + "] HomeController::captcha");
  44. response.setHeader("Cache-Control", "no-store, no-cache");
  45. response.setContentType("image/jpeg");
  46. //生成文字验证码
  47. String text = producer.createText();
  48. //生成图片验证码
  49. BufferedImage image = producer.createImage(text);
  50. //保存到shiro session
  51. ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);
  52. ServletOutputStream out = response.getOutputStream();
  53. ImageIO.write(image, "jpg", out);
  54. IOUtils.closeQuietly(out);
  55. }
  56. @ApiOperation("登录")
  57. @PostMapping("/doLogin")
  58. public ResultData login(@RequestBody MallUserInfo user, HttpServletResponse response) {
  59. logger.debug("[" + getIpAddr() + "] HomeController::login");
  60. try {
  61. String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
  62. if(!user.getCaptcha().equalsIgnoreCase(kaptcha)){
  63. return new ResultData(ErrorCode.KAPCHA_NOT_EQUAL);
  64. }
  65. } catch (MallinkException e) {
  66. logger.error("验证码" + e.getMessage());
  67. return new ResultData(ErrorCode.KAPCHA_NOT_VALID.getCode(), e.getMessage());
  68. }
  69. ResultData data = new ResultData();
  70. if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())) {
  71. // throw new SystemException(ErrorCode.LOGIN_USER_OR_PWD_ERROR);
  72. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  73. }
  74. try {
  75. Subject subject = SecurityUtils.getSubject();
  76. UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());
  77. subject.login(token);
  78. MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo);
  79. info.setPassword("保密");
  80. info.setBopenId("保密");
  81. if(StringUtils.isNotBlank(info.getWebOpenId())) {
  82. info.setWebOpenId("保密");
  83. }
  84. Cookie unameCookie = new Cookie("uname", info.getUsername());
  85. unameCookie.setMaxAge(60);
  86. response.addCookie(unameCookie);
  87. data.data = info;
  88. } catch (Exception e) {
  89. return new ResultData(ErrorCode.USER_PASSWD_ERR);
  90. }
  91. return data;
  92. }
  93. @ApiOperation("登出")
  94. @GetMapping("/logout")
  95. public ResultData logout() {
  96. logger.debug("[" + getIpAddr() + "] HomeController::logout");
  97. ResultData data = new ResultData();
  98. SecurityUtils.getSubject().logout();
  99. return data;
  100. }
  101. @ApiOperation("获取后端版本号")
  102. @GetMapping("/version")
  103. public ResultData version() {
  104. return new ResultData(version);
  105. }
  106. }