发表于: 2017-11-21 20:50:21

1 603


今天完成的任务


修改dao语句



不使用list的话,如果数据库中没数据的话程序会报错



service层

public User getUserFromName(User user){
List<User> getUser=userMapper.getUserFromName(user);
   if(getUser.size()!=1){
return  new User();
   }else{
return getUser.get(0);
   }



------------------------------------------------------

因为写代码写的太欢脱了,没有及时写日报

现在除了验证状态和退出登陆都已经写完了,下附代码


controller层

@Controller
@RequestMapping(value = "",method = RequestMethod.GET)
public class CategoryController {

@Autowired
   @SuppressWarnings("SpringJavaAutowiringInspection")
private UserService userService;
   @Autowired
   @SuppressWarnings("SpringJavaAutowiringInspection")
private PersistentLoginsService persistentLoginsService;
   /**
    *注册页面
    * @param
    * @return
    *
    * 仅作登陆页面的载体并不提供内置方法
    */

   @RequestMapping(value = "/logon", method = RequestMethod.GET)
public ModelAndView UserLogon(User user) {
ModelAndView mAndView = new ModelAndView("userLogon");
       return mAndView;
   }


/**
    *生成cookie页面
    * @param user 用户的数据
    * @param response cookie
    * @return
    *
    * 判断UserLogon方法中的user的数据是否记录在数据库中
    * 依此判断是否生成cookie
    *
    */

   @RequestMapping(value = "/getLogon", method = RequestMethod.POST)
public ModelAndView getUserLogOn(User user,HttpServletResponse response) {
if (user.getName() != null && user.getPassword() != null & user.getName().length() != 0 && user.getPassword().length() != 0) {//不能为空数据
           PersistentLogins p=persistentLoginsService.getUserFromName(user.getName());//获取卡密信息
           String userMD5=AppMD5Util.getMD5(user.getName(),user.getPassword());
           if (p.getToken().equals(userMD5)) {
CookieUtils.addCookie(user,userMD5,response);
               return new ModelAndView("successLogon");
           }else{
return new ModelAndView("failLogon");
           }
}else{
return new ModelAndView("failLogon");
       }
}

/**判定页面
    * 检测如果cookie的值与用户的值相同的话
    */

   @RequestMapping(value = "/ok", method = RequestMethod.GET)
public ModelAndView test(User user, HttpServletRequest request, HttpServletResponse response) {
List<PersistentLogins> p=persistentLoginsService.list();
      if( CookieUtils.getCookie(p,request)){
return new ModelAndView("testLogon");
      }

return new ModelAndView("failLogon");
   }






/**
    * 注册页面的载体
    * @param user
    * @return
    */
   @RequestMapping(value = "/register", method = RequestMethod.GET)
public ModelAndView userRegister(User user){
return new ModelAndView("userRegister");
   }


/**
    * controller层只负责判断输入的是否为空数据
    *
    * @param user
    * @return
    */
   @RequestMapping(value = "/getRegister", method = RequestMethod.POST)
public ModelAndView userGetRegister(User user){
//检测是否为空为null
       if (user.getName() != null && user.getPassword() != null && user.getEmail()!=null & user.getName().length() != 0 && user.getPassword().length() != 0 && user.getEmail().length()!=0 ) {
//检测输入的账号是否重复
           User userProofread = userService.getUserFromName(user);
           if (user.getName().equals(userProofread.getName())) {
return new ModelAndView("failLogon");
           }else{
userService.addUser(user);
               return new ModelAndView("successRegister");
           }

}else{
return new ModelAndView("failLogon");
       }
}




}



service层

@Service
public class PersistentLoginsServiceImpl implements PersistentLoginsService {

@Autowired
   @SuppressWarnings("SpringJavaAutowiringInspection")
PersistentLoginsMapper persistentLoginsMapper;


  public List<PersistentLogins> list(){
return persistentLoginsMapper.list();
   }


/**
    *
    * 获得用户输入的数据并加密
    * @param user
    * @return
    */
   public int addPersistent_logins(User user){
PersistentLogins p=new PersistentLogins();
      p.setUsername(user.getName());
      String a=AppMD5Util.getMD5(user.getName(),user.getPassword());
      System.out.println(a);
      p.setToken(a);
      return persistentLoginsMapper.addPersistent_logins(p);
   }



public PersistentLogins getUserFromName(String username){
List<PersistentLogins> getPersistentLogins= persistentLoginsMapper.getUserFromName(username);

      if(getPersistentLogins.size()!=1){
return  new PersistentLogins();
      }else{
return getPersistentLogins.get(0);
      }
}

public PersistentLogins verifyUserFromName(String username){
List<PersistentLogins> getPersistentLogins= persistentLoginsMapper.verifyUserFromName(username);

       if(getPersistentLogins.size()!=1){
return  new PersistentLogins();
       }else{
return getPersistentLogins.get(0);
       }
}
}



@Service
public class UserServiceImpl implements UserService {

@Autowired
   @SuppressWarnings("SpringJavaAutowiringInspection")
UserMapper userMapper;


   @Autowired
  PersistentLoginsServiceImpl persistentLoginsServiceImpl;


   public List<User> list(){
return  userMapper.list();
   }

/**
    * 注册所使用的
    */

   public int addUser(User user){
user.setBirthday(unit.getCreationTime());//获取记录时间
       persistentLoginsServiceImpl.addPersistent_logins(user);//将用户信息加密后输入到另一表中
       return userMapper.addUser(user);

   }

/**
    * 若表中此用户不唯一则返回null
    * @param user
    * @return
    */

   public User getUserFromName(User user){
List<User> getUser=userMapper.getUserFromName(user);
       if(getUser.size()!=1){
return  new User();
       }else{
return getUser.get(0);
       }
}




}



加密


public class AppMD5Util {
final static String USERKEY = "123456";

   /**
    * 对字符串md5加密(小写+字母)
    *
    * @param str 传入要加密的字符串
    * @return MD5加密后的字符串
    */
   public static String MD5(String str) {
try {
// 生成一个MD5加密计算摘要
           MessageDigest md = MessageDigest.getInstance("MD5");//返回实现指定摘要算法的 MessageDigest 对象。
           // 计算md5函数
           md.update(str.getBytes());
           //update使用指定的byte更新摘要
           //getBytes函数是将一个字符串转化为一个字节数组byte[]的方法
           // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
           // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
           return new BigInteger(1, md.digest()).toString(16);
       } catch (Exception e) {
e.printStackTrace();
           return null;
       }
}

public static byte[] getSALT() {
SecureRandom a = new SecureRandom();
       return a.generateSeed(1);
   }


public static String getMD5(String str,String str_) {
return MD5(MD5(str) +MD5(str_) +USERKEY);
   }
}



cookie


public class CookieUtils {

public static void addCookie(User user, String userMD5, HttpServletResponse response) {
Cookie cookie = new Cookie(user.getName(), userMD5);
       cookie.setMaxAge(COOKIE_MAX_AGE);//设置周期
       response.addCookie(cookie);
   }

/**
    * 这个地方做的不好,居然用的是最蠢笨的遍历,而且这个地方bug太明显了
    *
    * @param p
    * @param request
    * @return
    */

   public static boolean getCookie(List<PersistentLogins> p, HttpServletRequest request) {
boolean userVerification = false;

       Cookie[] cookies = request.getCookies();//获取cookie
       for (Cookie cookie : cookies) {
for (PersistentLogins persistentLogins : p) {
if (persistentLogins.getUsername() == cookie.getName() & persistentLogins.getToken() == cookie.getValue()) {
userVerification = true;
               }
}
}
return userVerification;
   }
}




遇到的问题


关于


验证状态

理论上登陆一个页面判断用户是否已经登录首先是获取cookie与数据库内的做比对

这方法我遇到了一点小问题


一个网站的cookie是复数的,如果使程序能够得知哪一个是我们需要获取做比对的cookie

请师兄指导一下



遇到的问题

收获


返回列表 返回列表
评论

    分享到