SpringBoot中拦截器的应用(简单易懂)调用service层报错解决方法
相信很多小伙伴都知道拦截器,了解拦截器的使用,懂得它的原理,也会有很多刚入门的小伙伴知道拦截器是个什么东西,但是不会使用,无从下手。这边文章教你使用拦截器,通过白话文的方式让你学会使用拦截器。
工作中遇到了一个问题,就是在每次请求请求之前,需要判断一下他是否是登录状态,然后是正常登录状态才可以请求成功,否则就不会请求到数据。
显然这个地方需要用到拦截器,在spring boot中不需要繁琐的配置文件,只需要注解就可以,很方便,比起ssm,spring那繁琐的配置令人吸啧啧啧,但谁不是从那一步走过来的呢。所以我下边要说的就是在spring boot中使用拦截器。
拦截器只需要两个Java文件就可以实现了。
1. 其中一个就是拦截器的配置文件,需要加注解@Configuration,相当于spring的xml文件,还需要继承WebMvcConfigurerAdapter类;
2. 另外一个就是拦截器的处理文件,需要继承HandlerInterceptorAdapter类 ;
代码附上:
LanConfiguration.java:(配置文件)
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class LanConfiguration extends WebMvcConfigurerAdapter {
//这个bean的作用是,在拦截器中可以调用service层的方法,没有这个配置,调用service时,会报null的错
@Bean
public LanSysInterceptor setBean2(){
//System.out.println("注入了handler");
return new LanSysInterceptor();
}
public void addInterceptors(InterceptorRegistry registry) {
//所有的请求都会被拦截
registry.addInterceptor(new LanSysInterceptor()).addPathPatterns("/**");
//除了/user/findUserPassword这个请求,其他所有的请求都会被拦截,
//registry.addInterceptor(setBean2()).addPathPatterns("/**").excludePathPatterns("/user/findUserPassword"); //对应的不拦截的请求;
}
}
LanSysInterceptor.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
public class LanSysInterceptor extends HandlerInterceptorAdapter {
/**
* 进入拦截器后首先进入的方法
* 返回false则不再继续执行
* 返回true则继续执行
*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)throws Exception
{
//System.out.println("我是拦截器:我证明我进来了"+map);
//自己的处理
return true;
}
/**
* 生成视图时执行,可以用来处理异常,并记录在日志中
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object arg2, Exception exception){
//自己的处理//
}
/** -
* 生成视图之前执行,可以修改ModelAndView
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2, ModelAndView arg3)
throws Exception{
//自己的处理//
}
}
至于原理是啥,为什么我就不说了,因为移行百度知晓所有
实操大于实践,前行仍需潜修