用戶註冊&單點登錄
阿新 • • 發佈:2017-10-08
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;
用戶註冊&單點登錄