目录
[回顾session的setAttribute、getAttribute :](#回顾session的setAttribute、getAttribute :)
前言
博主之前也有出过一期关于拦截器的,大家可以看看: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");
}
}
好啦,本篇介绍就到这里啦,后续持续更新~