1.先写一个普通的User类
package com.songzihao.springboot.model; /** * */ public class User { private Integer id; private String name; //getter and setter }
2.模拟一个简单的登录拦截器
package com.songzihao.springboot.interceptor; import com.songzihao.springboot.model.User; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * */ public class UserInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("==========进入拦截器=========="); //编写业务拦截规则 //从session中获取用户信息 User user= (User) request.getSession().getAttribute("user"); //判断用户是否登录 if(user==null) { response.sendRedirect(request.getContextPath() + "/user/error"); return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
3.编写一个UserController控制层
package com.songzihao.springboot.controller; import com.songzihao.springboot.model.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; /** * */ @Controller @RequestMapping(value = "/user") public class UserController { //用户登录的请求 @RequestMapping(value = "/login") public @ResponseBody Object login(HttpServletRequest request) { //将用户的信息放到session中 User user=new User(); user.setId(1001); user.setName("张起灵"); request.getSession().setAttribute("user",user); return "Login Success"; } //该请求需要用户登录之后才可以访问 @RequestMapping(value = "/center") public @ResponseBody Object center() { return "See Center Message"; } //该请求不登录也可以访问 @RequestMapping(value = "/out") public @ResponseBody Object out() { return "Out See Anytime"; } //用户未登录的情况下,访问到了需要登录才可以看到的页面,错误请求页面 @RequestMapping(value = "/error") public @ResponseBody Object error() { return "error"; } }
4.创建一个配置类用来定义拦截器
在 项 目 中 创 建 一 个 config 包 , 创 建 一 个 配 置 类 InterceptorConfig , 并 实 现 WebMvcConfigurer 接口, 覆盖接口中的 addInterceptors 方法,并为该配置类添加 @Configuration 注解,标注此类为一个配置类,让 Spring Boot 扫描到,这里的操作就相当
于 SpringMVC 的注册拦截器 ,@Configuration 就相当于一个 applicationContext-mvc.xml。
package com.songzihao.springboot.config; import com.songzihao.springboot.interceptor.UserInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * */ @Configuration //定义此类为配置文件(相当于之前的xml配置文件) public class InterceptorConfig implements WebMvcConfigurer { // mvc:interceptors @Override public void addInterceptors(InterceptorRegistry registry) { //要拦截user下的所有访问请求,必须用户登录才可以访问 //但是其中也有些请求是不需要登录也可以访问的 String[] addPathPatterns={ "/user/**" }; //要排除上面说到的不需要登录也可以访问的路径 String[] excludePathPatterns={ "/user/out","/user/error","/user/login" }; // mvc:interceptor <bean id="" class="" /> registry.addInterceptor(new UserInterceptor()) .addPathPatterns(addPathPatterns) .excludePathPatterns(excludePathPatterns); } }
这里只对 /user/center 请求进行拦截,因为这个请求是用户登录之后才可以查看的。
5.测试结果
首先 /user/error 请求,这个是不进行拦截的,可以直接看到返回的Json格式数据。
之后,发起 /user/center 的请求,此时被拦截器拦截下来,IDEA中会输出 进入拦截器 这句话,因为此时 session中并没有用户的信息,所以拦截器中的 preHandle 方法返回了 false,进而请求就被中断了。所以看不到 See Center Message 这句话。
下来,我们让用户进行登录,此时 session 中就有用户的信息了。
此时再次发起 /user/center 请求,此时 session 中有用户的信息,所以拦截器中的 preHandle 方法返回了 true,请求顺利执行,可以看到 See Center Message 这句话。
而最后这个 /user/out 请求不参与拦截,无论何时都可以发起请求,接收相应的请求结果。