第五章:认证和动态菜单功能【基于Servlet+JSP的图书管理系统】

news2024/9/28 3:30:45

一、登录功能

在这里插入图片描述

1.认证实现

53-图书管理系统-登录功能-认证处理

  首先完成最基础的登录功能,也就是在登录页面通过表单提交账号密码到Servlet中。做相关的校验。给出不同的反应。

请添加图片描述

然后对应的Servlet中的处理逻辑

@WebServlet(name = "loginServlet",urlPatterns = {"/sys/loginServlet"})
public class LoginServlet extends HttpServlet {

    private IUserService service = new UserServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 做登录认证的操作
        String userName = req.getParameter("userName");
        String password = req.getParameter("password");
        // 根据账号去数据库查询记录
        SysUser user = service.findByName(userName);
        if(user == null ){
            // 说明账号不存在
            req.setAttribute("msg","登录失败!账号不存在");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }else if(!password.equals(user.getPassword())){
            // 说明密码不正确
            req.setAttribute("msg","登录失败!密码错误...");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }else{
            // 说明登录成功
            // 那么我们需要记录当前登录的用户
            HttpSession session = req.getSession();
            user.setPassword(null); // 记录的账号把密码置空。安全考虑
            session.setAttribute(Constant.LOGIN_USER,user);
            resp.sendRedirect("/main.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

5.2 认证过滤器

  我们加了认证的操作后就不应该可以通过地址栏直接访问后端的功能了。所以需要添加过滤器来做认证的校验

/**
 * 认证的过滤器:拦截所有的请求
 * 1.判断当前是否是登录状态
 * 2.请求的资源是否可以匿名访问
 * 3.都不满足就跳转会登录页面
 */
@WebFilter(filterName = "authName",urlPatterns = {"/*"})
public class AuthenticationFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 对封装请求和响应的对象做向下转型
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 获取拦截的请求的访问地址
        String requestURI = request.getRequestURI();
        if(checkAccssible(requestURI)){
            // 在没有登录的情况下可以访问的资源  登录页面 处理登录逻辑的Servlet 还有各种 js css img
            // 直接放过
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            // 访问的是需要登录后才能访问的资源
            HttpSession session = request.getSession();
            Object loginUser = session.getAttribute(Constant.LOGIN_USER);
            if(loginUser != null){
                // 是登录的状态
                filterChain.doFilter(servletRequest,servletResponse);
            }else{
                // 说明不是登录的状态
                request.setAttribute("msg","请先登录!!!");
                request.getRequestDispatcher("/login.jsp").forward(request,response);
            }
        }

    }

    private boolean checkAccssible(String requestURI){
        List<String > urls = Arrays.asList("login.jsp","loginServlet",".css","/js/",".png",".jpg");
        for (String url : urls) {
            if(requestURI.contains(url)){
                return true;
            }
        }
        return false;
    }
}

5.3 安全退出

  登录成功后我们需要安全的退出。那么就需要删除登录成功保存在Session中的认证凭证信息。

@WebServlet(name = "logoutServlet",urlPatterns = "/sys/logoutServlet")
public class LogoutServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过session注销
        HttpSession session = req.getSession();
        session.invalidate(); // 注销的操作
        //跳转会登录页面
        resp.sendRedirect("/login.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

然后main.jsp中的安全退出按钮点击的时候访问/sys/logoutServlet即可

在这里插入图片描述

6.动态菜单

  有了前面基础内容的铺垫我们就可以实现不同的用户基于不同的角色加载不同的菜单功能。那么在登录成功后需要查询当前登录用户具有的菜单信息

在这里插入图片描述

然后就是在main.jsp中动态加载菜单。注意不要完了jstl的标签库

<c:forEach items="${sessionScope.loginMenus}" var="parent">
  <c:if test="${parent.parentId == -1}" >
    <li>
      <a href="#">
        <i class="fa fa-home"></i>
        <span class="nav-label">${parent.name}</span>
        <span class="fa arrow"></span>
      </a>
      <ul class="nav nav-second-level">
        <c:forEach items="${sessionScope.loginMenus}" var="sub">
          <c:if test="${sub.parentId == parent.id}">
            <li>
              <a class="J_menuItem" href="${sub.url}" data-index="0">${sub.name}</a>
            </li>
          </c:if>
        </c:forEach>
      </ul>
    </li>
  </c:if>
</c:forEach>

显示的效果如下:

在这里插入图片描述

7.首页小功能

  左上角显示当前登录用户信息及头像

<div class="dropdown profile-element">
   <c:if test="${ not empty sessionScope.loginUser.img}">
     <span><img alt="image" class="img-circle" src="/sys/downloadServlet?fileName=${sessionScope.loginUser.img}" width="64" height="64" /></span>
   </c:if>
   <c:if test="${ empty sessionScope.loginUser.img}">
     <span><img alt="image" class="img-circle" src="img/profile_small.jpg" /></span>
   </c:if>
   <a data-toggle="dropdown" class="dropdown-toggle" href="#">
<span class="clear">
   <span class="block m-t-xs"><strong class="font-bold">${sessionScope.loginUser.username}</strong></span>
   <span class="text-muted text-xs block">${sessionScope.loginUser.nickname}<b class="caret"></b></span>
</span>
   </a>
   <ul class="dropdown-menu animated fadeInRight m-t-xs">
     <li><a class="J_menuItem" href="form_avatar.html">修改头像</a></li>
     <li><a class="J_menuItem" href="profile.html">个人资料</a></li>
     <li><a class="J_menuItem" href="contacts.html">修改密码</a></li>
     <li class="divider"></li>
     <li><a href="/sys/logoutServlet">安全退出</a></li>
   </ul>
 </div>

效果:

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/921162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试的常用概念

目录 需求 需求和软件测试人员的关系 需求是侧式人员进行软件测试工作的依据,需要通过软件需求,来设计测试用例 软件的生命周期 在每个阶段,测试人员需要做什么事? 软件测试的生命周期 BUG 什么是bug? 如何描述一个bug? bug的级别 bug的生命周期: 调试和测试的区…

Linux虚拟机安装(Ubuntu 20)

最近这段时间使用VMWare安装了一下Ubuntu版本的Linux虚拟机&#xff0c;在这里记录一下安装时参考的文章以及需要注意的细节 参考链接&#xff1a; 虚拟机&#xff08;VMware&#xff09;安装Linux&#xff08;Ubuntu&#xff09;安装教程 VMware虚拟机下安装Ubuntu20.04&…

这所985重大科目变更!新增专硕可考信号!

一、学校及专业介绍 重庆大学&#xff08;ChongqingUniversity&#xff0c;CQU&#xff09;&#xff0c;简称“重大”&#xff0c;是教育部直属的全国重点大学&#xff0c;是国家“211工程”和“985工程”重点建设的高水平研究型综合性大学、国家“世界一流大学建设高校&#…

跨境电商系统开发:打破国界壁垒,拓展全球市场

拓展全球市场的必然选择 随着国际贸易水平的不断提升和全球市场的日益开放&#xff0c;跨境电商作为一种高效的贸易模式&#xff0c;受到了越来越多电商企业的关注和青睐。跨境电商不仅可以打破国界壁垒和时差限制&#xff0c;还可以在全球市场上实现销售的拓展&#xff0c;带来…

SVN 项目管理笔记

SVN 项目管理笔记 主要是介绍 SVN 管理项目的常用操作&#xff0c;方便以后查阅&#xff01;&#xff01;&#xff01; 一、本地项目提交到SVN流程 在SVN仓库下创建和项目名同样的文件夹目录&#xff1b;选中本地项目文件&#xff0c;选择SVN->checkout,第一个是远程仓库项…

FOC之SVPWM学习笔记

一、参考资料 【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术 - 知乎FOC入门教程_zheng是在下的博客-CSDN博客DengFOC官方文档技术干货 |【自制】FOC驱动板 二、FOC控制算法流程框图 在FOC控制中主要用到三个PID环&#xff0c;从内到外依次是&#xff1a;电流环、速度环、位…

DevExpress WinForms数据编辑器组件,提供丰富的数据输入样式!(二)

DevExpress WinForms超过80个高影响力的WinForms编辑器和多用途控件&#xff0c;从屏蔽数据输入和内置数据验证到HTML格式化&#xff0c;DevExpress数据编辑库提供了无与伦比的数据编辑选项&#xff0c;包括用于独立数据编辑或用于容器控件(如Grid, TreeList和Ribbon)的单元格。…

第60步 深度学习图像识别:误判病例分析(Pytorch)

基于WIN10的64位系统演示 一、写在前面 上期内容基于Tensorflow环境做了误判病例分析&#xff08;传送门&#xff09;&#xff0c;考虑到不少模型在Tensorflow环境没有迁移学习的预训练模型&#xff0c;因此有必要在Pytorch环境也搞搞误判病例分析。 本期以SqueezeNet模型为…

Java不用加减乘除做加法(图文详解)

目录 1.题目描述 2.题解 分析 具体实现 1.题目描述 写一个函数&#xff0c;求两个整数之和&#xff0c;要求在函数体内不得使用、-、*、/四则运算符号。 示例 输入&#xff1a;1 2 输出&#xff1a;3 2.题解 分析 不能使用加减乘除四则运算符&#xff0c;那我们只能考虑…

论文笔记:从不平衡数据流中学习的综述: 分类、挑战、实证研究和可重复的实验框架

0 摘要 论文&#xff1a;A survey on learning from imbalanced data streams: taxonomy, challenges, empirical study, and reproducible experimental framework 发表&#xff1a;2023年发表在Machine Learning上。 源代码&#xff1a;https://github.com/canoalberto/imba…

多环境开发

多环境 1、多环境开发&#xff08;YAML版&#xff09; 小结&#xff1a; 多环境开发需要设置若干种常用环境&#xff0c;例如开发、生产、测试环境yaml格式中设置多环境使用—区分环境设置边界每种环境的区别在于加载的配置属性不同启用某种环境时需要指定启动时使用该环境 …

跨境电商儿童沙画办理EN71测试标准

儿童沙画就是小孩子玩的那种用彩色沙子或者彩色墨水&#xff0c;在有图形轮廓的纸片上去绘画&#xff0c;可以按照儿童沙画底板上的人物轮廓线条&#xff0c;动物线条&#xff0c;风景线条&#xff0c;动漫线条&#xff0c;去添加自己喜欢的颜色&#xff0c;让单调的线条变成自…

请不要将数据中台做成BI!

近年来&#xff0c;随着数据驱动决策的重要性日益凸显&#xff0c;数据管理的概念也不断演进。数据中台作为一种新兴的数据管理模式&#xff0c;旨在集中组织和整合数据资源&#xff0c;为企业提供更高效、更智能的数据支持。然而&#xff0c;有时候在构建数据中台的过程中&…

C语言入门 Day_9 条件判断

目录 前言&#xff1a; 1.if判断 2.else判断 3.易错点 4.思维导图 前言&#xff1a; 我们知道比较运算和逻辑运算都会得到一个布尔型的数据&#xff0c;要么为真&#xff08;true&#xff09;&#xff0c;要么为假&#xff08;false&#xff09;。 今天我们来学习真和假在…

【性能优化】使用Perfetto定位应用启动性能的瓶颈

Android应用启动优化相关的文章已经有很多人都写过了&#xff0c;但是主要都是聚焦在&#xff0c;为了启动性能都做了哪些改动上&#xff0c;少见有文章会说应该如何分析、识别应用的启动性能。 本篇文章将会结合我个人对Perfetto的实际使用经历&#xff0c;讲解车载应用的启动…

Python“牵手”当当网商品详情API接口运用场景及功能介绍,当当网API接口申请指南

当当网是全球知名的综合性网上购物商城&#xff0c;由国内著名出版机构科文公司、美国老虎基金、美国IDG集团、卢森堡剑桥集团、亚洲创业投资基金&#xff08;原名软银中国创业基金&#xff09;共同投资成立。当当网是北京当当网信息技术有限公司营运的一家中文购物网站&#x…

【校招VIP】产品行测考点之图的推理和分析

考点介绍&#xff1a; 大厂产品校招笔试里经常会出现行测的考察&#xff0c;而图的推理是行测里面稍微有难度的一部分。因为时间有限&#xff0c;很多同学因为没有解题思路而丢分。 『产品行测考点之图的推理和分析』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一…

【Unity小技巧】最简单的UI设置适配方案,萌新必看

文章目录 前言导入素材开始一、页面适配方案二、侧边栏适配方法一方法二 参考完结 前言 这期来讲一个简单的UI设计方案&#xff0c;很多同学可能搞不懂锚点、轴心这些概念&#xff0c;导致做好的UI在别人的设备上&#xff0c;乱跑或者是重叠&#xff0c;或者是参加游戏老发时间…

10-案例: 注册登录

项目思路: 1. 首页展示 将数据传递给前端模板渲染 2. 注册用户 接收前端传递的数据,保存后,重定向到首页 3. 删除用户 接收前端传递的用户名,进行删除 4. 修改用户 接收前端传递的数据,老名字进行判断,新数据修改数据 项目结构: 构建蓝图: (1). apps / user / model.py 增…

知道吗?微软将Python集成到Excel中,国产软件“抄作业”了

Excel集成Python 众所周知哦&#xff0c;VBA是一种基于微软的Visual Basic语言的宏编程语言&#xff0c;专为在Office应用程序中执行自动化任务而设计。 VBA适用于Excel、Word、PowerPoint等Office套件中的宏编程&#xff0c;可直接操作和控制Office应用程序的对象模型。 我们…