首先我们要先创建一个拦截器。先附上代码:
@Component
public class LoginHandlerInterceptor implements HandlerInterceptor {
//目标方法执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("currentUser");
if (user == null) {
//未登录,返回登录页面
response.sendRedirect("/LoginError.html");
return false;
}else {
//放行
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
}
}
先创建一个HandlerInterceptor类并实现org.springframework.web.servlet.HandlerInterceptor
这个接口中的三个方法,通过方法名就可以看出三个方法分别可在要拦截的请求执行之前、中,后进行相关的处理。本例是对拦截url进行是否已经登录的拦截验证。注意还有一个@Component
注解不要忘记了。
拦截时的处理方式很简单,拦截时判断用户是否已经登录,如果登录了就放行,否则跳转回指定页面。
然后创建一个Config
来注册拦截器,代码如下:
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//所有的WebMvcConfigurerAdapter组件都会一起起作用
@Bean //将组件注册在容器中
public WebMvcConfigurer webMvcConfigurerAdapter(){
return new WebMvcConfigurer(){
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//静态资源; *.css,*.js
//SpringBoot已经做好了静态资源映射
// registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
// .excludePathPatterns("/index.html","/","/user/login","/static/**","/webjars/**");
// /** 表示拦截所有路径下的所有请求
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/person.html","/Person.html",
"/questionnaire.html","/Questionnaire.html",
"/result.html","/Result.html");
}
};
}
}
@Configuration
,@Bean
注解,org.springframework.web.servlet.config.annotation.WebMvcConfigurer
接口。
其中addInterceptor
方法用于把刚才创建的拦截器加入到registry中,addPathPatterns
用户加入所要拦截的url,/**
表示拦截所有请求。excludePathPatterns
添加不需要拦截的请求。
至此,一个拦截器就配置好了。如果需要配置多个拦截,只需要另外创建一个拦截器,给registry
再加一个inteceptor就可以了,不用再创建一个新的config配置类。