发表于: 2018-09-10 20:56:05

1 520


今天完成的事情:

--整理Controller;

--今天写着写这突然发现Controller很臃肿;

有很多地方是重复的;

于是开始整理;

就按MVC模式的开发模式来,我们项目中包含的结构层分别是view,controller,service,dao。

下面介绍一下各层的意义和项目运行流程:

view是前台页面,用户发送请求时从前端的页面开始的,前端get到这个请求后会把请求和顺带参数信息传送到后台,后台接受这个请求找到对应的接口去执行对应的controller里的对应的方法,然后执行,然后controller会调用service层的业务逻辑,service有会去访问dao层来连接数据库。

这是我们后端程序员都熟悉的开发模式,然而不论是刚开始从事程序开发的程序员还是有一定开发经验的程序员,有时候其实都特别搞得清楚controller层和service层之间的关系,会把他们的功能搞模糊,或者说是你虽然明确的知道他们两个的各自分工,但是在实际打开发过程中,就是会把一些代码写杂了,该写在service里的代码段写到controller里去了。

所以,我们为了规范,有必要搞清楚controller中到底是写什么东西来着,

1、这里只接受数据,然后校验数据,校验合法性和准确性,比如说登录的controller,接收到用户名和密码,你要判断长度是否符合要求,密码解密出来。

2、有的必要的情况,创建一个对象,把数据补全,比如他的一些简单的属性,创建时间啊修改时间啊,还有初始值什么的。

3、其他的额都不要写在controller里,其他的复杂业务逻辑判断什么的,都放在service里头去。

https://blog.csdn.net/linlinxie/article/details/78390645

package com.lihoo.ssm.controller;

import com.lihoo.ssm.model.StudentHome;
import com.lihoo.ssm.model.StudentInfo;
import com.lihoo.ssm.model.StudentProfession;
import com.lihoo.ssm.service.StudentHomeService;
import com.lihoo.ssm.service.StudentInfoService;
import com.lihoo.ssm.service.StudentProfessionService;
import com.lihoo.ssm.util.JwtUtils2;
import com.lihoo.ssm.util.LoginStatus;
import io.jsonwebtoken.Claims;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;

import static com.lihoo.ssm.util.AddSalt.getSalt;
import static com.lihoo.ssm.util.MD5Utils.getPwdHash;

/**
* #Title: IndexController
* #ProjectName task4_index4
* #Description: TODO
* #author lihoo
* #date 2018/8/28-15:18
* @author lihoo
*/

@SuppressWarnings("unused")
@Controller
public class IndexController {
//    打印日志
   private static Logger logger = LogManager.getLogger(IndexController.class);

   @Autowired
   StudentInfoService studentInfoService;

   /**
    请求注册数据
    */
   @RequestMapping(value ="/join", method = RequestMethod.GET)
   public String joinForm() {
       logger.info("join GET 方法被调用……");
       return "join.page";
   }

   /**
    注册
    */
   @RequestMapping(value ="/join", method = RequestMethod.POST)
   public String join(@RequestParam("username") String username,
                      @RequestParam("pwd") String pwd) {
       logger.info("开始...");
       logger.info("join POST 方法被调用……");
       String salt = getSalt();
       String pwdHash = getPwdHash(pwd, salt);
//       创建StudentInfo对象
       StudentInfo joinUser = new StudentInfo();
       joinUser.setUsername(username);
       joinUser.setSalt(salt);
       joinUser.setPwd(pwdHash);
       joinUser.setLogAt(System.currentTimeMillis());
       joinUser.setExpireAt(System.currentTimeMillis());
       studentInfoService.insert(joinUser);
       logger.info("打印注册的用户信息: " + "用户名:"+username+"密码:"+pwd);
       logger.info("打印注册的用户信息: " + joinUser);
       return "main.home";
   }

   /**
    请求登陆页面(输入账号密码)
    */
   @RequestMapping(value ="/login", method = RequestMethod.GET)
   public String loginForm() {
       logger.info("login GET 方法被调用……");
       return "login.page";
   }

   /**
    *
    *登录验证,token加密,cookie生成发送
    */
   @RequestMapping(value = "/login", method = RequestMethod.POST)
   public String login(@RequestParam(value = "username",required = false) String username,
                       @RequestParam(value = "pwd",required = false) String pwd,
                       HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                       Model model) throws Exception {
       //        查询用户列表
       List<StudentInfo> stuList = studentInfoService.selectAll();
       for (StudentInfo list : stuList) {
           list.getId();
//            logger.debug("用户名:" + list.getUsername() + "密码:" + list.getPwd() + "盐:" + list.getSalt());
       }
       //通过用户名取出本条数据
       StudentInfo stu = studentInfoService.selectByUsername(username);
       Long id = stu.getId();
       //设置当前登录时间,一会儿添加到token
       Long currentTime = System.currentTimeMillis();
       logger.info(id);
       //把当前登录时间更新到数据库
       StudentInfo updateStu = new StudentInfo();
       updateStu.setId(id);
       updateStu.setLogAt(currentTime);
       int addTime = studentInfoService.updateLoginTimeById(updateStu);
       logger.info(addTime);
       logger.info(updateStu);
       logger.info("当前登录时间是:" + currentTime);
       //**********************************************************************************************
//        定义需要加密的token( id + 登录时间 + 用户名 )
       String idAndTimeAndUsername = id + "," + currentTime + "," + username;
       logger.info("看一手这个( id + 时间 + 用户名 )的字符串:" + idAndTimeAndUsername );
//        加密,生成Token
       String jwtid = "123456";
       String jwtToken = JwtUtils2.createJWT(jwtid,idAndTimeAndUsername,currentTime);
       System.out.println("****这就是JWT_Token" + jwtToken);
       //        保存到Cookies
       Cookie cookie = new Cookie("token", jwtToken);
//        设置一下Cookie
//        切记cookie时间设置,当你刷新,超时cookie失效
//        cookie.setMaxAge(12*30*24*60*60);
       cookie.setMaxAge(60);
       cookie.setPath("/");
//        添加到请求中
       httpServletResponse.addCookie(cookie);
       //**********************************************************************************************
//        打印输入的用户名和密码
       logger.info("输入的账户名是:" + username );
       logger.info("输入的账户密码是:" + pwd );
//        扔到service层去看一手**账号**密码**是不是和数据库的对应
       StudentInfo loginUser = new StudentInfo();
       loginUser.setUsername(username);
       loginUser.setPwd(pwd);
//        验证用户名是否在数据库中
       Boolean isNameSame = stu.getUsername().equals(username);
       logger.info(isNameSame);
//        验证密码是否在数据库中MD5加盐加密之后一致
       Boolean isPwdSame = studentInfoService.verifyPwd(loginUser);
       logger.info("是否一致:" + isPwdSame);
////      查找用户是否存在
       if (isNameSame && isPwdSame) {
           logger.info("登录成功");
           logger.info("打印一下cookie" + cookie);
           logger.info("打印一下cookie的名:" + cookie.getName());
           logger.info("打印一下cookie的值:" + cookie.getValue());
           return "redirect:/index";
       }
       return "error.page";
   }


   /**
    * 退出登录
    * @param request
    * @param response
    * @return
    */
//     用户退出时清除用户session里绑定到指定名称的对象
   @RequestMapping("/logout")
   public String logOut(HttpServletRequest request, HttpServletResponse response){
       Cookie cookieKiller = new Cookie("token", null);
       cookieKiller.setMaxAge(0);
       cookieKiller.setPath("/");
       response.addCookie(cookieKiller);
       logger.info("退出登录,清除Cookie");
       return "redirect:/index";
   }

   @Autowired
   StudentHomeService studentHomeService;
//  主页
   @RequestMapping("/index")
   public String home(Model model, HttpServletRequest request) throws Exception {
       //header信息展示
       String[] status = LoginStatus.status(request);
       logger.info("我王境泽就是饿死:" + status);
       model.addAttribute("status", status);
       //页面信息
       List<StudentHome> selectGreatStudent = studentHomeService.selectGreatStudent();
       int countAll = studentHomeService.countAll();
       int workingCount = studentHomeService.workingCount();
       model.addAttribute("selectGreatStudent", selectGreatStudent);
       model.addAttribute("countAll", countAll);
       model.addAttribute("workingCount", workingCount);
       return "main.home";
   }

   @Autowired
   StudentProfessionService studentProfessionService;

//  职业
   @RequestMapping(value = "/u/profession")
   public String profession(HttpServletRequest request, HttpServletResponse response,Model model) throws Exception {
       System.out.println("****拦截器判断进入**职业展示");
       //header信息展示
       String[] status = LoginStatus.status(request);
       logger.info("从这跳下去:" + status);
       model.addAttribute("status", status);
       //页面信息展示
       List<StudentProfession> selectAll = studentProfessionService.selectAll();
       model.addAttribute("selectAll", selectAll);
       int countAll = studentProfessionService.countAll();
       model.addAttribute("countAll", countAll);
       return "profession.home";
   }

//  推荐
   @RequestMapping(value = "/u/recommend")
   public String recommend(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
       System.out.println("****拦截器会去判断能不能进入**推荐页");
       //header信息展示
       String[] status = LoginStatus.status(request);
       logger.info("从这跳下去:" + status);
       model.addAttribute("status", status);
       return "recommend.home";
   }

   /**
    * 用户列表
    */
   @RequestMapping("/u/userList")
   public String userList(HttpServletRequest request, HttpServletResponse response,Model model) throws Exception {
       System.out.println("****拦截器会去判断能不能进入**用户列表");
       //header信息展示
       String[] status = LoginStatus.status(request);
       logger.info("从这跳下去:" + status);
       model.addAttribute("status", status);
       return "userList.home";
   }

   /**
    请求失败
    */
   @RequestMapping("/error")
   public String error() {
       return "error.page";
   }

}

--login的部分还是挺乱的;

目前就先整理成这样,后续再去改进;

--在改进过程中发现自己的拦截器有问题;

于是又改正一下;

package com.lihoo.ssm.util;

import com.lihoo.ssm.model.StudentInfo;
import com.lihoo.ssm.service.StudentInfoService;
import io.jsonwebtoken.Claims;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

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

/**
* #Title: LoginInterceptor
* #ProjectName task5_index1
* #Description: 拦截器
* #author lihoo
* #date 2018/9/6-13:19
* @author lihoo
*/

@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
   private static Logger logger = LogManager.getLogger(LoginInterceptor.class);

   @Autowired
   StudentInfoService studentInfoService;

//    执行之前进行拦截
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
       System.out.println("拦截器启动!!!!");
//        拿到请求中的cookie
       Cookie[] cookies = request.getCookies();
//        判断Cookie中的token有效性判断用户是否登录
       if (cookies != null) {
//            取出token名字的Cookie
           for (int i = 0; i < cookies.length; i++) {
               if ("token".equals(cookies[i].getName())) {
                   logger.info("开始拦截");
//                    取出这个cookie
                   String tokenValue = cookies[i].getValue();
                   logger.info("这个cookie中,名为token的值为:" + tokenValue);
//                    解密token
                   Claims claims = JwtUtils2.parseJWT(tokenValue);
                   System.out.println(claims);
                   String tokenValueDecrypt =  claims.getSubject();
                   System.out.println(tokenValueDecrypt);
                   logger.info("解码token得到用户id和登录时间拼接的字符串为:" + tokenValueDecrypt);
//                    因为之前是用","分隔的用户id和登录时间,所以需要拆解成两个部分
                   String[] arrToken = tokenValueDecrypt.split(",");
                   logger.info("得到一个数组:" + arrToken);
                   String uid = arrToken[0];
                   logger.info("数组索引为“0”的部分是用户id" + uid);
                   String loginTime = arrToken[1];
                   logger.info("数组索引为“1”的部分是登录时间" + loginTime);
                   String uname = arrToken[2];
                   logger.info("数组索引为“2”的部分是用户名" + uname);
//                    对解码之后的token中的登录时间与数据库保存的登录时间做对比
//                    因为uid是一个String,需要转换为Long类型
                   StudentInfo stuFindByName = studentInfoService.selectByUsername(uname);
                   logger.info("用户信息:" + stuFindByName);
                   Long dblLogtime = stuFindByName.getLogAt();
                   logger.info("数据库存储的登录时间:" + dblLogtime);
                   Long loginTimeLong = Long.parseLong(loginTime);
                   if (loginTimeLong.equals(dblLogtime)) {
                       logger.info("token时间和数据库时间一致!");
                       return true;
                   }
               }
           }
       }
       logger.info("不一致!!!!");
       request.getRequestDispatcher("/login.page").forward(request,response);
       return false;
   }

   @Override
   public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

   }

   @Override
   public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

   }
}

--加了一个增删改查,方便之后测试用;;

--

--学习Jmeter

 --简单测了一下1000;

--

明天计划的事情:

--一步一步来;

--

遇到的问题:

--

主要是Badboy录制脚本问题;

因为之前IE浏览器兼容做的不好,导致问题出在前端;

--

收获:

--


返回列表 返回列表
评论

    分享到