先创建一个实体类
package com.liuhaiyang.springboot.entity;
public class User {
private Integer id;
private String name;
private Integer age;
//get()和set(),tostring()
}
创建一个拦截器,用来拦截用户登录
package com.liuhaiyang.springboot.interceptor;
import com.liuhaiyang.springboot.entity.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(null==user){
//未登录
response.sendRedirect(request.getContentType()+"/onlogin");
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 {
}
}
创建controller类
package com.liuhaiyang.springboot.controller;
import com.liuhaiyang.springboot.entity.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;
import javax.servlet.http.HttpServletResponse;
@Controller
@RequestMapping("/user")
public class UserController {
//用户登录请求 未登录可以访问
@RequestMapping("/login")
public @ResponseBody Object login(HttpServletRequest request){
User user=new User();
user.setId(10086);
user.setName("zhangsan");
user.setAge(100);
request.getSession().setAttribute("user",user);
return "loginSuccess";
}
//用户登录之后访问的请求
@RequestMapping("/center")
public @ResponseBody Object center(){
return "SeeCenter";
}
//用户不登陆也可以访问 未登录可以访问
@RequestMapping("/out")
public @ResponseBody Object out(){
return "Outsee";
}
//如果用户未登录访问了需要登陆才能访问的请求,之后会跳转到到该请求路径
//未登录可以访问
@RequestMapping("/error")
public @ResponseBody Object error(){
return "error";
}
}
@Configuration 定义配置类-拦截器
在 项 目 中 创 建 一 个 config 包 , 创 建 一 个 配 置 类 InterceptorConfig , 并 实 现
WebMvcConfigurer 接口, 覆盖接口中的 addInterceptors 方法,并为该配置类添加
@Configuration 注解,标注此类为一个配置类,让 Spring Boot 扫描到,这里的操作就相当
于 SpringMVC 的注册拦截器 ,@Configuration 就相当于一个 applicationContext-mvc.xml
package com.liuhaiyang.springboot.config;
import com.liuhaiyang.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下的所有路径,必须用户登录才可访问 有些用户不登陆也可以访问的,可在下面excludePathPatterns中指出
String[] addPathPatterns={ //拦截
"/user/**"
};
//要排除的路径,排除的路径说明不需要用户登陆也可以访问
String[] excludePathPatterns={ //排除拦截
"/user/out","/user/error",
"/user/login"
};
registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
}
}
剩下的都是默认配置
测试结果:
首先,不拦截查看的网页
这时,我们并不会进入拦截器。当我们查看被拦截器保护的页面时
我们可以看到,我们进不去,同时会显示 我们已经进入了拦截器,正是拦截器起的作用。
我们登入操作后,再看,我们发现可以访问
此时再次发起 /user/center 请求,此时 session 中有用户的信息,所以拦截器中的 preHandle 方法返回了 true,请求顺利执行,可以看到 See Center Message 这句话
最后是登出操作,不会进入拦截器。