JavaWeb使用Session和Cookie实现登录认证

发布时间 - 2026-01-11 00:14:00    点击率:

后台管理页面往往需要登录才可以进行操作,这时就需要Seession来记录登录状态

要实现起来也是非常简单,只需要自定义一个HandlerInterceptor就行了

自定义的HandlerInterceptor也只有短短几行代码

public class LoginInterceptor implements HandlerInterceptor {

  @Override
  public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object obj, Exception err)
      throws Exception {
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response,
              Object obj, ModelAndView mav) throws Exception {

  }

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
               Object obj) throws Exception {
    //获取session里的登录状态值
    String str = (String) request.getSession().getAttribute("isLogin");
    //如果登录状态不为空则返回true,返回true则会执行相应controller的方法
    if(str!=null){
      return true;
    }
    //如果登录状态为空则重定向到登录页面,并返回false,不执行原来controller的方法
    response.sendRedirect("/backend/loginPage");
    return false;
  }
}

Controller代码

@Controller
@RequestMapping("/backend")
public class BackendController {

  @RequestMapping(value = "/loginPage", method = {RequestMethod.GET})
  public String loginPage(HttpServletRequest request,String account, String password){
    return "login";
  }

  @RequestMapping(value = "/login", method = {RequestMethod.POST})
  public String login(HttpServletRequest request,RedirectAttributes model, String account, String password){
    //验证账号密码,如果符合则改变session里的状态,并重定向到主页
    if ("jack".equals(account)&&"jack2017".equals(password)){
      request.getSession().setAttribute("isLogin","yes");
      return "redirect:IndexPage";
    }else {
      //密码错误则重定向回登录页,并返回错误,因为是重定向所要要用到RedirectAttributes
      model.addFlashAttribute("error","密码错误");
      return "redirect:loginPage";
    }
  }
  //登出,移除登录状态并重定向的登录页
  @RequestMapping(value = "/loginOut", method = {RequestMethod.GET})
  public String loginOut(HttpServletRequest request) {
    request.getSession().removeAttribute("isLogin");
    return "redirect:loginPage";
  }
  @RequestMapping(value = "/IndexPage", method = {RequestMethod.GET})
  public String IndexPage(HttpServletRequest request){
    return "Index";
  }

}

spring的配置

  <!--省略其他基本配置-->

  <!-- 配置拦截器 -->
  <mvc:interceptors>
    <!-- 配置登陆拦截器 -->
    <mvc:interceptor>
      <!--拦截后台页面的请求-->
      <mvc:mapping path="/backend/**"/>
      <!--不拦截登录页和登录的请求-->
      <mvc:exclude-mapping path="/backend/loginPage"/>
      <mvc:exclude-mapping path="/backend/login"/>
      <bean class="com.ima.Interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
  </mvc:interceptors>

一个简单的Session实现登录认证系统就这样完成了,如果想登录状态退出浏览器后仍保留一段时间的可以将Session改为Cookie

一般情况下我们都会使用Cookie

Cookie和Session的方法差不多

使用Cookie的自定义HandlerInterceptor

public class LoginInterceptor implements HandlerInterceptor {

  @Override
  public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object obj, Exception err)
      throws Exception {
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response,
              Object obj, ModelAndView mav) throws Exception {

  }

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
               Object obj) throws Exception {
//    获取request的cookie
    Cookie[] cookies = request.getCookies();
    if (null==cookies) {
      System.out.println("没有cookie==============");
    } else {
//      遍历cookie如果找到登录状态则返回true执行原来controller的方法
      for(Cookie cookie : cookies){
        if(cookie.getName().equals("isLogin")){
          return true;
        }
      }
    }
//    没有找到登录状态则重定向到登录页,返回false,不执行原来controller的方法
    response.sendRedirect("/backend/loginPage");
    return false;
  }
}

Controller的变化也不大

@Controller
@RequestMapping("/backend")
public class BackendController {

  @RequestMapping(value = "/loginPage", method = {RequestMethod.GET})
  public String loginPage(HttpServletRequest request, String account, String password) {
    return "login";
  }

  @RequestMapping(value = "/login", method = {RequestMethod.POST})
  public String login(HttpServletRequest request, HttpServletResponse response, RedirectAttributes model, String account, String password) {
    if ("edehou".equals(account) && "aidou2017".equals(password)) {
      Cookie cookie = new Cookie("isLogin", "yes");
      cookie.setMaxAge(30 * 60);// 设置为30min
      cookie.setPath("/");
      response.addCookie(cookie);
      return "redirect:IndexPage";
    } else {
      model.addFlashAttribute("error", "密码错误");
      return "redirect:loginPage";
    }
  }

  @RequestMapping(value = "/logOut", method = {RequestMethod.GET})
  public String loginOut(HttpServletRequest request, HttpServletResponse response) {
    Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
      if (cookie.getName().equals("isLogin")) {
        cookie.setValue(null);
        cookie.setMaxAge(0);// 立即销毁cookie
        cookie.setPath("/");
        response.addCookie(cookie);
        break;
      }
    }
    return "redirect:loginPage";
  }

  @RequestMapping(value = "/IndexPage", method = {RequestMethod.GET})
  public String IndexPage(HttpServletRequest request) {
    return "Index";
  }

}

spring的配置和之前的一模一样

注意

这里只是演示,建议在实际项目中Cookie的键和值要经过特殊处理,否则会引发安全问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # cookie  # session  # 登录  # cookie和session登录  # javaweb实现注册登录页面  # JavaWeb实现用户登录与注册功能(服务器)  # JavaWeb实现用户登录与注册功能  # JavaWeb简单用户登录注册实例代码(有验证码)  # javaWeb使用验证码实现简单登录  # javaweb项目如何实现手机短信登录  # 一文掌握JavaWeb登录认证  # 自定义  # 重定向  # 则会  # 为空  # 拦截器  # 遍历  # 要用  # 才可以  # 只需要  # 所要  # 设置为  # 没有找到  # 大家多多  # 后台管理  # 移除  # 基本配置  # 后仍  # 几行  # 完成了  # 就行了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  如何确保西部建站助手FTP传输的安全性?  北京网站制作的公司有哪些,北京白云观官方网站?  jquery插件bootstrapValidator表单验证详解  Android Socket接口实现即时通讯实例代码  简历在线制作网站免费版,如何创建个人简历?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  敲碗10年!Mac系列传将迎来「触控与联网」双革新  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  如何挑选优质建站一级代理提升网站排名?  iOS正则表达式验证手机号、邮箱、身份证号等  python中快速进行多个字符替换的方法小结  如何在建站主机中优化服务器配置?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何配置任务调度?(Cron Job示例)  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  微信小程序 wx.uploadFile无法上传解决办法  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  使用spring连接及操作mongodb3.0实例  如何在香港免费服务器上快速搭建网站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  JS经典正则表达式笔试题汇总  如何续费美橙建站之星域名及服务?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  详解阿里云nginx服务器多站点的配置  bing浏览器学术搜索入口_bing学术文献检索地址  C++时间戳转换成日期时间的步骤和示例代码  郑州企业网站制作公司,郑州招聘网站有哪些?  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel怎么实现模型属性的自动加密  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  如何为不同团队 ID 动态生成多个非值班状态按钮  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  JavaScript如何操作视频_媒体API怎么控制播放