1. 程式人生 > >用戶註冊&單點登錄

用戶註冊&單點登錄

coo gen 生成 void eth 封裝 ati lean col

package com.tttttt.portal.controller;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody;
import com.tttttt.manager.pojo.User; import com.tttttt.portal.util.CookieUtils; import com.tttttt.sso.service.UserService; @Controller @RequestMapping("user") public class UserController { @Autowired private UserService userService; @Value("${TT_TICKET}") private String TT_TICKET;
// type : "POST", // //url : "/service/user/doRegister", // url : "/user/doRegister.html", // data : {password:_password,username:_username,phone:_phone}, // dataType : ‘json‘, // if(result.status == "200") /** * 用戶註冊 * * @param user * @return */ @RequestMapping(value = "doRegister", method = RequestMethod.POST) @ResponseBody public Map<String, Object> doRegister(User user) { // 調用sso服務註冊用戶 this.userService.saveUser(user); // 封裝返回數據map Map<String, Object> map = new HashMap<>(); map.put("status", "200"); return map; } // type: "POST", // url: "/service/user/doLogin?r=" + Math.random(), // data: {username:_username,password:_password}, // dataType : "json", // if (obj.status == 200) /** * 用戶登錄 * * @param request * @param response * @param user * @return */ @RequestMapping(value = "doLogin", method = RequestMethod.POST) @ResponseBody public Map<String, Object> doLogin(HttpServletRequest request, HttpServletResponse response, User user) { // 聲明返回的map Map<String, Object> map = new HashMap<>(); // 調用單點登錄服務,執行用戶登錄操作,返回ticket String ticket = this.userService.doLogin(user); // 判斷ticket是否為非空 if (StringUtils.isNotBlank(ticket)) { // 如果為非空表示登錄成功 // 把ticket放到cookie中 CookieUtils.setCookie(request, response, this.TT_TICKET, ticket, 60 * 60 * 24, true); // 封裝返回數據 map.put("status", 200); } // 如果為空,表示登錄失敗,什麽都不做 // 返回結果 return map; } }

package com.tttttt.sso.service;

import com.tttttt.manager.pojo.User;

public interface UserService {

    /**
     * 檢查數據是否可用
     * 
     * @param param
     * @param type
     * @return
     */
    Boolean check(String param, Integer type);

    /**
     * 根據Ticket查詢用戶
     * 
     * @param ticket
     * @return
     */
    User queryUserByTicket(String ticket);

    /**
     * 用戶註冊
     * 
     * @param user
     */
    void saveUser(User user);

    /**
     * 用戶登錄
     * 
     * @param user
     * @return
     */
    String doLogin(User user);

}

package com.tttttt.sso.service.impl;

import java.io.IOException;
import java.util.Date;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tttttt.manager.mapper.UserMapper;
import com.tttttt.manager.pojo.User;
import com.tttttt.sso.redis.RedisUtils;
import com.tttttt.sso.service.UserService;

@Service
public class UserServiceImpl implements UserService {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Autowired
    private UserMapper userMapper;

    @Value("${tttttt_TICKET_KEY}")
    private String tttttt_TICKET_KEY;

    @Autowired
    private RedisUtils redisUtils;

    @Override
    public Boolean check(String param, Integer type) {
        // 聲明查詢條件
        User user = new User();

        // 1、2、3分別代表username、phone、email
        switch (type) {
        case 1:
            user.setUsername(param);
            break;
        case 2:
            user.setPhone(param);
            break;
        case 3:
            user.setEmail(param);
            break;

        default:
            break;
        }

        // 根據條件查詢
        int count = this.userMapper.selectCount(user);

        // 如果查詢結果count為0表示沒有人用過,所以返回true,表示可用
        // 如果查詢結果count不為0表示有人用過,所以返回false,表示不可用
        return count == 0;
    }

    @Override
    public User queryUserByTicket(String ticket) {
        // 從redis中查詢用戶的登錄信息,是一個json格式的數據
        // 需要給redis中的key增加前綴,便於redis數據的維護和管理
        String json = this.redisUtils.get(this.tttttt_TICKET_KEY + ticket);

        // 判斷json不為空
        if (StringUtils.isNotBlank(json)) {
            try {
                // 把json格式的數據轉為User對象
                User user = MAPPER.readValue(json, User.class);

                // 如果用戶請求這個方法,表示用戶是活動的,所以需要重置有效時間
                this.redisUtils.expire(this.tttttt_TICKET_KEY + ticket, 60 * 60);

                // 返回user結果
                return user;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        // 如果查詢結果為空,或者有異常,返回null
        return null;
    }

    @Override
    public void saveUser(User user) {
        // 設置用戶的數據
        user.setCreated(new Date());
        user.setUpdated(user.getCreated());

        // 對用戶密碼進行md5加密
        user.setPassword(DigestUtils.md5Hex(user.getPassword()));

        // 保存用戶數據到MySQL
        this.userMapper.insert(user);

    }


    @Override
    public String doLogin(User user) {
        // 根據條件從MySQL中查詢用戶
        user.setPassword(DigestUtils.md5Hex(user.getPassword()));
        User result = this.userMapper.selectOne(user);

        // 如果查到的結果不為空,表示用戶登錄成功
        if (result != null) {
            // 生成唯一的數,就是ticket
            // 利用redis單線程的特點,使用incr每次加一,獲取唯一數
            // ticket就是redis的唯一數+用戶id
            String ticket = "" + this.redisUtils.incr("tttttt_TICKET_INCR") + result.getId();

            try {
                // 把ticket和用戶的數據(json數據)放到redis中
                this.redisUtils.set(this.tttttt_TICKET_KEY + ticket, MAPPER.writeValueAsString(result), 60 * 60);

                // 返回ticket
                return ticket;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        // 如果查詢結果為空或者有異常,返回空
        return null;
    }

}

登錄的問題:
1.沒有歡迎用戶的語句
2.cookie中沒有ticket的信息

#配置Nginx反向代理的時候攜帶域名
proxy_set_header Host $host;

用戶註冊&單點登錄