用户登录操作

来源:互联网 发布:修复老电影软件下载 编辑:程序博客网 时间:2024/06/05 17:00
public interface LoginService {    //参数:用户名和密码    //业务逻辑:    /*     * 1、判断用户和密码是否正确     * 2、如果不正确,返回登录失败     * 3、如果正确生成token。     * 4、把用户信息写入redis,key:token, value:用户信息     * 5、设置Session的过期时间     * 6、把token返回     */    //返回值:E3Result,其中包含token信息    E3Result userLogin(String username, String password);}/** * 用户登录处理 * <p>Title: LoginServiceImpl</p> * <p>Description: </p> * @version 1.0 */@Servicepublic class LoginServiceImpl implements LoginService {    @Autowired    private TbUserMapper userMapper;    @Autowired//注入redis    private JedisClient jedisClient;    @Override    public E3Result userLogin(String username, String password) {        // 1、判断用户和密码是否正确        //根据用户名查询用户信息        TbUserExample example = new TbUserExample();        Criteria criteria = example.createCriteria();        criteria.andUsernameEqualTo(username);        //执行查询        List<TbUser> list = userMapper.selectByExample(example);        if (list == null || list.size() == 0) {            //返回登录失败            return E3Result.build(400, "用户名或密码错误");        }        //取用户信息        TbUser user = list.get(0);        //判断密码是否正确        if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(user.getPassword())) {            // 2、如果不正确,返回登录失败            return E3Result.build(400, "用户名或密码错误");        }        // 3、如果正确生成token。        String token = UUID.randomUUID().toString();        // 4、把用户信息写入redis,key:token value:用户信息        user.setPassword(null);//密码不带回客户端        jedisClient.set("SESSION:" + token, JsonUtils.objectToJson(user));        // 5、设置Session的过期时间        jedisClient.expire("SESSION:" + token, 1800);        // 6、把token返回        return E3Result.ok(token);    }}@Controllerpublic class LoginController {    @Autowired    private LoginService loginService;    @RequestMapping("/page/login")    public String showLogin(String redirect, Model model) {        model.addAttribute("redirect", redirect);        return "login";    }    @RequestMapping(value="/user/login", method=RequestMethod.POST)    @ResponseBody    public E3Result login(String username, String password,            HttpServletRequest request, HttpServletResponse response) {        E3Result e3Result = loginService.userLogin(username, password);        //判断是否登录成功        if(e3Result.getStatus() == 200) {            String token = e3Result.getData().toString();            //如果登录成功需要把token写入cookie            CookieUtils.setCookie(request, response, "token", token);        }        //返回结果        return e3Result;    }}浏览器不允许跨域请求在每个页面获取用户信息,解决跨域问题是要jsonp,每个页面跨域引入这个js文件来获取用户信息还需要引入jquery.cookie.js和jquery-1.4.2.min.jsvar E3MALL = {    checkLogin : function(){        var _ticket = $.cookie("token");        if(!_ticket){            return ;        }        $.ajax({            url : "http://localhost:8088/user/token/" + _ticket,            dataType : "jsonp",            type : "GET",            success : function(data){                if(data.status == 200){                    var username = data.data.username;                    var html = username ;                    $("#loginbar").html(html);                }            }        });    }}$(function(){    // 查看是否已经登录,如果已经登录查询登录信息    E3MALL.checkLogin();});/** * 根据token查询用户信息Controller * <p>Title: TokenController</p> */@Controllerpublic class TokenController {    @Autowired    private TokenService tokenService;    /*@RequestMapping(value="/user/token/{token}",             produces=MediaType.APPLICATION_JSON_UTF8_VALUE)    @ResponseBody    public String getUserByToken(@PathVariable String token, String callback) {        E3Result result = tokenService.getUserByToken(token);        //响应结果之前,判断是否为jsonp请求        if (StringUtils.isNotBlank(callback)) {            //把结果封装成一个js语句响应            return callback + "(" + JsonUtils.objectToJson(result)  + ");";        }        return JsonUtils.objectToJson(result);    }*/    @RequestMapping(value="/user/token/{token}")    @ResponseBody    public Object getUserByToken(@PathVariable String token, String callback) {        E3Result result = tokenService.getUserByToken(token);        //响应结果之前,判断是否为jsonp请求        if (StringUtils.isNotBlank(callback)) {            //把结果封装成一个js语句响应            MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);            mappingJacksonValue.setJsonpFunction(callback);            return mappingJacksonValue;        }        return result;    }}/** * 根据token取用户信息 */@Servicepublic class TokenServiceImpl implements TokenService {    @Autowired    private JedisClient jedisClient;    @Value("${SESSION_EXPIRE}")    private Integer SESSION_EXPIRE;    @Override    public E3Result getUserByToken(String token) {        //根据token到redis中取用户信息        String json = jedisClient.get("SESSION:" + token);        //取不到用户信息,登录已经过期,返回登录过期        if (StringUtils.isBlank(json)) {            return E3Result.build(201, "用户登录已经过期");        }        //取到用户信息更新token的过期时间        jedisClient.expire("SESSION:" + token, SESSION_EXPIRE);        //返回结果,E3Result其中包含TbUser对象        TbUser user = JsonUtils.jsonToPojo(json, TbUser.class);        return E3Result.ok(user);    }}
原创粉丝点击