记录 用户会话session 及 拦截器编写

98 阅读4分钟

session

  • session对象主要存在服务器端 可以用于保存服务器的临时数据的对象 所保存的数据可以在整个项目中都可以通过访问来获取 把session的数据看做一个共享的数据首次登录的时候所获取的用户的数据 转移到session对象即可

  • 实现一个session

    • 封装session对象中数据的获取(封装在父类中)数据的设置(当用户登录成功后进行数据设置 设置到全局的session对象)
    • 在父类封装想要的数据 比如 uid username等。。。
        // 在父类中编写一个方法 
        /**
         * 从HttpSession对象中获取uid
         * @param session HttpSession对象
         * @return 当前登录的用户的id
         */
        protected final Integer getUidFromSession(HttpSession session){
            return Integer.valueOf(session.getAttribute("uid").toString());
        }
        
        // 使用
        public User login(String username, String password, HttpSession session){
            // 调用业务对象的方法执行登录,并获取返回值
            User data = userService.login(username,password);
            // 登录成功后,将uid和username存入到HttpSession中
            // 打印查看是否存储成功
            session.setAttribute("uid",data.getUid());
            return null;
        }
    

拦截器

  • 在Spring MVC中拦截请求是通过处理器拦截器HandlerInterceptor来实现的,它拦截的目标是请求的地址。在Spring MVC中定义一个拦截器,需要实现HandlerInterceptor接口。

HandlerInterceptor 中有3个方法

  preHandle()方法
  
    该方法将在请求处理之前被调用。SpringMVC中的Interceptor是链式的调用,在一个应用或一个请求中可以同时存
  在多个Interceptor。每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的
  preHandle()方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方
  法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值类型,当返回false时,表示请求结束,后
  续的Interceptor和Controller都不会再执行;当返回值true时,就会继续调用下一个Interceptor的preHandle方法,
  如果已经是最后一个Interceptor的时,就会调用当前请求的Controller方法。
      
  postHandle()方法
  
    该方法将在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回
  渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。postHandle方法被
  调用的方向跟preHandle是相反的,也就是说先声明的Interceptor的postHandle方法反而会后执行。如果当前Interceptor
  的preHandle()方法返回值为false,则此方法不会被调用。
  
  
  afterCompletion()方法
  
    该方法将在整个当前请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于
  进行资源清理工作。如果当前Interceptor的preHandle()方法返回值为false,则此方法不会被调用。

WebMvcConfigurer

在SpringBoot项目中,如果想要自定义一些Interceptor、ViewResolver、MessageConverter,该如何实现呢?在SpringBoot 1.5版本都是靠重写WebMvcConfigurerAdapter类中的方法来添加自定义拦截器、视图解析器、消息转换器等。而在SpringBoot 2.0版本之后,该类被标记为@Deprecated。因此我们只能靠实现WebMvcConfigurer接口来实现。

WebMvcConfigurer接口中的核心方法之一addInterceptors(InterceptorRegistry registry)方法表示添加拦截器。主要用于进行用户登录状态的拦截,日志的拦截等。

  • addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
  • addPathPatterns:用于设置拦截器的过滤路径规则;addPathPatterns("/**")对所有请求都拦截
  • excludePathPatterns:用于设置不需要拦截的过滤规则
    public interface WebMvcConfigurer {
        // ...
        default void addInterceptors(InterceptorRegistry registry) {
        }
    }

拦截器代码实现

import com.cy.store.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;

/** 注册处理器拦截器 */
@Configuration // 加载当前的拦截器并进行注册
public class LoginInterceptorConfigurer implements WebMvcConfigurer {
    /** 拦截器配置 */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 创建拦截器对象
        HandlerInterceptor interceptor = new LoginInterceptor();
        // 白名单
        List<String> patterns = new ArrayList<String>();
        patterns.add("静态文件路径");
        // 通过注册工具添加拦截器
        registry.addInterceptor(interceptor)
        .addPathPatterns("/**")
        .excludePathPatterns(patterns);// 表示要拦截的URL是什么 【/**是表示所有的路径被拦截】
    }
}