SpringBoot之 session和拦截器

本文详细介绍了在Web应用中如何使用Session进行会话控制,包括用户登录信息的存储和读取,以及通过创建拦截器实现未登录状态下的页面访问限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Session:
在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。

例如,现在我们要的情境是用户如果未登录, 除了访问登录界面,其他的界面被访问的时候被拦截且返回到登录页面。

  • 首先, 我们要创建一个存放session登录信息的工具类:
package com.exp.util;
public class ConstantUtils {
	public final static String USER_SESSION_KEY="USER";
}
  • 然后, 当用户成功登录以后,将用户信息作为一个session对象存放起来。
    在这里插入图片描述
// 用户存在, 往session里面存储用户
			request.getSession().setAttribute(ConstantUtils.USER_SESSION_KEY, user);
  • 此时我们尚未添加拦截器, 登录以后可以在任何其他页面拿到session中的用户信息。
  • 例如: 我们以jsp页面为例:
    在这里插入图片描述

用下面的el表达式就能拿到当前session中的用户名

${sessionScope.USER.name }

运行结果:
在这里插入图片描述

拦截器:
上面的session实现了之后 , 无论用户登录与否, 项目的页面是都可以访问的, 现在创建拦截器。(未登录不可访问除登录页面以外的其他页面).

  • 首先,创建拦截器
package com.exp.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.exp.model.User;
import com.exp.util.ConstantUtils;

@Component
public class LoginInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

        User user = (User) request.getSession().getAttribute(ConstantUtils.USER_SESSION_KEY);
        //如果session中没有user,表示没登陆
        if (user == null){
            //这个方法返回false表示忽略当前请求,如果一个用户调用了需要登陆才能使用的接口,如果他没有登陆这里会直接忽略掉
            //当然你可以利用response给用户返回一些提示信息,告诉他没登陆
        	response.sendRedirect(request.getContextPath()+"/");  
            return false;
        }else {
            return true;    //如果session里有user,表示该用户已经登陆,放行,用户即可继续调用自己需要的接口
        }

	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
	}
	
}

  • 然后注入拦截器 ( addPathPatterns 是指为哪些地址添加拦截器, /** 是所有。excludePathPatterns 是指不需要拦截器的地址, 这里除了登录 和退出登录 )
package com.exp.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.exp.interceptor.LoginInterceptor;

@Configuration
public class WebConfigurer implements WebMvcConfigurer {

	@Autowired
	LoginInterceptor loginInterceptor;
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// TODO Auto-generated method stub
		// addPathPatterns("/**") 表示拦截所有的请求,
        // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
        registry.addInterceptor(loginInterceptor)
        	.addPathPatterns("/**")
        	.excludePathPatterns("/","/login","/logout");
	}

}

  • 这样,当我们未登录的时候,就会重定向到"/" 地址下面。
  • 实现了登录拦截。

退出登陆:
即销毁session

	@RequestMapping("/logout")
	public String logout(HttpServletRequest request){
	request.getSession().removeAttribute(ConstantUtils.USER_SESSION_KEY);
	return "redirect:/";
	}

完整效果:
在这里插入图片描述

### 如何在 Spring Boot 3.x 中创建配置登录拦截器 #### 创建拦截器类 为了实现一个简单的登录拦截器,在Spring Boot应用中需定义一个新的Java类继承`HandlerInterceptorAdapter` 或者 实现 `HandlerInterceptor` 接口。此拦截器将在请求到达目标处理器方法前执行逻辑,比如检查用户是否已登录。 ```java import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取会话对象 HttpSession session = request.getSession(false); // 判断session是否存在以及其中是否有特定属性表示用户已经登录 if (session != null && session.getAttribute("user") != null) { return true; // 用户已登录,则继续处理流程 } else { // 如果未登录则重定向到登录页面 response.sendRedirect("/login"); return false; } } } ``` 上述代码展示了如何通过覆盖`preHandle()` 方法来决定是否允许请求继续前进至下一个阶段[^1]。 #### 配置拦截器 接着要做的就是把自定义好的拦截器注册给应用程序上下文,并指定哪些URL路径应该被该拦截器所管理: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { private final LoginInterceptor loginInterceptor; public WebConfig(LoginInterceptor loginInterceptor){ this.loginInterceptor = loginInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { // 注册LoginInterceptor并排除不需要保护的资源文件夹如/static/** /css/** registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns( "/static/**", "/css/**", "/js/**", "/images/**", "/fonts/**" ); } } ``` 这段配置说明了怎样将前面编写的`LoginInterceptor`加入到全局拦截链里去,并指定了它应当作用于所有的请求(`/**`)除了静态资源之外[^4]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值