SpringBoot之 session和拦截器

时间:2024-03-26 16:17:14

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对象存放起来。
    SpringBoot之 session和拦截器
// 用户存在, 往session里面存储用户
			request.getSession().setAttribute(ConstantUtils.USER_SESSION_KEY, user);
  • 此时我们尚未添加拦截器, 登录以后可以在任何其他页面拿到session中的用户信息。
  • 例如: 我们以jsp页面为例:
    SpringBoot之 session和拦截器

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

${sessionScope.USER.name }

运行结果:
SpringBoot之 session和拦截器

拦截器:
上面的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:/";
	}

完整效果:
SpringBoot之 session和拦截器