1.登录后,所有业务页面显示当前用户的名称。意思就是右上角显示当前登录用户的用户名。
整体思路:可以在登录时把user存在session中。在index.jsp主页面总获取。
用session原因:
把控制层(controller)代码中处理好的数据传递到视图层(jsp),使用作用域传递:
pageContext:用来在同一个页面的不同标签之间传递数据。
request:在同一个请求过程中间传递数据。
session: 同一个浏览器窗口的不同请求之间传递数据。
application:所有用户共享的数据,并且长久频繁使用的数据。
2.记住密码
思路:对传过来的LoginDto中的IsRemPwd属性判断是否true,为true把账号密码写到cookie。如果没有选择记住密码,也需要把cookie做删除处理。
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/settings/qx/user/Login.do")
@ResponseBody
public ReturnObject login(LoginDto loginDto, HttpServletRequest request, HttpServletResponse response, HttpSession session){
// //把request封装进loginDto
// loginDto.setData(request);
User user = userService.QueryByLoginActAndPwd(loginDto);
//根据返回的user对象,进行非空、过期、状态、ip的判断
if (user != null){
//把时间转成字符串,用String的compareTo方法比较大小
//获取当前时间
Date date = new Date();
//调用工具类中方法 将日期转成数据库中 日期的格式
String nowStr = DateTimeUtils.formatDateTime(date);
//判断是否过期
if(nowStr.compareTo(user.getExpireTime()) > 0){
//账号过期登陆失败
return new ReturnObject(Constants.RETURN_OBJECT_CODE_FAIL,"账号已过期");
} else if ("0".equals(user.getLockState())) {
//账号被锁定登陆失败
return new ReturnObject(Constants.RETURN_OBJECT_CODE_FAIL,"账号锁定");
} else if (! user.getAllowIps().contains(request.getRemoteAddr())) {
//ip不符合
return new ReturnObject(Constants.RETURN_OBJECT_CODE_FAIL,"ip不符合");
}else {
//登陆成功
ReturnObject returnObject = new ReturnObject(Constants.RETURN_OBJECT_CODE_SUCCEED, "登陆成功");
//把用户名存到session中
session.setAttribute(Constants.SESSION_USER,user);
//判断isRemPwd,是否需要把用户名密码存到cookie
if ("true".equals(loginDto.getIsRemPwd())){
Cookie c1 = new Cookie("loginAct", loginDto.getLoginAct());
c1.setMaxAge(10*24*60*60);
response.addCookie(c1);
Cookie c2 = new Cookie("loginPwd", loginDto.getLoginPwd());
c2.setMaxAge(10*24*60*60);
response.addCookie(c2);
}else {
//没有选择记住密码,删除cookie
Cookie c1 = new Cookie("loginAct", "1");
c1.setMaxAge(0);
response.addCookie(c1);
Cookie c2 = new Cookie("loginPwd", "1");
c1.setMaxAge(0);
response.addCookie(c2);
}
return returnObject;
}
}else{
//user为空,返回相应的ReturnObject对象
return new ReturnObject(Constants.RETURN_OBJECT_CODE_FAIL,"用户名或密码错误");
}
}
}
登录验证功能
思路:对涉及业务页面的访问进行拦截 ,如果session中没有user,就跳转到登录页面。
拦截器类
/*
对业务操作,都要经过拦截器判断是否已经登录。
* */
public class LoginInterceptor implements HandlerInterceptor {
//在执行controller之前进行判断是否登录
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//通过session获取user对象,判断是否为null
//因为不是controller不可以直接导入HttpSession
HttpSession session = httpServletRequest.getSession();
User user = (User) session.getAttribute(Constants.SESSION_USER);
if (user==null){
//user为null,即未登录,跳转到登录页面
// 不能用return "redirect: ";来重定向。在controller中可以这样是借助springmvc完成的重定向
// httpServletResponse.sendRedirect("/crm");重定向时要url要加项目的名称,在controller中不用加因为借助了框架
httpServletResponse.sendRedirect(httpServletRequest.getContextPath());//url不能写死
//后面代码不需要执行,返回false终止
return false;
}
return true;
}
@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 {
}
}
只需要在controller执行前,完成拦截操作,user为null重定向跳到到首页,首页自动跳到登录页面,返回false后面代码不执行。
这里重定向需要手动调用sendRedirect(参数)方法,参数要写上项目名称
在springmvc配置文件中配置拦截器
涉及业务的页面都在settings和workbench目录下,需要被拦截。但要排除对首页和登录页面请求的拦截。最后配置需要的拦截器类。
安全退出功能
清空cookie和销毁session
package com.bjpowernode.crm.settings.web.controller;
import com.bjpowernode.crm.common.constants.Constants;
import com.bjpowernode.crm.common.domain.ReturnObject;
import com.bjpowernode.crm.common.utils.DateTimeUtils;
import com.bjpowernode.crm.settings.domain.User;
import com.bjpowernode.crm.settings.dto.LoginDto;
import com.bjpowernode.crm.settings.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;
@Controller
public class UserController {
/**
* 安全退出
* @return
*/
@RequestMapping("/settings/qx/user/logout.do")
public String logout(HttpServletResponse response,HttpSession session){
//清除cookie
Cookie c1 = new Cookie("loginAct", "1");
c1.setMaxAge(0);
response.addCookie(c1);
Cookie c2 = new Cookie("loginPwd", "1");
c2.setMaxAge(0);
response.addCookie(c2);
//销毁session
session.invalidate();
//退出后 重定向,跳转到首页
//如果用 请求转发,url并不会变,肯定还是controller中logout方法的地址,如果用户此时又刷新,又会反复退出,所以用重定向
return "redirect:/";
}
}