拦截器配置
1、创建类LoginInterceptor实现接口HandlerInterceptor(根据自身情况,在需要的位置设置需要的拦截条件):
package com.intercepter;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* @classname: LoginInterceptor
* @description: 登录拦截
* @create: 2022/07/06
*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* Controller逻辑执行之前
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("preHandle");
//获取当前路径
HttpSession session = request.getSession();
String username = (String) session.getAttribute("username");
if (StringUtils.isEmpty(username)) {
throw new RuntimeException("no login");
}
return true;
}
/**
* Controller逻辑执行完毕但是视图解析器还未进行解析之前
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
}
/**
* Controller逻辑和视图解析器执行完毕
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion...");
}
}
2、注册拦截器(可根据具体的情况设置需要拦截的路径与不需要拦截的路径):实现
WebMvcConfigurer接口,使用注解@Configuration
package com.config;
import com.intercepter.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @classname: LoginConfig
* @description: 配置拦截路径和排除登录需访问路径
* @create: 2022/07/06
*/
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/list");
}
}
注意:1、启动类所在的包路径为注册拦截器配置类所在的包路径同级或父级(例如下面例子),否则拦截器会失效(对于拦截器失效,有网友说在启动项DemoApplication的@MapperScan注解中添加LoginConfig文件所在的包路径,我测试了将启动项DemoApplication放在demo包路径下,拦截器没有效果)
2、(网友记录的内容,当前没有遇见,先记录一下):
如果同时配置一个类继承WebMvcConfigurationSupport和一个类实现
WebMvcConfigurer或者WebMvcConfigurerAdapter,就会导致只有一个生效。
解决办法:将这些配置都在一个类中设置