发表于: 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的准备,学习多线程。
评论