自定义配置扩展
mvc配置扩展
自定义视图解析器
- 自定义类实现WebMvcConfigurer接口
@Configuration //标识配置类
public class MyMvcConfig implements WebMvcConfigurer {
//注册自定义视图解析器
@Bean
public ViewResolver myViewResolver(){
return new MyViewResolver();
}
//自定义视图解析器类
public static class MyViewResolver implements ViewResolver{
@Override
public View resolveViewName(String s, Locale locale) throws Exception {
return null;
}
}
}
- 通过DispatcherServlet的doDispatch方法断点看this中自定义配置是否生效,所有mvc的请求都会经过该类的该方法
自定义拦截器
- 自定义类实现HandlerInterceptor接口,重写需要的方法
@Component
public class MyInterceptors implements HandlerInterceptor {
/**
* 预处理回调方法,都是在请求controller之前执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//每一个项目对于登陆的实现逻辑都有所区别,我这里使用最简单的Session提取User来验证登陆。
HttpSession session = request.getSession();
System.out.println("经过自定义拦截器--》"+session.getId());
//这里的User是登陆时放入session的
// User user = (User) session.getAttribute("user");
//如果session中没有user,表示没登陆
if (Object.class == null){
//这个方法返回false表示忽略当前请求,如果一个用户调用了需要登陆才能使用的接口,如果他没有登陆这里会直接忽略掉
//当然你可以利用response给用户返回一些提示信息,告诉他没登陆
return false;
}else {
return true; //如果session里有user,表示该用户已经登陆,放行,用户即可继续调用自己需要的接口
}
}
/**
* 后处理回调方法,实现处理器的后处理,但是要在渲染视图之前
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* 整个请求处理完毕回调方法,要在整个视图渲染完毕后回调
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
- mvc配置类中注册自定义拦截器,重写拦截器方法添加自定义拦截器
/**
* 扩展springmvc
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptors myInterceptors;
//重写拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("重写拦截器位置");
// addPathPatterns("/**") 表示拦截所有的请求
// excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
registry.addInterceptor(myInterceptors).addPathPatterns("/**").excludePathPatterns("/login", "/register");
// WebMvcConfigurer.super.addInterceptors(registry);
}
}