@Slf4j
@Controller
public class BlueController {
@ResponseBody
@GetMapping("/bb")
public String bb(HttpSession session){
return session.getAttribute("name").toString();
}
@ResponseBody
@GetMapping("/login")
public String login(HttpSession session){
log.info("登陆进来了");
session.setAttribute("name","123");
return "success";
}
}
package com.example.client.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
//登陆拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//请求操作之前
log.info("请求操作之前");
Object name = request.getSession().getAttribute("name");
if(name!=null){
//如果不为空 放行
return true;
}
//跳转到登陆界面
response.sendRedirect("/login");
//如果为空 拦截住
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("请求操作之后");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("视图渲染之后");
}
}
package com.example.client.config;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.example.client.entity.Actor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.accept.HeaderContentNegotiationStrategy;
import org.springframework.web.accept.ParameterContentNegotiationStrategy;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.*;
@Configuration
public class TestConfig implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
registry.addInterceptor(new LoginInterceptor())
//拦截所有请求
.addPathPatterns("/**")
//放行资源
.excludePathPatterns("/","/login");
}
}
第一次跳转到登陆界面 拦截住了
第二次在访问bb,就是显示内容了
我们来看下源码,进入DispatcherServlet类
在这里获取handler
根据当前请求,找到可以处理请求的handler以及handler的所有拦截器
会显示我们自定义的登陆拦截器
走到applyPreHandle 点进去
在这里会遍历所有的拦截器
然后走到interceptor.preHandle这里的时候,会进入我们的登陆拦截器
当返回false的时候会进入triggerAfterCompletion方法,倒叙
如果interceptorIndex 拦截器索引大于-1,那么就会进入这个循环
获取对应的拦截器进入afterCompletion方法