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");
    }
}

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

相关推荐
Flying_Fish_roe2 小时前
MyBatis-Plus 常见问题与优化
java·tomcat·mybatis
终末圆5 小时前
MyBatis XML映射文件编写【后端 18】
xml·java·开发语言·后端·算法·spring·mybatis
kunkun1015 小时前
Mybatis的XML实现方法
xml·java·mybatis
码农小伙5 小时前
SpringBoot中基于Mybatis-Plus多表联查(无xml,通过注解实现)
xml·spring boot·mybatis
aloha_78919 小时前
B站宋红康JAVA基础视频教程(chapter14数据结构与集合源码)
java·数据结构·spring boot·算法·spring cloud·mybatis
狼爷20 小时前
SpringBoot整合MyBatis-Plus
java·mybatis
coffee_baby1 天前
享元模式详解:解锁高效资源管理的终极武器
java·spring boot·mybatis·享元模式
程序员大金1 天前
基于SSM+Vue+MySQL的酒店管理系统
前端·vue.js·后端·mysql·spring·tomcat·mybatis
Tatakai252 天前
Mybatis Plus分页查询返回total为0问题
java·spring·bug·mybatis
A_cot2 天前
Redis 的三个并发问题及解决方案(面试题)
java·开发语言·数据库·redis·mybatis