1.创建一个自定义的类,让其实现HandlerInterceptor这个接口,那摩这个类就是一个拦截器
@Component
public class AlphaInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(AlphaInterceptor.class);
// 在Controller之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug("preHandle:"+handler.toString());
return true;
}
// 在Controller之后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.debug("postHandle"+handler.toString());
}
// 在templateEngine之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.debug("afterCompletion"+handler.toString());
}
}
那摩每次请求被拦截之后就会进入到该拦截器方法里面来
2.定义一个配置类,实现WebMvcConfigurer接口,通过该类来实现对拦截器的使用,让其指定拦截哪些请求
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private AlphaInterceptor alphaInterceptor;
@Autowired
private LoginTicketInteceptor loginTicketInteceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginTicketInteceptor)
.excludePathPatterns("/**/*.css","/**/*.css","/**/*.jpg","/**/*.jpeg") // 不拦截这些资源
.addPathPatterns("/"); // 拦截这个请求 // 不写默认拦截所有请求
}
}
3.下面定义一个拦截器来实现用户登录,没登录的用户被拦截,重定向到登录页面中
package com.cd.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//继承了这个接口,那摩该类就变成了一个拦截器
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登陆成功后,应该有用户的session
Object loginUser = request.getSession().getAttribute("loginUser");
if(loginUser==null){
//说明没有登陆
request.setAttribute("msg","没有权限,请先登陆");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}
else {
return true;
}
}
}
4.对拦截器配置,拦截如下请求
package com.cd.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//这个类是我们自己配置的
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
//视图跳转
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/main.html").setViewName("dashboard");
}
//自定义的国际化就生效了
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
@Override
//添加一个拦截器 HandlerInterceptor
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns("/**")拦截所有的请求
// excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**","/img/**"); 不包括哪些请求
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**","/img/**");
}
}
至此,基本功能已经实现