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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

前言

1、关于Session该如何处理

简单session回顾 

回顾session的setAttribute、getAttribute :

项目中如何做

2、登陆拦截器实现

自定义拦截器 

自定义拦截


前言

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

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

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


1、关于Session该如何处理

简单session回顾 

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

回顾session的setAttribute、getAttribute :

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

        关于session的属性AttributesetAttribute是可以在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");
    }
}

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6