SpringBoot的Web开发入门案例7—WebMvcConfigurer配置类
WebMvcConfigurer接口的几个常用方法:
- addViewControllers:配置请求路径和页面的映射(页面跳转)
- addResourceHandlers:添加静态资源文件映射
- addInterceptors:添加拦截器
WebMvcConfigurer配置类是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架的个性化配置
使用方法
创建MyWebMvcConfig配置类,该类需继承 WebMvcConfigurer 接口。
package com.blu.conf;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.blu.interceptor.LoginInterceptor;
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer{
/**
* 配置请求路径和页面的映射
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/toLogin").setViewName("login");
}
/**
* 添加静态资源文件映射
* 默认的静态资源文件都必须放在resources/static/目录下才可以访问
* 通过重写该方法,resources/img下的资源文件就可以访问了
* 该配置与框架中的自定义配置不冲突,两者会同时有效。
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/img/**").addResourceLocations("classpath:/img/");
}
/**
* 配置拦截器
*
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器并排除无需拦截的路径
String[] excludePaths = {"/toLogin","/webjars/**","/login"};
registry.addInterceptor(new LoginInterceptor()).excludePathPatterns(excludePaths);
}
}
addViewControllers 方法实现请求路径和页面的映射:
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/toLogin").setViewName("login");
}
该方法与Controller类中的以下方法等价:
@GetMapping("/toLogin")
public String toLogin() {
return "login";
}
addResourceHandlers 方法用于添加静态资源文件的映射,在SpringBoot的Web开发入门案例1中,main.html 页面中的图片必须放在 resources/static 目录下才可以访问到。
将案例1中的static目录下的img文件夹及子图片文件直接移至resources目录下,再通过该方法的配置:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/img/**").addResourceLocations("classpath:/img/");
}
main.html就可以访问图片资源文件了。
注:
addResoureHandler:指的是对外暴露的访问路径
addResourceLocations:指的是内部文件放置的目录
即,通过/img/**请求可访问到classpath下的img文件夹中的文件。
addInterceptors 方法用于配置拦截器。主要用途有:进行用户登录状态的拦截,日志的拦截等。
以用户登录状态的拦截为例:
- 修改Controller类中的login方法,添加保存用户名Session的逻辑:
@PostMapping("/login")
public String login(String loginName,String password, Model model, HttpSession session) {
if(loginName.equals("admin")&&password.equals("123456")) {
session.setAttribute("user", loginName);
return "redirect:/main";
}else {
model.addAttribute("errorMsg","用户名或密码错误");
return "login";
}
}
- 创建LoginInterceptor拦截器类:
package com.blu.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//获取session中用户的信息
HttpSession session = request.getSession();
String uname = (String) session.getAttribute("user");
if(uname==null) {
response.sendRedirect("/toLogin");
return false;
}
return true;
}
}
- 在MyWebMvcConfig类中重写addInterceptors方法,添加登录拦截器LoginInterceptor:
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器并排除无需拦截的路径
String[] excludePaths = {"/toLogin","/webjars/**","/login"};
registry.addInterceptor(new LoginInterceptor()).excludePathPatterns(excludePaths);
}
该拦截器需要排除对"/toLogin","/webjars/**","/login"这三个请求路径的拦截。
- 重启项目,在未登录的状态下直接访问:http://localhost:9000/toLogin,将会被拦截跳转至登录页面。
补充:
addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
addPathPatterns:用于设置拦截器的过滤路径规则
addPathPatterns("/")**:指对所有请求都拦截
excludePathPatterns:用于设置不需要拦截的过滤规则