登录和首页功能完善

 

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:/";
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值