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

目录

前言

1、关于Session该如何处理

简单session回顾:

[回顾session的setAttribute、getAttribute :](#回顾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");
    }
}

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

相关推荐
鹿屿二向箔11 小时前
基于SSM(Spring + Spring MVC + MyBatis)框架的汽车租赁共享平台系统
spring·mvc·mybatis
沐雪架构师15 小时前
mybatis连接PGSQL中对于json和jsonb的处理
json·mybatis
鹿屿二向箔16 小时前
基于SSM(Spring + Spring MVC + MyBatis)框架的咖啡馆管理系统
spring·mvc·mybatis
aloha_7891 天前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
毕业设计制作和分享1 天前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
paopaokaka_luck1 天前
基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)
java·spring boot·小程序·毕业设计·mybatis·1024程序员节
cooldream20091 天前
Spring Boot中集成MyBatis操作数据库详细教程
java·数据库·spring boot·mybatis
不像程序员的程序媛1 天前
mybatisgenerator生成mapper时报错
maven·mybatis
小布布的不1 天前
MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符
前端·mybatis·springboot
背水1 天前
Mybatis基于注解的关系查询
mybatis