目录

一:总结域对象

二:基于Session改造oa项目的登录功能

三:oa项目的安全退出系统


一:总结域对象

(1)request(对应的类名:HttpServletRequest)

  • 请求域(请求级别的)

(2)session(对应的类名:HttpSession)

  • 会话域(用户级别的)

(3)application(对应的类名:ServletContext)

  • 应用域(项目级别的,所有用户共享的)

(4)三个域对象的大小关系:request < session < application

(5)三个域对象都有以下三个公共的方法:

  • setAttribute(向域当中绑定数据)

  • getAttribute(从域当中获取数据)

  • removeAttribute(删除域当中的数据)

(6)使用原则:尽量使用小的域!

二:基于Session改造oa项目的登录功能

(1)前面oa项目增加用户登录的功能 这篇博客已经论述了,我们增加的登录页面实际上没有真正起到作用;所以学了session以后要进行优化!

(2)思路:登录成功之后,可以将用户的登录信息存储到session当中。

也就是说session中如果有用户的信息就代表用户登录成功了!

session中没有用户信息,表示用户没有登录过。则跳转到登录页面!

第一处修改:登录页面的类UserServlet

(1)原来的逻辑是登录成功,直接跳转到展示页面/dept/list;对应的类是DeptServlet;现在要在之前调用getSession()方法获取session对象,把用户名username放进去。

(2)这里不用加参数false,我们登录成功一定要获取session对象的,如果没有就新建一个;如果加了false就不会新建,没有会直接返回null。

        // 登录成功/失败if (success) {// 登录成功,是一定要获取sessionHttpSession session = request.getSession();// 把用户名放进sessionsession.setAttribute("username",username);response.sendRedirect(request.getContextPath()+"/dept/list");}else{// 登录失败response.sendRedirect(request.getContextPath()+"/error.jsp");}

第二处修改:列表信息展示类DeptServlet

(1)登录成功后,会把用户名放到session,这里要进行入口的验证;要加上false,只是获取当前session对象,获取不到就返回null;不需要新建session!

(2)如果获取不到session对象或者说获取不到session对象的username,表示没有登录过,需要跳转到登录页面进行登录;否则,表示登录过,就可以展示列表页面!

(3)达到的效果:直接跳过登录页面,直接访问/dept/list资源是行不通的;但是只要登录上,当前会话没结束(浏览器没关闭);打开新的窗口,直接访问/dept/list资源也是可以的;因为访问的一直是同一个session对象!

        // 入口的验证:获取session 加上false,表示不需要新建session// 只是获取当前session对象,获取不到就返回nullHttpSession session = request.getSession(false);if (session != null && session.getAttribute("username") != null){// 获取servlet pathString servletPath = request.getServletPath();if ("/dept/list".equals(servletPath)){doList(request,response);}else if("/dept/detail".equals(servletPath)){doDetail(request,response);}else if("/dept/delete".equals(servletPath)) {doDel(request, response);}else if("/dept/add".equals(servletPath)) {doAdd(request, response);}else if("/dept/modify".equals(servletPath)) {doModify(request, response);}}else{// 跳转到登录页面response.sendRedirect(request.getContextPath()+"/index.jsp");}

第三处:访问jsp的时候不生成session对象

注意:就算前面登录页面的类UserServlet没有获取创建session对象(当然username也就没放进去);后面在列表信息展示类DeptServlet中也可能会获取到session对象;因为首先调用了index.jsp;JSP的内置对象当中有session对象!

根据Tomcat服务器提示,找到以下路径,CATALINA_BASE:   "C:\Users\86177\.IntelliJIdea2018.3\system\tomcat\Tomcat_9_0_68_JavaWeb" 找到index_jsp.java发现以下代码:

javax.servlet.http.HttpSession session = null;
// 这里获取到了session对象
session = pageContext.getSession();

实际上是可以禁用生成session对象的!

在index.jsp中增加以下page指令,表示访问jsp的时候不生成session对象

<%@page session="false" %>

第四处:增加一个欢迎语句

我们登录成功后,已经把用户名放入session对象当中,所以可以直接从内置对象session当中取出username;但是如果使用<%@page session="false" %>,session对象就不能用了!

在list.jsp增加以下代码:

<h3>欢迎<%=session.getAttribute("username")%>登录</h3>

达到以下的页面效果,比如登录的是root用户:

三:oa项目的安全退出系统

手动销毁session对象,调用的是session的invalidate()方法!

第一处修改:index.jsp增加以下代码

<a href="<%=request.getContextPath()%>/dept/exit">退出系统</a>

第二处修改:UserServlet类中新增/dept/exit的编写

这里和登录页面/dept/login写在一块,使用同一个UserServlet;主要思想就是使用模板方法设计模式的思想减少类的使用!

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtil;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @Author:朗朗乾坤* @Package:com.bjpowernode.oa.web.action* @Project:JavaWeb* @name:UserServlet* @Date:2022/11/28 19:59*/
@WebServlet({"/dept/login","/dept/exit"})
public class UserServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取servlet pathString servletPath = request.getServletPath();if("/dept/login".equals(servletPath)){doLogin(request,response);}else if("/dept/exit".equals(servletPath)){doExit(request,response);}}/*** 退出系统,手动销毁session对象* @param request* @param response* @throws ServletException* @throws IOException*/protected void doExit(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取当前session对象HttpSession session = request.getSession(false);// 销毁session对象if (session != null) {// 手动销毁session.invalidate();// 销毁以后,跳到登录页面response.sendRedirect(request.getContextPath()+"/index.jsp");}}/*** 登录,创建session对象* @param request* @param response* @throws ServletException* @throws IOException*/protected void doLogin(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 打一个布尔标记boolean success = false;// 获取前端提交的用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");// 连接数据库进行验证Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {// 获取连接conn = DBUtil.getCoonetion();// 获取预编译的数据库操作对象String sql = "select * from t_user where username=? and password=?";ps = conn.prepareStatement(sql);ps.setString(1, username);ps.setString(2, password);// 执行sqlrs = ps.executeQuery();// 如果里面有数据表示登录成功:1条或者0条if (rs.next()) {success = true;}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.close(conn, ps, rs);}// 登录成功/失败if (success) {// 登录成功,是一定要获取session// 获取session对象(不需要加参数false,不能返回null)// 必须获取到session,没有就新创建一个sessionHttpSession session = request.getSession();// 把用户名放进sessionsession.setAttribute("username",username);response.sendRedirect(request.getContextPath()+"/dept/list");}else{// 登录失败response.sendRedirect(request.getContextPath()+"/error.jsp");}}
}

这样就增加了一个安全退出系统的按钮

Session | 基于Session改造oa项目的登录功能相关推荐

  1. 【博客项目】—登录功能实现( 四)

    [博客项目]-登录功能实现( 四) 创建用户集合,初始化用户 连接数据库 创建用户集合 初始化项目

  2. day07-vue项目-搭建项目到登录功能

    文章目录 1.电商业务概述 2.项目初始化 3.码云相关操作 B.安装git D.在本地创建公钥:在终端运行:ssh-keygen -t rsa -C "xxx@xxx.com" ...

  3. Vue后台管理系统项目——实现登录功能

    文章目录 登录功能 1. 登录业务流程 2. 登录业务相关技术点 3. 登录-- token 原理分析 4. 登录功能的实现(都记牢点) 登录页面的布局 创建登录组件 登录组件页面布局 登录组件头部布 ...

  4. [Vue项目实战]登录功能实现

    登录功能实现 写在前面 登录概述 登录业务流程 登录业务的相关技术点 登录---token原理分析 登录功能实现 登录页面的布局 在components文件下创建一个vue文件 配置路由(并添加路由重 ...

  5. react招聘项目——使用cookie实现项目自动登录功能

    cookie实现自动登录功能 最近在项目中使用了cookie实现自动登录的功能,下面我将使用项目中的例子来对cookie进行简单的分析. 功能需求是:在用户访问网址的时候,使用cookie对用户的操作 ...

  6. ‘仿微信发表朋友圈’项目中登录功能的业务逻辑

    登录功能 手机号验证码都通过后端验证后 返回用户数据 登陆成功 成功后 调用store中的setUser方法 store中的setUser方法 将后端返回的用户信息存储到localStorage中 同 ...

  7. 基于SpringBoot+webSocket实现扫码登录功能

    作者:93年颈椎病人 blog.csdn.net/q826qq1878/article/details/91041679 最近单位又有一个新Java项目. 涉及到扫码登录.之前项目使用的是 ajax轮 ...

  8. 基于PHP+MySQL实现注册和登录功能

    总述 通过 PHP 连接 MySQL 数据库需要有以下关键的五个步骤 连接数据库 创建数据表 插入数据 获取数据 结束连接 而基于这五个步骤,即可实现简易的登录注册功能 首页 登录成功页面 ├── c ...

  9. 前端学习(1389):多人管理项目9登录功能具体实现

    blog.js const express = require('express'); //创建网站服务器 const app = express(); //开放静态资源文件 const path = ...

最新文章

  1. ViewPager 实现界面加载不同的数据
  2. 网站标题怎么写可以被搜索引擎快速识别?
  3. Hasor JDBC 的难关,嵌套事务处理思路
  4. 【渝粤题库】国家开放大学2021春2097民法学(1)题目
  5. 检查库文件的rpath命令
  6. 代码走查,使用插件findbugs(eclipse)
  7. J2EE是什么(二)
  8. HTTP提交方式之PUT详细介绍及POST和PUT的区别
  9. Composer中的ThingWorx模型定义—可视化
  10. 电子印章系统基础“角色权限”分配攻略
  11. 微软skype收购案
  12. 免费语音转文字的软件有哪些?快来看看这几个软件
  13. java计算机毕业设计红色景点自驾游网站管理系统MyBatis+系统+LW文档+源码+调试部署
  14. 韩顺平Java基础-第一阶段(建立编程思想)
  15. matlab实现进退法、0.618法、牛顿法
  16. c#语言入门 刘老师,c#单元测试实例(学习刘老师视频)
  17. 医疗器械产品 EMC 测试与整改思路
  18. 大数据+NCAA=?球迷情绪预测体育赛事结果
  19. 谈谈最近副业挣钱的感受,一要形成体系,二要找平台加持
  20. git基本命令ls、cat、mv、touch简述

热门文章

  1. MySQL——SQLyog如何导出、导入数据库
  2. Tomcat启动报错org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to sta
  3. 如何设置VSCode删除整行快捷键?
  4. 【人工智能】关于人类大脑模型的一些数学公式
  5. 微软开源的浏览器自动化工具-Playwright
  6. 【linux虚拟机使用yum安装MySQL+修改密码】
  7. 手机短信删除了怎么恢复?简单方法推荐
  8. 发布者订阅者模式之JAVA实现
  9. Ray在蚂蚁大规模生成落地中的优化与实践
  10. 中国苏珊大叔山东农民 朱之文