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

目录

前言

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙洋静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值