Spring Boot 的拦截器
过往的残酷回忆,不会随着年岁而消减。
世界既不黑也不白,而是一道精致的灰。
文章目录
前言
SpringMvC中有两种很普遍的AOP实现:过滤器(Filter)与 拦截器(Interceptor)
学习内容:
拦截器(Interceptor)拦截器(Interceptor)
- 拦截器是面向切面编程(AOP,Aspect Oriented Program)的。
- 拦截器的主要包含HandlerInterceptor、WebMvcConfigurer接口。
- 集成HandlerInterceptor接口后会重写4大方法:preHandle是在请求controllor前调用。postHandler在调用Controller方法之后,视图渲染之前调用。afterCompletion是在渲染视图完成之后使用。afterConcurrentHandlingStarted方法用来处理异步请求。
实现步骤
- 主要演示登录验证拦截功能。
- 创建LoginInterceptor并实现HandlerInterceptor接口,重写preHandle方法。
package com.youmi.config;
import java.io.IOException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import com.youmi.entity.IUser;
/**
* 描述:自定义拦截器
* 1、此类需要与SessionInterceptor 类配合使用
* 2、SessionInterceptor类白名单中接口会自动过滤,不会在此类中执行。
* @author LT
*
*/
@Component
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
System.out.println("执行到了preHandle方法");
System.out.println(handler);
//获取请求路径(包含Controller接口与HTML页面)
System.out.println(request.getRequestURI());
//获取session,此处session会根据前端cookie中存储的sessionID进行获取。
IUser user = (IUser) request.getSession().getAttribute("IUser");
if (user==null){
System.out.println(request.getContextPath());
response.sendRedirect(request.getContextPath()+"/");//拦截后跳转的方法
System.out.println("已成功拦截并转发跳转");
return false;
}
// 获取浏览器中的cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+":"+cookie.getValue());
}
System.out.println("合格不需要拦截,放行");
return true;
}
}
- 创建SessionInterceptor 类并实现WebMvcConfigurer接口。
- 老版本是WebMvcConfigurerAdapter接口。
package com.youmi.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 描述:自定义拦截器,并注入SpringMVC
* 1、主要用来定义需要被拦截、放行的接口,包含前端页面、js、css
* 2、此类需要与实现HandlerInterceptor接口的类结合使用。
* @author
*
*/
@Configuration
public class SessionInterceptor implements WebMvcConfigurer{
/**
* 自定义拦截器,添加拦截路径和排除拦截路径
* addPathPatterns():添加需要拦截的路径
* excludePathPatterns():添加不需要拦截的路径
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 拦截路径:必须登录才可以访问
List<String> patterns = new ArrayList<>();
patterns.add("/**");
// 白名单:在黑名单范围内,却不需要登录就可以访问
List<String> excludePatterns = new ArrayList<>();
// 添加登录接口
excludePatterns.add("/system/user/login");
// 注册拦截器
// new LoginInterceptor中LoginInterceptor就是实现HandlerInterceptor接口的类。
registry
.addInterceptor(new LoginInterceptor())
.addPathPatterns(patterns)
.excludePathPatterns(excludePatterns);
}
}
- 创建UserController 类
package com.youmi.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONObject;
import com.youmi.VO.ResultVO;
import com.youmi.entity.IUser;
import com.youmi.service.UserService;
/**
* 用户
* @author
* @data 2020年5月6日
*/
@RestController
@RequestMapping("/system/user")
public class UserController extends BaseController{
/**
* 登录
* @param json
* @return
* @throws Exception
*/
@RequestMapping("/login")
public Object login(HttpServletRequest request,@RequestBody JSONObject json) {
IUser user = userService.login(json);
HttpSession session = request.getSession();
session.setAttribute("IUser", user);
return user;
}
}
- 一个完整的登录拦截器就完成了。