OJ项目——用户的登录拦截,我是如何实现的?

news2024/10/5 14:16:59

目录

前言

1、关于Session该如何处理

简单session回顾: 

回顾session的setAttribute、getAttribute :

项目中如何做?

2、登陆拦截器实现

自定义拦截器: 

自定义拦截:


前言

        博主之前也有出过一期关于拦截器的,大家可以看看:http://t.csdnimg.cn/pXwiE

        另外,本文还会涉及到session相关知识,大家可以看看,能够更好地理解本篇

        上述只是建议对知识点不熟悉的伙伴,或者不了解相关知识的伙伴。有基础的伙伴,可以直接往下看哦~


1、关于Session该如何处理

简单session回顾: 

        老生常谈的,http协议是无状态协议,各次通信之间是没有关联的,想要建立关联,就需要我们自己另外做一些事情。而关于登录方面,假设我们已经做了登录拦截了,但又因为各次通信之间没有关联,不同功能或者页面访问的时候,服务器都会默认你没有登陆,就会导致用户一直不断地频繁进行登录操作~ 为了提高用户体验感,提出了使用cookie和session机制,当用户进行了一次登录操作后,服务器那边就会自动创建一个session回话,里面会有关于该用户的一些用户数据和身份信息等标识,同时也会生成一个cookie,cookie中会存放session的关键身份信息。服务器会把这个cookie响应给客户端(浏览器),当再次访问服务器时,发送的请求中,会带上这个cookie,服务器收到请求后,会获取cookie的列表,并查询服务器中是否有对应的session,如果有就会自动登录了~

回顾session的setAttribute、getAttribute :

        在session中,只是存下了当前用户的数据和身份信息,而我们想要更加快速和清除的获取用户的一些数据时,可以使用session的域方法~

        关于session的属性Attribute,setAttribute是可以在session中保存一个域属性,也就是可以在里面存储一个对象,在我们这个项目中,就可以存储我们的用户这个对象了~  然后使用getAttribute,来获取这个用户对象的一些用户数据信息了~ 【Attribute中是以key value的形式存在的,key则是字符串,value可以是任意类型~】

项目中如何做?

        首先,session中,已经存储了用户的信息标识了,所以Attribute中的key,我们存储成一样的,也不影响:

看了上图后,是不是好理解些了~

        所以我们把key都设置为一样的值,方便代码编写,下面我们采用一个类来设置他的值:

//全局变量 session中的Attribute的key
public class AppVariable {
    public static final String USER_SESSION_KEY = "USER_SESSION_KEY";
}

此时,当我们在成功登录后,就可以顺便给用户把他的session中的Attribute的值设置一下,如下举例:

上述代码我只是假设设计,让大家理解而已,实际上逻辑并非如此~

        就是有两点,要注意的:第一点就是,我们在使用session时,参数中要有参数HttpServletRequest,这个不是前端传的,是Spring MVC(Spring Web)内置了HttpServletRequest和HttpServletResponse,我们在使用时,在参数列表中将他们显示的写出来,即可使用了;第二点就是上图向我们展示了,setAttribute中,key和value如何传值~

我们想要获取用户信息时,设置一个方法,调用即可,如下:

package com.example.demo.commom;

import com.example.demo.entity.Userinfo;
import org.springframework.http.HttpRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:龙宝
 * Date:2023-10-14
 * Time:22:33
 */
//当我们想要从session获取用户信息时:
public class UserSessionUtils {
    public Userinfo getUser(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if(session != null && session.getAttribute(AppVariable.USER_SESSION_KEY) != null) {
            return (Userinfo) session.getAttribute(AppVariable.USER_SESSION_KEY);
        }
        return null;
    }
}

        好了,上述就是我们在项目中,Session是如何处理的全部展示~


2、登陆拦截器实现

自定义拦截器: 

        先自定义一个拦截器,实现HandlerInterceptor接口,在里面重写preHeadler方法,在方法中编写自己的业务代码,如下:

package com.example.demo.config;

import com.example.demo.commom.AppVariable;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:龙宝
 * Date:2023-10-14
 * Time:22:34
 */
//登陆拦截器
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        if(session == null || session.getAttribute(AppVariable.USER_SESSION_KEY) == null) {
            response.sendRedirect("login.html");
            return false;
        }
        return true;
    }
}

        上述代码中,如果关于session的方法你还不懂,可以翻回去再看看我上面说的~

自定义拦截:

        将自定义拦截器加入WebMvcConfigurer的addInterceptors方法中,也就是将上一步中的自定义拦截器加入到系统配置信息中,并且设置拦截规则,具体实现如下:

@Configuration
public class AppConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()) //实现的拦截器
                .addPathPatterns("/**")  //拦截所有请求
                .excludePathPatterns("/css/**") //以下都是不拦截的请求
                .excludePathPatterns("/js/**")
                .excludePathPatterns("/img/**")
                .excludePathPatterns("/login.html")
                .excludePathPatterns("/reg.html")
                .excludePathPatterns("/topic_list.html")
                .excludePathPatterns("/find_password.html")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/reg")
                .excludePathPatterns("/topic/topicList");
    }
}

好啦,本篇介绍就到这里啦,后续持续更新~

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

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

相关文章

STL容器适配器以及仿函数的简单认识

在学c的过程中,我们必不可少的一大工具就是STL,并且要一定程度的了解STL背后的原理。 今天我们来探讨一下STL中stack和queue的容器适配器,以及priority_queue是什么,以及一点仿函数的知识。1.容器适配器 1). 容器适配器 在我们了…

React添加文件路径时使用@符号代替src目录(非creae-react-app)

在其它项目中看到的可以用符号来代替src目录,那么在自己的react项目中也必须得尝试一下。本人的项目不是通过create-react-app脚手架来创建的,无法使用craco或者的方案来实现。 jsconfig.json配置 用的vscode进行开发,查看项目当中是否存在js…

与HTTP相关的各种协议

TCP/IP TCP/IP协议是目前网络世界“事实上”的标准通信协议,实际上是一系列网络通信协议的统称,其中最核心的两个协议是 TCP和IP,其他的还有 UDP、ICMP、ARP 等等,共同构成了一个复杂但有层次的协议栈。 这个协议栈有四层&#x…

Nginx:动静分离(示意图+配置讲解)

示意图: 动静分离 动静分离是指将动态内容和静态内容分开处理的一种方式。通常,动态内容是指由服务器端处理的,例如动态生成的网页、数据库查询等。静态内容是指不需要经过服务器端处理的,例如图片、CSS、JavaScript文件等。通过…

C++之make_unique、namespace、class类总结(二百四十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

React-Router-6学习笔记

一、新建react项目 1、新建项目命令: yarn create vite react-router --template react 2、在vsCode中打开项目 3、在vsCode打开命令终端,输入 yarn 4、执行yarn dev启动当前项目 yarn dev 5、删除多余的东西,保留app.jsx和main.jsx文…

高校教务系统登录页面JS分析——皖西学院

高校教务系统密码加密逻辑及JS逆向 本文将介绍皖西学院教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文,你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习,勿用于非法用途。 一、密…

NLP算法面经 | 腾讯 VS 美团

作者 | 曾同学 编辑 | NewBeeNLP 面试锦囊之面经分享系列,持续更新中 后台回复『面试』加入讨论组交流噢 lz从3月初脚因打球扭伤了开始,投递简历,接二连三的面试鞭尸又面试,昨天才终于上岸了,分享经验~ 腾讯PCG看点&…

SSH 基础学习使用

什么是SSH 1.SSH SSH(Secure Shell) 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议,利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 实际应用中,主要用于保证远程登录和远程通信的安全&#…

数字技术助力智慧公厕,让公厕变身为全新创新应用

在如今数字化的时代,数字技术的集成应用已经渗透到了生活的方方面面。其中一个令人瞩目的领域就是智慧公厕。以前只是简单的厕所,如今借助数字技术的力量,智慧公厕变得功能强大、智能高效。接下来,我们将以智慧公厕源头领航厂家广…

Retrieve Anything To Augment Large Language Models

简介 论文主要介绍了一套通过对比学习和蒸馏学习的方法,来增强学习了embedding向量,然后能够在知识增强,长上下文建模,ICL和工具学习等方面来增强大模型能力。

计算机网络第一章补充整理(计算机网络体系结构)

前言:以下整理内容,参考《计算机网络自顶向下》和哈工大的计网慕课 目录 计算机网络的体系结构的一些概念为什么采用分层结构?分层结构的优点分层结构的缺点 开放系统互连(OSI)参考模型物理层功能数据链路层功能网络层…

大数据flink篇之三-flink运行环境安装后续一yarn-session安装

前提: Hadoop 必須保证在 2.2 以上,且必須裝有 hdfs 服务。Hadoop安装后续会有相关说明。 具体的,在生产环境中,flink一般会交由yarn、k8s等资源管理平台来处理。本章主要讲解yarn模式下的session cluster模式。 flink Session-C…

FPC柔性电路板介绍及PCB设计经验规则总结

🏡《总目录》 目录 1,概述2,FPC的特点3,FPC设计十五条经验规则4,总结1,概述 FPC软板由于具有可弯曲折叠的特点,当前在消费电子,汽车电子和航空航天领域应用广泛。本文详细介绍FPC的特点并对FPC板设计中需要注意的经验原则进行总结。 2,FPC的特点 FPC的全称是Flexibl…

Python实现带图形界面的计算器

Python实现带图形界面的计算器 在本文中,我们将使用Python编写一个带有图形用户界面的计算器程序。这个程序将允许用户通过点击按钮或键盘输入数字和操作符,并在显示屏上显示计算结果。 开发环境准备 要运行这个计算器程序,您需要安装Pyth…

数据链路层—以太网协议

数据链路层—以太网协议 文章目录 数据链路层—以太网协议重新认识四层模型以太网局域网特点以太网帧格式碰撞领域和避免碰撞算法认识MAC地址令牌环网交换机认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对TCP协议的影响数据跨网段传输的过程 重新认识四层模型 TCP/IP分层模型…

C# Convert和BitConverter类学习

前言: C# Convert是一个比较好用的强制转换,相比我们之前用的(int)或者是类型.Parse(),Convert给我们提供了很多的选项,特别是对于有字节要求的变量,Convert简直就是C#编程的福音,BitConvert对于byte数组转…

数据结构的奥秘:算法与实际应用的完美融合

文章目录 第一部分:数据结构的精髓1. 数组(Array)2. 链表(Linked List)3. 栈(Stack)和队列(Queue)4. 树(Tree)5. 图(Graph&#xff09…

fastjson 1.2.47 远程命令执行漏洞

fastjson 1.2.47 远程命令执行漏洞 文章目录 fastjson 1.2.47 远程命令执行漏洞1 在线漏洞解读:2 环境搭建3 影响版本:4 漏洞复现4.1 访问页面4.2 bp抓包,修改参数 5 使用插件检测漏洞【FastjsonScan】5.1使用説明5.2 使用方法5.2.1 右键菜单中&#xff…

车载电子电器架构 —— 国产基础软件生态简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…