发表于: 2018-10-19 22:39:54

1 290


今天完成的事情:

1.完成登录注册功能

1)首先创建一张用户的信息表,用于保存用户注册的信息。

2)然后代码部分

dao层

package task5.dao;

import task5.pojo.User;

/**
* 注册和登录业务dao层接口设计
*/
public interface UserDao {
/**
     * 注册数据保存数据库方法,注意密码是在业务层经过md5加盐处理的
     * @param user 传入的参数,要经过controller验证(使用的validatio框架验证)
     * @return Integer 插入成功返回大于0的数值,失败返回小于0
     */
    Integer saveUser(User user);

    /**
     * 登录数据查询方法
     * @param adminCode 传入的参数是账号,根据账号查询对应的信息
     * @return User 返回值是User类型
     */
    User queryUser(String adminCode);
}

业务层实现类

package task5.service;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import task5.dao.UserDao;
import task5.pojo.User;
import task5.util.ApplicationException;
import task5.util.MD5Utils;

import javax.annotation.Resource;

@Service
public class UserServiceImpl implements UserService {
private static Logger logger =Logger.getLogger(UserServiceImpl.class);
   @Resource(name = "userDao")
private UserDao userDao;

   //实现接口,重写register方法
   @Override
   public String register(User user) {
logger.info("进入regiser()");
       user.setPassword(MD5Utils.getSaltMD5(user.getPassword()));
       logger.info("传入的参数:"+user);
       //在业务层的方法是经过controller验证的,所以直接用
       //调用的dao层保存数据的方法
       Integer i =userDao.saveUser(user);
       //对返回值进行验证
       if(i>0){
logger.info("注册成功");
           return "注册成功";
       }else {
logger.info("注册失败,请重新注册!");
           return "注册失败";
       }
}

//登录验证
   @Override
   public User loginCheck(String adminCode, String password) {
logger.info("进入loginCheck()");
       logger.info("账号:"+adminCode+"密码:"+password);
       //调用dao层的方法,查询是否有这条账号的信息
       User user=null;
       user =userDao.queryUser(adminCode);
       //对查询出来的结果进行判断
       if(user==null){
logger.info("账号输入错误,请重新输入!");
           throw new ApplicationException("账号输入错误,请重新输入!");
       }
logger.info(user);
       //先对传入的字符串进行md5加盐,然后判断两个字符串是不是同一个值。
       logger.info(user.getPassword());
       logger.info("--------------------------------------------");
       if (!MD5Utils.getSaltverifyMD5(password,user.getPassword())){
logger.info("密码错误请重新输入!");
           throw  new ApplicationException("密码错误请重新输入!");
       }
logger.info("密码正确!");
       return user;
   }
}

controller层

package task5.controlller;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import task5.pojo.User;
import task5.service.UserService;
import task5.util.TokenUtils;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;


/**
* 登录注册模块控制器编写
* 默认首页是可以访问的,t11页面是不可访问的,点击右上方登录或者注册按钮跳转到登录或者注册页面
* 设置为登录和注册为静态页面,用form表单提交数据到控制层。然后进行业务判断
*/
@Controller
public class loginController {
private static Logger logger =Logger.getLogger(loginController.class);
   @Resource(name = "userServiceImpl")
private UserService userService;

   /**
    * 登录验证,调用userService.loginCheck的方法进行登录验证判断,暂时不处理异常,统一处理异常。
    * 然后利用des对用户名ID和时间进行加密,生成token存入cookie,用户名字也存入cookie,用于页面显示。
    * @param request 用request取出页面传来的值
    * @return 登录成功返回首页视图名
    */
   @RequestMapping(value = "/logging",method = RequestMethod.POST)
public String login(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
logger.info("进入loginCheck()");
       //用request取出页面传来的参数
       String adminCode =request.getParameter("adminCode");
       String password =request.getParameter("password");
       logger.info("账号:"+adminCode+","+"密码:"+password);
       //调用userService.loginCheck的方法进行登录验证判断
       User user =userService.loginCheck(adminCode,password);
       logger.info(user);
       //利用des对用户名ID和时间进行加密,生成token存入cookie
       //创建一个时间戳用来表示登录的时间
       Long loginTime =System.currentTimeMillis();
       String token = TokenUtils.getToken(user.getUserID()+"|"+String.valueOf(loginTime));
       logger.info(token);
       Cookie cookie1=new Cookie("token",token);
       //把token在在存到session里面,用于在拦截器器里面做对比
       request.getSession().setAttribute("token",token);
       //把用户的姓名放到session用于页面显示
       request.getSession().setAttribute("name",user.getUserName());
       response.addCookie(cookie1);
       return "redirect:firstPage";
   }
/**
    * 注册模块,利用框架进行参数验证,然后在调用方法对注册的信息进行保存
    */
   @RequestMapping(value = "/registration",method = RequestMethod.POST)
public String register(@Validated User user, ModelMap model){
logger.info("进入register()");
       //加入注册的时间
       user.setCreatTime(System.currentTimeMillis());
       logger.info(user);
       //调用useService.register保存注册信息
       String str =userService.register(user);
       //绑定保存是否成功的信息返回到页面
       logger.info(str);
       model.addAttribute("saveMessage",str);
       return "register_message";
   }
//转发到登录页面
   @RequestMapping(value = "/logging",method =RequestMethod.GET)
public String loginRelay(){
logger.info("进入loginRelay()");
       return "login";
   }
//转发到注册页面
   @RequestMapping(value = "/registration",method = RequestMethod.GET)
public String registerRelay(){
logger.info("registerRelay()");
       return "register";
   }
}

测试

2.拦截器实现拦截一张页面,主要业务逻辑是对token是否一样和,和有效性进行判断。最后拦截/u的请求

package task5.Interceptor;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import task5.util.TokenUtils;

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

/**
* 登录拦截器
* 在preHandle方法里面,进行业务逻辑编写。
* 主要是对是否是同一个token进行判断,并且判断它是否在token的有效值内。
*/
public class CookieInterceptor implements HandlerInterceptor {
private static Logger logger = Logger.getLogger(CookieInterceptor.class);

   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("进入cookie拦截器:preHandle()");
       //获取cookie
       Cookie[] cookies = request.getCookies();
       if (cookies == null) {
logger.info("没有登录!");
           //重定向到登录页面
           response.sendRedirect("logging");
           return false;
       }
for (Cookie c : cookies) {
logger.info("--------------------------------------");
           //判断cookie是否等于存入时的token的名字
           if (c.getName().equals("token")) {
logger.info("开始判断token的正确性和有效值");
               //判断cookie里面的token是否跟session里面一样
               if (c.getValue().equals(request.getSession().getAttribute("token"))) {
//先进行cookie的解密
                   String token = c.getValue();
                   String str = TokenUtils.decryptToken(token);
                   logger.info("解密token后:" + str);
                   String loginTime = str.substring(str.indexOf("|")+1);
                   logger.info(loginTime);
                   //判断token的有效值
                   if ((System.currentTimeMillis() - Long.valueOf(loginTime)) < 5 * 60 * 1000) {
logger.info("token在有效范围类!");
                       return true;
                   }else {
logger.info("token有效时间已过");
                       response.sendRedirect("../logging");
                       return false;
                   }
}else {
logger.info("token不一致");
                   response.sendRedirect("../logging");
                   return false;
               }
}
}
logger.info("tonken验证失败");
       response.sendRedirect("../logging");
       return false;
   }

注意:要在配置文件里面配置拦截的路径。

3.部署代码到服务器

这里的话我是采用war直接丢的形式。然后启动直接部署。

注:这里面要注意一下,要了解我们项目部署后项目在tomcat的文件夹里面是什么样子。

像我部署的时候各种配置文件全部没有生成,所以照成在服务器上出现404的问题,只要在pom文件

的build里面加入这个就行了

<!-- 编译之后包含xml -->
<resource>
 <directory>src/main/java</directory>
 <includes>
   <include>**/*.xml</include>
 </includes>
 <filtering>true</filtering>
</resource>
<!-- 编译之后包含xml和properties -->
<resource>
 <directory>src/main/resource</directory>
 <includes>
   <include>**/*</include>
 </includes>
 <filtering>true</filtering>
</resource>


明天计划做的事:任务6的准备,学习多线程。


返回列表 返回列表
评论

    分享到