SpringBoot中使用拦截器
回顾SpringMVC使用拦截器步骤
https://www.cnblogs.com/mengd/p/13538396.html
一、Spring Boot 使用拦截器步骤
1. 创建一个SpringBoot 框架 Web 项目
2. 创建model
用户信息
package com.md.springboot.model;
/**
* @author MD
* @create 2020-08-22 15:38
*/
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3. 实现一个登录拦截器
在包com.md.springboot.interceptor下
package com.md.springboot.interceptor;
import com.md.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;
/**
* @author MD
* @create 2020-08-22 15:35
*/
public class UserInterceptor implements HandlerInterceptor { // 快捷键ctrl+O 实现这三个方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 业务拦截的规则
// 从session中获取用户的信息
User user = (User)request.getSession().getAttribute("user");
// 判断用户是否登陆
if (null == user){
// 未登陆
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 {
}
}
4. 创建一个控制层
package com.md.springboot.web;
import com.md.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;
/**
* @author MD
* @create 2020-08-22 15:50
*/
@Controller
@RequestMapping(value = "/user")
public class UserController {
// 用户不登陆也能访问
@RequestMapping(value = "/login")
@ResponseBody
public Object login(HttpServletRequest request){
// 将用户信息存放到session中
User user = new User();
user.setId(1001);
user.setName("pony");
request.getSession().setAttribute("user",user);
return "login success";
}
// 用户登陆才能访问
@RequestMapping(value = "/center")
public @ResponseBody Object center(){
return "You see center";
}
// 用户不登陆也能访问
@RequestMapping(value = "/out")
public @ResponseBody Object out(){
return "You look outside";
}
// 用户不登陆也能访问
// 用户未登陆访问了需要登陆的页面
@RequestMapping(value = "/error")
public @ResponseBody Object error(){
return "error";
}
}
5. @Configuration 定义配置类- 拦截器
在 项 目 中 创 建 一 个 config 包 , 创 建 一 个 配 置 类 InterceptorConfig , 并 实 现WebMvcConfigurer 接口, 覆盖接口中的 addInterceptors 方法,并为该配置类添加@Configuration 注解,标注此类为一个配置类,让 Spring Boot 扫描到,这里的操作就相当于 SpringMVC 的注册拦截器 ,@Configuration 就相当于一个 applicationContext-mvc.xml
重点看注释
实际中拦截地址不必这么麻烦,这里演示多种形式
package com.md.springboot.config;
import com.md.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;
/**
* @author MD
* @create 2020-08-22 15:42
*/
// 定义此类为配置类(相当于之前的xml配置文件)
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
// mvc:interceptors
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 拦截user下的所有访问请求,必须用户登陆才可访问
// 但这样的话就全部拦截了,有一些请求是不需要拦截的
String[] addPathPatterns = {
"/user/**"
};
// 排除拦截的地址,也就是用户不登陆也能访问的路径
String[] excludePathPatterns = {
"/user/out","/user/login" , "/user/error"
};
// mvc:interceptor
// 传入自定义的拦截器,以及拦截地址
registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
}
}
6. 测试
首先访问不登陆也能访问的页面
然后访问必须登陆之后才能看到的页面,会自动跳转到error页面
进行登陆
登陆成功之后再访问
作者:山丘!
-------------------------------------------
你闻讯而来,我大喜过望,我在这等你,你又在哪呢?喜欢的话加一个“关注”呗!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!