用户登录登出

记录一个使用redis记录token的用户登录登出

参考demo地址https://gitee.com/super_star_man/juneweb

1.用户实例

package top.xzhand.po;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;
@Data
public class UserInfo implements Serializable {
    private Long id;

    private String username;

    private String password;

    private String mobile;

    private Date createAt;

    private Date updateAt;

    private Integer status;

    private String photoUrl;

    private String nickname;

    private String wxId;

}

package top.xzhand.dto;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
public class UserInfoDto implements Serializable {
    private static final long serialVersionUID = 7385797311824035903L;
    private Long id;

    private String username;

    private String password;

    private String mobile;

    private Date createAt;

    private Date updateAt;

    private Integer status;

    private String photoUrl;

    private String nickname;

    private String wxId;

}
package top.xzhand.vo;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
public class UserInfoVo implements Serializable {
    private static final long serialVersionUID = -3532912344120689693L;
    private Long id;

    private String username;

    private String password;

    private String mobile;

    private Date createAt;

    private Date updateAt;

    private Integer status;

    private String photoUrl;

    private String nickname;

    private String wxId;

}

 

 

2.token校验设置,redis配置,请参考上一篇

package top.xzhand.service;

public interface TokenService {
    
    public boolean setCode(String token, String userString, Integer expire);
    
    public String getCode(String token);
    
    public boolean verify(String code, Integer id);
    
    public String setToken(Long id) ;

    public boolean setUser(String token, String userString, Integer expire);
    
    public String getUser(String token);
    
    public boolean remove(String key);

    public void exit(Integer tokenid, String token);

}

token实现

package top.xzhand.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import top.xzhand.constant.ConstantConfig;
import top.xzhand.service.RedisService;
import top.xzhand.service.TokenService;
import top.xzhand.util.MD5;
import top.xzhand.util.RedisClientTemplate;

import javax.annotation.Resource;
import java.util.Date;
import java.util.UUID;

@Service
@Slf4j
public class TokenServiceImpl implements TokenService {


    @Resource
    private RedisService redisService;
    @Resource
    private RedisClientTemplate redisClientTemplate;

    @Override
    public boolean setCode(String token, String userString, Integer expire) {
//        return redisService.set(ConstantConfig.CHECKCODE + token, userString, expire == null ? ConstantConfig.CHECKCODE_TIME : expire);
        return redisClientTemplate.set(ConstantConfig.CHECKCODE + token, userString, expire == null ? ConstantConfig.CHECKCODE_TIME : expire);
    }

    @Override
    public String getCode(String token) {
//        Object userString = redisService.get(ConstantConfig.CHECKCODE + token);
        Object userString = redisClientTemplate.get(ConstantConfig.CHECKCODE + token);
        if (userString == null) {
            userString = "";
        }
        return userString.toString();
    }

    @Override
    public boolean verify(String code, Integer id) {
        boolean isRight = false;
//        Object rel_code = redisService.get(ConstantConfig.TOKEN_ID + id);
        Object rel_code = redisClientTemplate.get(ConstantConfig.TOKEN_ID + id);
        if (code != null && code.equals(rel_code.toString())) {
            isRight = true;
        }
        rechangeStay(id, rel_code.toString());
        return isRight;
    }

    @Override
    public String setToken(Long id) {
        String user = this.getUser(ConstantConfig.TOKEN_ID + id);
        if (user != null && !user.equals("")) {
//            long time = redisService.getExpire(ConstantConfig.TOKEN_ID + id);
//            log.info("---------------------------------" + id + "用户已经登录,当前时间为:" + new Date() + "键过期时间为:" + time);
            log.info("---------------------------------" + id + "用户已经登录,当前时间为:" + new Date() + "键过期时间为:" );
            return null;
        }
        String token = MD5.encode(UUID.randomUUID().toString() + id);
//        redisService.set(ConstantConfig.TOKEN_ID + id, token, ConstantConfig.LOGIN_TIME);
        redisClientTemplate.set(ConstantConfig.TOKEN_ID + id, token, ConstantConfig.LOGIN_TIME.intValue());
        return token;
    }

    @Override
    public boolean setUser(String token, String userString, Integer expire) {
//        return redisService.set(ConstantConfig.ADMIN_USER + token, userString, expire == null ? ConstantConfig.LOGIN_TIME : expire);
        return redisClientTemplate.set(ConstantConfig.ADMIN_USER + token, userString, (expire == null ? ConstantConfig.LOGIN_TIME.intValue() : expire));
    }

    @Override
    public String getUser(String token) {
//        Object userString = redisService.get(ConstantConfig.ADMIN_USER + token);
        Object userString = redisClientTemplate.get(ConstantConfig.ADMIN_USER + token);
        if (userString == null) {
            userString = "";
        }
        return userString.toString();
    }

    /**
     * 重置redis过期时间
     */
    private void rechangeStay(Integer id, String token) {
        String key1 = ConstantConfig.TOKEN_ID + id;
        String key2 = ConstantConfig.ADMIN_USER + token;
        redisService.expire(key1, ConstantConfig.LOGIN_TIME);
        redisService.expire(key2, ConstantConfig.LOGIN_TIME);
//        redisClientTemplate.expire(key1, ConstantConfig.LOGIN_TIME.intValue());
//        redisClientTemplate.expire(key2, ConstantConfig.LOGIN_TIME.intValue());
    }

    /**
     * 销毁key
     */
    @Override
    public boolean remove(String key) {
        return redisService.del(key);
    }



    @Override
    public void exit(Integer tokenid, String token) {
        String key1 = ConstantConfig.TOKEN_ID + tokenid;
        String key2 = ConstantConfig.ADMIN_USER + token;
//        this.remove(key1);
//        this.remove(key2);
        redisClientTemplate.delete(key1);
        redisClientTemplate.delete(key2);
    }

}

3.全局拦截校验

package top.xzhand.interceptor;

import com.alibaba.fastjson.JSON;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import top.xzhand.po.UserInfo;
import top.xzhand.res.JsonResult;
import top.xzhand.service.TokenService;
import top.xzhand.util.BizContext;
import top.xzhand.util.JSonUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.util.Map;

//登录拦截
public class LoginInterceptor extends HandlerInterceptorAdapter {
    private TokenService tokenService;

    public LoginInterceptor(TokenService tokenService) {
        this.tokenService = tokenService;
    }
    /**
     * 准备请求
     *
     * @param request
     * @param response * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        return authFailed(request, response);
    }

    /**
     * 请求完成
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     */
    @Override
    public void afterCompletion(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final Exception ex) {
        //清理缓存
        BizContext.clear();
    }

    /**
     * 权限校验
     *
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    private boolean authFailed(HttpServletRequest request,
                               HttpServletResponse response) throws Exception {
        response.setHeader("Content-type", "text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        String token = getParam(request, "token");
        String tokenId = getParam(request, "tokenid");
        JsonResult jsonResult=new JsonResult();
        if (!StringUtils.isEmpty(token) && !StringUtils.isEmpty(tokenId)
                && !token.equals("null") && !tokenId.equals("null")) {
            if (tokenService.verify(token, Integer.valueOf(tokenId))) {
                String userString = URLDecoder.decode(tokenService.getUser(token), "UTF-8");
                UserInfo user = new UserInfo();
                if (!StringUtils.isEmpty(userString)) {
                    user = JSonUtils.readValue(userString, UserInfo.class);
                }
                //等待成功,缓存用户信息
                BizContext.putUser(user);
                //身份验证通过,获取用户信息
                return true;
            } else {

                String message = JSON.toJSONString(jsonResult.errorMapper("登录失败"));
                PrintWriter out = response.getWriter();
                out.print(message);
                out.close();
            }
        } else {
            String message = JSON.toJSONString(jsonResult.errorMapper("未登录"));
            PrintWriter out = response.getWriter();
            out.print(message);
            out.close();
        }
        return false;
    }

    /**
     * 获取token信息
     *
     * @param request
     * @return
     */
    private String getParam(HttpServletRequest request, String paramName) {
        //先从Header中获取请求参数
        String token = request.getHeader(paramName);
        if (StringUtils.isEmpty(token)) {
            Map<String, String[]> parm = request.getParameterMap();
            //再从参数中读取
            String tokens[] = parm.get(paramName);
            if (tokens == null) {
                return null;
            }
            token = tokens[0];
        }
        return token;
    }

}

 

4.相关依赖model,工具

package top.xzhand.constant;

import lombok.experimental.UtilityClass;

@UtilityClass
public final class ConstantConfig {

    public String SYS_NAME = "june_";
    public String CHARSET = "UTF-8";
    public String TOKEN_ID = SYS_NAME + "token_id_";
    public String ADMIN_USER = SYS_NAME + "user_";
    public Long LOGIN_TIME = 1800000L;// 30 * 60 * 1000;// 30分钟
    public String LOGIN_USER = SYS_NAME + "loginUser";
    public String CHECKCODE = SYS_NAME + "checkcode_";
    public Integer CHECKCODE_TIME = 60000;// 60 * 1000;// 60秒
    public String VERIFY_CODE_KEY="june_code";

    
    
    
}

 

package top.xzhand.util;

import top.xzhand.po.UserInfo;
import java.util.HashMap;
import java.util.Map;

public class BizContext {

    private static ThreadLocal<Map<String, Object>> local = new ThreadLocal<>();

    public static <V> void putValue(String key, V value) {
        if (null == local.get()) {
            local.set(new HashMap<String, Object>());
        }
        Map<String, Object> context = local.get();
        context.put(key, value);
    }

    public static void putUser(UserInfo user) {
        putValue("user", user);
        putValue("userId", user.getId());
        putValue("userName", user.getUsername());
    }

    /**
     * 用户
     *
     * @return
     */
    public static UserInfo getUser() {
        return getValue("user");
    }

    /**
     * 用户
     *
     * @return
     */
    public static Integer getUserId() {
        return getValue("userId");
    }

    /**
     * 用户姓名
     *
     * @return
     */
    public static String getUserName() {
        return getValue("userName");
    }

    @SuppressWarnings("unchecked")
    public static <T> T getValue(String key) {
        if (null == local.get()) {
            return null;
        }
        Map<String, Object> context = local.get();
        if (!context.containsKey(key)) {
            return null;
        }
        return (T) context.get(key);
    }

    public static void clear() {
        if (null != local.get()) {
            local.set(null);
        }
    }
}

 

package top.xzhand.res;

import lombok.Getter;
import lombok.Setter;
import top.xzhand.common.Pager;

import java.util.LinkedHashMap;

/**
 * ajax调用时返回的json数据封装 返回值使用toMapper方法获取
 *
 * @author songhailiang
 */
public class JsonResult {

    public static JsonResult createResult() {
        JsonResult result = new JsonResult();
        result.setResultCode(ERROR);
        result.setBizCode(ERROR);
        result.setData(null);
        result.setDataReserve1(null);
        result.setDataReserve2(null);
        result.setError("");
        result.setPager(null);
        result.setMessage("");
        return result;
    }

    public static JsonResult newInstance(Object data) {
        return newInstance(data, SUCCESS, SUCCESS, "访问成功");
    }

    public static JsonResult newInstance(Object data, String message) {
        return newInstance(data, SUCCESS, SUCCESS, message);
    }

    public static JsonResult newInstance(Object data, int resultCode, String message) {
        return newInstance(data, resultCode, resultCode, message);
    }

    public static JsonResult newInstance(Object data, int resultCode, int bizCode, String message) {
        JsonResult jsonResult = new JsonResult();
        jsonResult.setResultCode(resultCode);
        jsonResult.setBizCode(bizCode);
        jsonResult.setData(data);
        jsonResult.setMessage(message);
        jsonResult.setError(message);
        return jsonResult;
    }

    public static JsonResult errorInstance(String message) {
        JsonResult jsonResult = new JsonResult();
        jsonResult.setResultCode(JsonResult.ERROR);
        jsonResult.setBizCode(JsonResult.ERROR);
        jsonResult.setData(null);
        jsonResult.setMessage(message);
        jsonResult.setError(message);
        return jsonResult;
    }

    public static final int SUCCESS = 1000;
    public static final int ERROR = 1001;

    /**
     * 返回码:
     */
    private int resultCode;
    @Getter
    @Setter
    private int bizCode;//业务码
    private Object data;
    private String message;
    private String error;
    private Pager<?> pager;

    // 预留,一般不用
    private Object dataReserve1;
    // 预留,一般不用
    private Object dataReserve2;

    public Object getDataReserve1() {
        return dataReserve1;
    }

    public void setDataReserve1(Object dataReserve) {
        this.dataReserve1 = dataReserve;
    }

    public Object getDataReserve2() {
        return dataReserve2;
    }

    public void setDataReserve2(Object dataReserve) {
        this.dataReserve2 = dataReserve;
    }

    public int getResultCode() {
        return resultCode;
    }

    public void setResultCode(int resultCode) {
        this.resultCode = resultCode;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }

    public Pager<?> getPager() {
        return pager;
    }

    public void setPager(Pager<?> pager) {
        this.pager = pager;
    }

    /**
     * @return
     */
    public LinkedHashMap<String, Object> toMapper() {
        LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
        map.put("resultCode", this.resultCode);
        map.put("bizCode", this.bizCode);
        map.put("message", this.message);
        map.put("error", this.error);
        map.put("data", this.data);
        map.put("dataReserve1", this.dataReserve1);
        map.put("dataReserve2", this.dataReserve2);
        if (this.pager != null) {
            map.put("rows", this.pager.getResults());
            map.put("page", this.pager.getPageNo());
            map.put("total", this.pager.getTotalPage());
            map.put("records", this.pager.getTotalRecord());
        }

        return map;
    }

    public LinkedHashMap<String, Object> toMap() {
        LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
        map.put("resultCode", this.resultCode);
        map.put("bizCode", this.bizCode);
        map.put("message", this.message);
        map.put("error", this.error);
        map.put("dataReserve1", this.dataReserve1);
        map.put("dataReserve2", this.dataReserve2);

        map.put("rows", this.data);
        map.put("total", this.pager.getTotalRecord());

        return map;
    }


    public LinkedHashMap<String, Object> errorMapper(String error) {
        LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
        map.put("resultCode", ERROR);
        map.put("error", error);
        return map;
    }
}
package top.xzhand.res;

import java.io.Serializable;

public class ResonseResult<T> implements Serializable {
    public static final int CODE_OK = 1000;
    public static final int CODE_ERR = 4001;
    private int code;
    private String message;
    private T data;

    public boolean isSuccess() {
        return this.code == 1000;
    }

    public static <T> ResonseResult success(T data) {
        ResonseResult<T> json = new ResonseResult();
        json.setCode(1000);
        json.setData(data);
        return json;
    }

    public static ResonseResult success() {
        ResonseResult json = new ResonseResult();
        json.setCode(1000);
        return json;
    }

    public static ResonseResult fail(String message) {
        ResonseResult json = new ResonseResult();
        json.setCode(4001);
        json.setMessage(message);
        return json;
    }

    public static ResonseResult fail(String message, int code) {
        ResonseResult json = new ResonseResult();
        json.setCode(code);
        json.setMessage(message);
        return json;
    }

    public ResonseResult() {
    }

    public int getCode() {
        return this.code;
    }

    public String getMessage() {
        return this.message;
    }

    public T getData() {
        return this.data;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof ResonseResult)) {
            return false;
        } else {
            ResonseResult<?> other = (ResonseResult) o;
            if (!other.canEqual(this)) {
                return false;
            } else if (this.getCode() != other.getCode()) {
                return false;
            } else {
                Object this$message = this.getMessage();
                Object other$message = other.getMessage();
                if (this$message == null) {
                    if (other$message != null) {
                        return false;
                    }
                } else if (!this$message.equals(other$message)) {
                    return false;
                }

                Object this$data = this.getData();
                Object other$data = other.getData();
                if (this$data == null) {
                    if (other$data != null) {
                        return false;
                    }
                } else if (!this$data.equals(other$data)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(Object other) {
        return other instanceof ResonseResult;
    }

    @Override
    public int hashCode() {
        int result = 1;
        result = result * 59 + this.getCode();
        Object $message = this.getMessage();
        result = result * 59 + ($message == null ? 43 : $message.hashCode());
        Object $data = this.getData();
        result = result * 59 + ($data == null ? 43 : $data.hashCode());
        return result;
    }

    @Override
    public String toString() {
        return "ResonseResult(code=" + this.getCode() + ", message=" + this.getMessage() + ", data=" + this.getData() + ")";
    }
}

5.登录接口

package top.xzhand.controller;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Strings;
import com.sun.deploy.net.URLEncoder;
import com.wordnik.swagger.annotations.Api;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.xzhand.constant.ConstantConfig;
import top.xzhand.dto.UserInfoDto;
import top.xzhand.po.UserInfo;
import top.xzhand.res.JsonResult;
import top.xzhand.res.ResonseResult;
import top.xzhand.service.TokenService;
import top.xzhand.service.UserInfoService;
import top.xzhand.vo.UserInfoVo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("userinfo")
@Api(value = "user", description = "用户中心")
public class UserInfoController {
    @Autowired
    private TokenService tokenService;
    @Autowired
    private UserInfoService userInfoService;


    @RequestMapping("list")
    public Map list(UserInfoDto userInfoDto) {
        JsonResult jsonResult = new JsonResult();
        try {
            List<UserInfoVo> listvo = userInfoService.search(userInfoDto);
            jsonResult.setResultCode(JsonResult.SUCCESS);
            jsonResult.setData(listvo);
            return jsonResult.toMapper();
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.setError(e.getMessage());
            jsonResult.setResultCode(JsonResult.ERROR);
        }
        return jsonResult.toMapper();
    }

    @RequestMapping("add")
    public Map add(UserInfoDto userInfoDto) {
        JsonResult jsonResult = new JsonResult();
        try {
            UserInfo userInfo=new UserInfo();
            BeanUtils.copyProperties(userInfoDto,userInfo);
            jsonResult = userInfoService.add(userInfo);
            return jsonResult.toMapper();
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.setError(e.getMessage());
            jsonResult.setResultCode(JsonResult.ERROR);
        }
        return jsonResult.toMapper();
    }

    @RequestMapping("aduit")
    public Map aduit(UserInfoDto userInfoDto) {
        JsonResult jsonResult = new JsonResult();
        try {
            UserInfo userInfo=new UserInfo();
            BeanUtils.copyProperties(userInfoDto,userInfo);
            jsonResult = userInfoService.aduit(userInfo);
            return jsonResult.toMapper();
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.setError(e.getMessage());
            jsonResult.setResultCode(JsonResult.ERROR);
        }
        return jsonResult.toMapper();
    }
    @RequestMapping("info")
    public Map aduit(Long id) {
        JsonResult jsonResult = new JsonResult();
        try {
            UserInfo userInfo = userInfoService.find(id);
            jsonResult.setResultCode(JsonResult.SUCCESS);
            jsonResult.setData(userInfo);
            System.out.println();
            return jsonResult.toMapper();
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.setError(e.getMessage());
            jsonResult.setResultCode(JsonResult.ERROR);
        }
        return jsonResult.toMapper();
    }

    /**
     * 登录
     */
    @RequestMapping(value = "/login")
    public Map doLogin( String userName, String password,  String checkCode, String key) throws Exception {
        JsonResult jsonResult=new JsonResult();
        if (Strings.isNullOrEmpty(userName)) {
            return jsonResult.errorMapper("请输入用户名");
        }
        if (Strings.isNullOrEmpty(password)) {
            return jsonResult.errorMapper("请输入密码");
        }
        String code = tokenService.getCode(key);
        if (code == null || !checkCode.equals(code)) {
            return jsonResult.errorMapper("验证码错误");
        }
        userName = userName.trim();
        password = password.trim();
        ResonseResult<UserInfoVo> response=userInfoService.login(userName, password);
        if (!response.isSuccess()) {
            return  jsonResult.errorMapper(response.getMessage());
        }
        UserInfoVo userInfo = response.getData();
        String userString = URLEncoder.encode(JSON.toJSONString(userInfo), "UTF-8");
        Map<String, Object> map = new HashMap<>();
        String token = tokenService.setToken(userInfo.getId());
        map.put("tokenid", userInfo.getId());
        map.put("token", token);
        // 存放用户信息
        map.put("userInfo", userInfo);
        tokenService.setUser(token, userString, null);
        jsonResult.setResultCode(JsonResult.SUCCESS);
        jsonResult.setData(map);
        return jsonResult.toMapper();
    }
    /**
     * 登出
     */
    @RequestMapping("exit")
    public Map<String, Object> exit(String token, Integer tokenid) {
        JsonResult result = new JsonResult();
        try {
            String key1 = ConstantConfig.TOKEN_ID + tokenid;
            String key2 = ConstantConfig.ADMIN_USER + token;
            tokenService.remove(key1);
            tokenService.remove(key2);
            result.setResultCode(JsonResult.SUCCESS);
            return result.toMapper();
        } catch (Exception e) {
            return result.errorMapper("服务器异常!");
        }
    }


}

6.用户接口及实现

package top.xzhand.service;

import top.xzhand.dto.UserInfoDto;
import top.xzhand.po.UserInfo;
import top.xzhand.res.JsonResult;
import top.xzhand.res.ResonseResult;
import top.xzhand.vo.UserInfoVo;

import java.util.List;

public interface UserInfoService {

    List<UserInfoVo> search(UserInfoDto userInfoDto);

    JsonResult add(UserInfo userInfo);

    JsonResult aduit(UserInfo userInfo);

    UserInfo find(Long id);

    ResonseResult<UserInfoVo> login(String username, String password);
}
package top.xzhand.service.impl;

import com.google.common.base.Joiner;
import com.google.common.base.Objects;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.xzhand.dto.UserInfoDto;
import top.xzhand.mapper.UserInfoMapper;
import top.xzhand.po.UserInfo;
import top.xzhand.res.JsonResult;
import top.xzhand.res.ResonseResult;
import top.xzhand.service.UserInfoService;
import top.xzhand.vo.UserInfoVo;

import java.util.List;
import java.util.UUID;

@Service
public class UserInfoServiceImpl implements UserInfoService {
    @Autowired
    private UserInfoMapper userInfoMapper;
    private final static HashFunction sha512 = Hashing.sha512();
    private final static Splitter splitter = Splitter.on(',').trimResults();
    private final static HashFunction md5 = Hashing.md5();
    private final static Joiner joiner = Joiner.on(',').skipNulls();


    @Override
    public List<UserInfoVo> search(UserInfoDto userInfoDto) {
        return userInfoMapper.search(userInfoDto);
    }

    @Override
    public JsonResult add(UserInfo userInfo) {
        JsonResult jsonResult=new JsonResult();
        String encryptPassword = this.encryptPassword(userInfo.getPassword());
        userInfo.setPassword(encryptPassword);
       if(userInfoMapper.insertSelective(userInfo)>0){
           jsonResult.setResultCode(JsonResult.SUCCESS);
           jsonResult.setData(userInfo.getId());
           return jsonResult;
       }
        jsonResult.setResultCode(JsonResult.ERROR);
        jsonResult.setError("添加失败");
        return jsonResult;
    }

    @Override
    public JsonResult aduit(UserInfo userInfo) {
        JsonResult jsonResult=new JsonResult();
//        if(!StringUtils.isEmpty(userInfo.getPassword())){
//            String encryptPassword = this.encryptPassword(userInfo.getPassword());
//            userInfo.setPassword(encryptPassword);
//        }
        if(userInfoMapper.updateByPrimaryKey(userInfo)>0){
            jsonResult.setResultCode(JsonResult.SUCCESS);
            jsonResult.setData(userInfo.getId());
            return jsonResult;
        }
        jsonResult.setResultCode(JsonResult.ERROR);
        jsonResult.setError("修改失败");
        return jsonResult;
    }

    @Override
    public UserInfo find(Long id) {
        return userInfoMapper.selectByPrimaryKey(id);
    }

    @Override
    public ResonseResult<UserInfoVo> login(String userName, String password) {
        UserInfoVo record = userInfoMapper.loadByUserName(userName);
        if (record == null) {
            return ResonseResult.fail("用户不存在");
        }
        if (!passwordMatch(password, record.getPassword())) {
            return ResonseResult.fail("密码错误");
        }
        if (!record.getStatus().equals(1)) {
            return ResonseResult.fail("账户已被禁用!");
        }
        return ResonseResult.success(record);
    }
    //解密校验
    private boolean passwordMatch(String password, String encryptedPassword) {
        Iterable<String> parts = splitter.split(encryptedPassword);
        String salt = Iterables.get(parts, 0);
        String realPassword = Iterables.get(parts, 1);
        String enFromPassword = sha512.hashUnencodedChars(password + salt)
                .toString().substring(0, 20);
        return Objects.equal(enFromPassword, realPassword);
    }
    //加密
    private String encryptPassword(String password) {
        String salt = md5.newHasher()
                .putUnencodedChars(UUID.randomUUID().toString())
                .putLong(System.currentTimeMillis()).hash().toString()
                .substring(0, 4);
        String realPassword = sha512.hashUnencodedChars(password + salt)
                .toString().substring(0, 20);
        return joiner.join(salt, realPassword);
    }
}
package top.xzhand.mapper;

import org.springframework.stereotype.Repository;
import top.xzhand.dto.UserInfoDto;
import top.xzhand.po.UserInfo;
import top.xzhand.vo.UserInfoVo;
import java.util.List;
@Repository
public interface UserInfoMapper {
    int deleteByPrimaryKey(Long id);

    int insert(UserInfo record);

    int insertSelective(UserInfo record);

    UserInfo selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(UserInfo record);

    int updateByPrimaryKey(UserInfo record);

    List<UserInfoVo> search(UserInfoDto userInfoDto);

    UserInfoVo loadByUserName(String userName);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="top.xzhand.mapper.UserInfoMapper" >
  <resultMap id="BaseResultMap" type="top.xzhand.po.UserInfo" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="username" property="username" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="mobile" property="mobile" jdbcType="VARCHAR" />
    <result column="create_at" property="createAt" jdbcType="TIMESTAMP" />
    <result column="update_at" property="updateAt" jdbcType="TIMESTAMP" />
    <result column="status" property="status" jdbcType="INTEGER" />
    <result column="photo_url" property="photoUrl" jdbcType="VARCHAR" />
    <result column="nickname" property="nickname" jdbcType="VARCHAR" />
    <result column="wx_id" property="wxId" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, username, password, mobile, create_at, update_at, status, photo_url, nickname, 
    wx_id
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select 
    <include refid="Base_Column_List" />
    from user_info
    where id = #{id,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
    delete from user_info
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="top.xzhand.po.UserInfo" >
    <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" >
      SELECT LAST_INSERT_ID()
    </selectKey>
    insert into user_info (username, password, mobile, 
      create_at, update_at, status, 
      photo_url, nickname, wx_id
      )
    values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{mobile,jdbcType=VARCHAR}, 
      #{createAt,jdbcType=TIMESTAMP}, #{updateAt,jdbcType=TIMESTAMP}, #{status,jdbcType=INTEGER}, 
      #{photoUrl,jdbcType=VARCHAR}, #{nickname,jdbcType=VARCHAR}, #{wxId,jdbcType=VARCHAR}
      )
  </insert>
  <insert id="insertSelective" parameterType="top.xzhand.po.UserInfo" >
    <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" >
      SELECT LAST_INSERT_ID()
    </selectKey>
    insert into user_info
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="username != null" >
        username,
      </if>
      <if test="password != null" >
        password,
      </if>
      <if test="mobile != null" >
        mobile,
      </if>
      <if test="createAt != null" >
        create_at,
      </if>
      <if test="updateAt != null" >
        update_at,
      </if>
      <if test="status != null" >
        status,
      </if>
      <if test="photoUrl != null" >
        photo_url,
      </if>
      <if test="nickname != null" >
        nickname,
      </if>
      <if test="wxId != null" >
        wx_id,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="username != null" >
        #{username,jdbcType=VARCHAR},
      </if>
      <if test="password != null" >
        #{password,jdbcType=VARCHAR},
      </if>
      <if test="mobile != null" >
        #{mobile,jdbcType=VARCHAR},
      </if>
      <if test="createAt != null" >
        #{createAt,jdbcType=TIMESTAMP},
      </if>
      <if test="updateAt != null" >
        #{updateAt,jdbcType=TIMESTAMP},
      </if>
      <if test="status != null" >
        #{status,jdbcType=INTEGER},
      </if>
      <if test="photoUrl != null" >
        #{photoUrl,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null" >
        #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="wxId != null" >
        #{wxId,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="top.xzhand.po.UserInfo" >
    update user_info
    <set >
      <if test="username != null" >
        username = #{username,jdbcType=VARCHAR},
      </if>
      <if test="password != null" >
        password = #{password,jdbcType=VARCHAR},
      </if>
      <if test="mobile != null" >
        mobile = #{mobile,jdbcType=VARCHAR},
      </if>
      <if test="createAt != null" >
        create_at = #{createAt,jdbcType=TIMESTAMP},
      </if>
      <if test="updateAt != null" >
        update_at = #{updateAt,jdbcType=TIMESTAMP},
      </if>
      <if test="status != null" >
        status = #{status,jdbcType=INTEGER},
      </if>
      <if test="photoUrl != null" >
        photo_url = #{photoUrl,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null" >
        nickname = #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="wxId != null" >
        wx_id = #{wxId,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="top.xzhand.po.UserInfo" >
    update user_info
    set username = #{username,jdbcType=VARCHAR},
      password = #{password,jdbcType=VARCHAR},
      mobile = #{mobile,jdbcType=VARCHAR},
      create_at = #{createAt,jdbcType=TIMESTAMP},
      update_at = #{updateAt,jdbcType=TIMESTAMP},
      status = #{status,jdbcType=INTEGER},
      photo_url = #{photoUrl,jdbcType=VARCHAR},
      nickname = #{nickname,jdbcType=VARCHAR},
      wx_id = #{wxId,jdbcType=VARCHAR}
    where id = #{id,jdbcType=BIGINT}
  </update>
  <select id="search" parameterType="top.xzhand.dto.UserInfoDto" resultType="top.xzhand.vo.UserInfoVo">
    select *  from user_info
    <where>
      <if test="id!=null ">
        and id = #{id,jdbcType=BIGINT}
      </if>
      <if test="username!=null and username!='' ">
        and username = #{username,jdbcType=VARCHAR}
      </if> <if test="nickname!=null and nickname!='' ">
      and nickname = #{nickname,jdbcType=VARCHAR}
    </if>
      <if test="mobile!=null and mobile!='' ">
        and mobile = #{mobile,jdbcType=VARCHAR}
      </if>
    </where>
  </select>
  <select id="loadByUserName"  parameterType="java.lang.String" resultType="top.xzhand.vo.UserInfoVo">
    select *  from user_info
    where
         username = #{username,jdbcType=VARCHAR}
  </select>

</mapper>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以给您提供一些基本的思路和代码示例。 首先,您需要在Spring Boot项目中集成MyBatis,可以通过引入相应的依赖来实现。然后,您需要定义一个用户实体类,并在MyBatis中定义相应的Mapper接口和SQL语句,以实现用户登录功能。 以下是一个示例用户实体类的代码: ```java public class User { private int id; private String username; private String password; // 省略getter和setter方法 } ``` 接下来是一个示例Mapper接口的代码: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE username = #{username} AND password = #{password}") User login(@Param("username") String username, @Param("password") String password); @Update("UPDATE user SET token = NULL WHERE id = #{id}") void logout(@Param("id") int id); } ``` 上面的代码中,login()方法用于实现用户登录功能,通过传入用户名和密码来查询数据库中是否存在该用户。logout()方法用于实现用户功能,将用户的token字段设为NULL。 最后,您可以在Controller层中定义相应的请求处理方法来调用Mapper接口中的方法,以实现用户登录功能。以下是一个示例Controller层的代码: ```java @RestController public class UserController { @Autowired private UserMapper userMapper; @PostMapping("/login") public String login(@RequestParam String username, @RequestParam String password) { User user = userMapper.login(username, password); if (user != null) { // 登录成功,生成token并返回 String token = UUID.randomUUID().toString(); user.setToken(token); // 将token保存到数据库中 userMapper.updateToken(user.getId(), token); return token; } else { // 登录失败,返回错误提示 return "用户名或密码错误"; } } @PostMapping("/logout") public String logout(@RequestParam int id) { userMapper.logout(id); return "成功"; } } ``` 上面的代码中,login()方法用于处理登录请求,如果登录成功,生成一个随机的token并保存到数据库中,然后将token返回给客户端。logout()方法用于处理请求,将用户的token字段设为NULL。 以上就是一个简单的Spring Boot + MyBatis实现用户登录功能的示例,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值