screen-common/src/main/java/com/moral/constant/Constants.java
@@ -15,6 +15,16 @@ */ public static final String MSG_OPERATION_FAILED = "操作失败!"; /* * token无效 * */ public static final String MSG_TOKEN_ERROR = "token无效,请重新登陆"; /* * token生成失败 * */ public static final String MSG_TOKEN_CREATE_ERROR = "token生成失败,请联系管理员"; /** * 操作成功code */ @@ -24,6 +34,15 @@ */ public static final int CODE_OPERATION_FAILED = -1; /** * token校验失败 */ public static final int CODE_TOKEN_ERROR = -10; /* * token生成失败 * */ public static final int CODE_TOKEN_CREATE_ERROR = -11; } screen-common/src/main/java/com/moral/exception/TokenException.java
New file @@ -0,0 +1,72 @@ package com.moral.exception; /** * @ClassName TokenException * @Description Token异常 * @Author 陈凯裕 * @Date 2021/3/11 14:54 * @Version TODO **/ public class TokenException extends RuntimeException { /** * 错误码 */ private int code; /** * 错误信息 */ private String msg; /** */ private static final long serialVersionUID = 1L; public TokenException() { super(); } public TokenException(String msg) { super(msg); this.msg = msg; } public TokenException(Throwable t) { super(t); } public TokenException(String msg, Throwable t) { super(msg); this.msg = msg; } public TokenException(int code, String msg) { super(msg); this.code = code; this.msg = msg; } public TokenException(int code, String msg, Throwable t) { super(msg, t); this.code = code; this.msg = msg; } /** * Getter method for property <tt>code</tt>. * * @return property value of code */ public int getCode() { return code; } /** * Getter method for property <tt>msg</tt>. * * @return property value of msg */ public String getMsg() { return msg; } } screen-common/src/main/java/com/moral/util/TokenUtils.java
@@ -1,5 +1,8 @@ package com.moral.util; import com.moral.constant.Constants; import com.moral.exception.TokenException; import com.sun.org.apache.bcel.internal.classfile.ConstantString; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -31,13 +34,7 @@ } //token有效期 单位:秒 private static final int validity_time = 60*60*24*7; //token非法,生成错误 public static final int error = -1; //token过期 public static final int timeout = -2; //token有效,生成成功 public static final int valid = 1; private static final int validity_time = 60*30; /** * @Description: 生成token @@ -46,8 +43,7 @@ * @Author: 陈凯裕 * @Date: 2021/3/10 */ public static Map<String, Object> getToken(String uid, Map<String, Object> userInfo) { Map<String, Object> result = new HashMap<>(); public static String getToken(String uid, Map<String, Object> userInfo) { //生成加密token try { //生成token @@ -61,15 +57,12 @@ redisTemplate.expire(token, validity_time, TimeUnit.SECONDS); //新token写入到Hash中 redisTemplate.opsForHash().put("user_token",uid,token); result.put("code", valid); result.put("token",token); return token; }catch (Exception e){ e.printStackTrace(); log.error(e.getMessage()); result.put("code",error); log.error("token生成异常:"+e.getMessage()); throw new TokenException(Constants.CODE_TOKEN_CREATE_ERROR,Constants.MSG_TOKEN_CREATE_ERROR); } return result; } /** @@ -79,36 +72,57 @@ * @Author: 陈凯裕 * @Date: 2021/3/10 */ public static Map<String, Object> checkToken( String token) { Map<String, Object> result = new HashMap<>(); public static void checkToken(String token) { try { String[] tokenArray = TokenEncryptUtils.decoded(token).split("/"); //校验token是否合法 if (tokenArray.length != 2) { result.put("code", error); result.put("msg", "无效的token"); return result; throw new TokenException(Constants.CODE_TOKEN_ERROR,Constants.MSG_TOKEN_ERROR); } //校验token是否过期 int tokenTime = Integer.parseInt(tokenArray[1]); if ((System.currentTimeMillis() / 1000) - tokenTime > validity_time) { result.put("code", timeout); result.put("msg", "登陆身份已过期,请重新登陆"); return result; if (!redisTemplate.hasKey(token)) { throw new TokenException(Constants.CODE_TOKEN_ERROR,Constants.MSG_TOKEN_ERROR); } result.put("code", valid); return result; } catch (Exception e) { log.error("token工具类校验token异常" + e.getMessage()); result.put("code", error); result.put("msg", "无效的token"); return result; throw new TokenException(Constants.CODE_TOKEN_ERROR,Constants.MSG_TOKEN_ERROR); } } //通过token获取用户信息 /** * @Description: 通过token获取用户信息 * @Param: [token] * @return: java.util.Map<java.lang.String , java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 */ public static Map<String, Object> getUserInfoByToken(String token) { Map<String, Object> userInfo = (Map<String, Object>) redisTemplate.opsForValue().get(token); if(userInfo==null) throw new TokenException(Constants.CODE_TOKEN_ERROR,Constants.MSG_TOKEN_ERROR); return userInfo; } /** * @Description: 销毁token * @Param: [uid, token] * @return: void * @Author: 陈凯裕 * @Date: 2021/3/11 */ public static void destoryToken(String uid, String token) { redisTemplate.delete("token"); redisTemplate.opsForHash().delete("user_token", uid); } /** * @Description: token延长 * @Param: [token] * @return: void * @Author: 陈凯裕 * @Date: 2021/3/11 */ public static void extendTokenTime(String token) { redisTemplate.expire(token, validity_time, TimeUnit.SECONDS); } } screen-manage/pom.xml
@@ -18,6 +18,11 @@ <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies> <build> screen-manage/src/main/java/com/moral/api/config/mvc/SpringMVCconfig.java
@@ -7,6 +7,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.ArrayList; @@ -34,4 +35,12 @@ regisration.addPathPatterns("/**/**");//设置拦截路径 regisration.excludePathPatterns(excludePath);//设置不拦截路径 } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); WebMvcConfigurer.super.addResourceHandlers(registry); } } screen-manage/src/main/java/com/moral/api/controller/AccountController.java
@@ -3,31 +3,47 @@ import com.moral.api.service.ManageAccountService; import com.moral.constant.ResultMessage; import com.moral.util.ObjectUtils; import io.netty.util.internal.ObjectUtil; import io.swagger.annotations.Api; import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.Map; @Slf4j @Api(tags = {"后台管理"}) @Api(tags = {"后台账户管理"}) @RestController @RequestMapping("/account") public class AccountController { @Resource ManageAccountService accountService; @Autowired @Qualifier("tokenRedisTemplate") RedisTemplate redisTemplate; @PostMapping("login") public ResultMessage login(@RequestBody Map<String,Object> paramters){ if(!ObjectUtils.checkParamAndMap(paramters,"account","password")) return ResultMessage.fail("参数不完整"); Map<String, Object> result = accountService.login(paramters); if((int)result.get("accountId")<0) return ResultMessage.fail(result); return ResultMessage.ok(result); } @PostMapping("logout") public ResultMessage logout(@RequestBody Map<String, Object> paramters, HttpServletRequest request) { return null; } } screen-manage/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java
@@ -2,6 +2,7 @@ import com.moral.constant.Constants; import com.moral.constant.ResultMessage; import com.moral.exception.TokenException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -22,7 +23,7 @@ @ResponseStatus(HttpStatus.OK) public ResultMessage handleException(Exception ex) { log.error(ex.getMessage()); log.error(ex.getStackTrace().toString()); ex.printStackTrace(); return ResultMessage.fail(Constants.CODE_OPERATION_FAILED, "请求失败"); } @@ -36,4 +37,14 @@ return ResultMessage.fail(Constants.CODE_OPERATION_FAILED, "请求用户数据失败"); } /** * 处理TokenException异常 */ @ExceptionHandler({TokenException.class}) @ResponseBody @ResponseStatus(HttpStatus.OK) public ResultMessage handleTokenException(TokenException ex) { return ResultMessage.fail(ex.getCode(),ex.getMsg()); } } screen-manage/src/main/java/com/moral/api/service/ManageAccountService.java
@@ -14,5 +14,21 @@ * @since 2021-03-09 */ public interface ManageAccountService extends IService<ManageAccount> { /** * @Description: 登陆使用 * @Param: [paramters] * @return: java.util.Map<java.lang.String,java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 */ Map<String, Object> login(Map<String, Object> paramters); /** * @Description: 注销使用 * @Param: [paramters] * @return: java.util.Map<java.lang.String,java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 */ Map<String, Object> logout(Map<String, Object> paramters); } screen-manage/src/main/java/com/moral/api/service/impl/ManageAccountServiceImpl.java
@@ -39,7 +39,14 @@ @Resource ManageMenuMapper manageMenuMapper; /** * @Description: 登陆 * @Param: [paramters] * @return: java.util.Map<java.lang.String , java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 */ @Override public Map<String, Object> login(Map<String, Object> paramters) { Map<String,Object> result = new HashMap<>(); //接收参数 @@ -90,21 +97,30 @@ userInfo.put("userName",manageAccount.getUserName());//用户名称 userInfo.put("roles",roles);//用户角色 userInfo.put("menus",menus);//用户菜单 Map<String, Object> tokenResult = TokenUtils.getToken(String.valueOf(manageAccount.getId()), userInfo); if(tokenResult.get("code").equals(TokenUtils.error)){ result.put("accountId",-6); result.put("msg","生成token错误"); return result; } String token = TokenUtils.getToken(String.valueOf(manageAccount.getId()), userInfo); //打包返回信息 result.put("accountId",manageAccount.getId());//用户Id result.put("userName",manageAccount.getUserName());//用户名称 result.put("roles",roles);//用户角色 result.put("menus",menus);//用户菜单 result.put("token",tokenResult.get("token")); result.put("token", token); return result; } /** * @Description: 注销 * @Param: [paramters] * @return: java.util.Map<java.lang.String , java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 */ @Override public Map<String, Object> logout(Map<String, Object> paramters) { return null; } } screen-manage/src/main/resources/application-dev.yml
@@ -114,6 +114,10 @@ interceptor: exclude: - /account/login - /swagger-ui.html - /swagger-resources/** - /webjars/** - /account/logout AES: KEY: AD42F7787B035B7580000EF93BE20BAD