自定义配置扩展

自定义配置扩展

mvc配置扩展

自定义视图解析器

  1. 自定义类实现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;
        }
    }
}
  1. 通过DispatcherServlet的doDispatch方法断点看this中自定义配置是否生效,所有mvc的请求都会经过该类的该方法

自定义拦截器

  1. 自定义类实现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);
    }
}
  1. 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);
       }
   
   }
posted @ 2021-07-05 22:01  幸运刘  阅读(38)  评论(0)    收藏  举报