先上代码,后面细说
import com.seckill.handler.LoginHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import javax.annotation.Resource;
/**
* Mvc配置类
* @author: ty
* @create: 2021-02-05 21:06
**/
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Resource
private LoginHandler loginHandler;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册登录拦截器,这里添加你的拦截器(注意要么上面用@Resource依赖注入,要么new一个)
InterceptorRegistration registration = registry.addInterceptor(loginHandler);
//这里添加拦截地址,/**表示拦截所有地址
registration.addPathPatterns("/**");
//这里添加排除地址不拦截,一般就是登录地址、静态资源(重要)需要排除
registration.excludePathPatterns(
"/login/**",
"/static/**"
);
}
/**
*静态资源
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//添加静态资源访问地址,比如访问路径为“/static/js/test.js”等
registry.addResourceHandler("/static/**")
//添加本地资源实际存放的位置,这里表示存放地址一般就在/src/main/resource下的static文件夹
.addResourceLocations("classpath:/static/");
}
@Override
/**
*视图路径
*/
public void addViewControllers(ViewControllerRegistry registry) {
//这里表示,你访问“/”这个地址会跳到login.html这个页面
registry.addViewController("/").setViewName("login");
registry.addViewController("/login/toLogin").setViewName("login");
}
}
配置拦截器
比如常用的登录拦截器,有些页面必须访问过后才能访问,你就能在这里统一配置哪些地址需要拦截
1.创建拦截器,实现HandlerInterceptor接口,该接口有好几种方法,可以点进去查看它的定义,简单使用如下
@Component
public class LoginHandler implements HandlerInterceptor{
@Resource
StringRedisTemplate stringRedisTemplate;
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws IOException {
//这里进行是否登录的判断,return true那么就继续运行,false就不会跳转到相应的url
//如果需要跳转的登录界面,可以直接写
//response.sendRedirect(request.getContextPath()+"/login/toLogin");
}
}
2.见上述代码第一个方法,注册拦截器并配置拦截地址,注意第二个的静态资源配置(重要),需要排除静态资源,不然你把css等也拦截了就页面就没样式了。
静态资源配置
对于SpringBoot2.x版本来说,如果自定义实现了WebMvcConfigurer,那么一些默认的配置会失效,其中最重要的就是静态资源的访问路径。所以自己配置静态资源的访问路径和地址,不然会出现你的页面没有样式的情况。
另外需要在你的拦截器中排除你设置的静态资源访问路径
视图路径
视图就是你放在templates文件下的页面,一般我们像这样在controller设置页面路径
@RequestMapping("/goodsDetail")
public ModelAndView toGoodsDetail(){
如果你没有其他代码逻辑,就只是配置个访问路径,那就可以在上述第三个方法中配置