栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【SpringMVC拦截器】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【SpringMVC拦截器】

目录
  • 拦截器
    • 拦截器的配置
  • 异常处理器
    • 基于配置的异常处理
    • 基于注解的异常处理
  • 注解配置SpringMVC
    • 创建初始化类,代替web.xml
    • 创建SpringConfig配置类,代替spring的配置文件
    • 创建WebConfig配置类,代替SpringMVC的配置文件
    • 测试功能
  • SpringMVC执行流程
    • SpringMVC常用组件
    • DispatcherServlet初始化过程

拦截器

一、过滤器作用域浏览器到dispatch之间,在springMVC中,dispatchservlet接收到请求后,会对请求进行处理,根据当前请求信息跟请求映射requestMapping进行匹配,找到相对应的请求映射,请求映射对应的控制器方法就是处理请求的方法,所以dispatchservlet会去调用controller,拦截器作用于控制器执行前后。
二、SpringMVC中的拦截器用于拦截控制器方法的执行,需要实现HandlerInterceptor

拦截器的配置

一、新建springMVC-demo5项目,在html页面测试拦截器:测试拦截器

二、SpringMVC的拦截器必须在SpringMVC的配置文件中的mvc:interceptors标签中进行配置,该标签中可以写ref、bean、interceptor标签,前两个是一样的:

  1. 一个Bean代表IOC中一个组件、一个对象,在mvc:interceptors标签中配置bean标签,表示某一个类型的对象就是一个拦截器:,但是像这样写会拦截所有的请求
  2. ref可以引用当前IOC容器中某个bean的ID,所以我们可以在ref标签中引用某个拦截器bean的id:,但是像这样写也会拦截所有的请求
@Component// 把拦截器交给IOC管理,通过标识组件的方式,将拦截器标识为一个bean
public class FirstInterceptor implements HandlerInterceptor {
//    控制器方法执行之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("FirstInterceptor-->preHandle");
        return true;// 返回true表示放行,返回false表示拦截
    }

//    控制器方法执行之后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("FirstInterceptor-->postHandle");
    }

//    在视图渲染之后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("FirstInterceptor-->afterCompletion");
    }
}
  1. mvc:mapping的path可以设置需要拦截的路径, @Override protected Class[] getRootConfigClasses() { return new Class[]{SpringConfig.class};// 将spring的配置类放在数组中 } @Override protected Class[] getServletConfigClasses() { return new Class[]{WebConfig.class};// 将springMVC的配置类放在数组中 } @Override protected String[] getServletMappings() { return new String[]{"/"};// 把要配置的url-pattern放在String[]数组中返回 } @Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();// 创建一个过滤器对象 // 设置初始化参数 characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceResponseEncoding(true); HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter(); // 可以创建多个过滤器,然后将它们放在Filter[]数组中返回即可 return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter}; } } 创建SpringConfig配置类,代替spring的配置文件

    新建spring的配置类src/main/java/com/atguigu/mvc/config/SpringConfig.java,代码如下

    @Configuration// 标识这个类是配置类
    public class SpringConfig {//ssm整合之后,spring的配置信息写在此类中}
    
    创建WebConfig配置类,代替SpringMVC的配置文件

    一、新建springMVC的配置类src/main/java/com/atguigu/mvc/config/WebConfig.java来代替SpringMVC的配置文件,WebConfig需要完成以下功能:扫描组件、视图解析器、view-controller、default-servlet-handler、mvc注解驱动、文件上传解析器、异常处理、拦截器
    二、创建拦截器:新建src/main/java/com/atguigu/mvc/interceptor/TestInterceptor.java文件,代码如下:

    public class TestInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("TestInterceptor-->preHandle");
            return true;
        }
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
    }
    

    三、WebConfig.java代码如下:

    @Configuration//将当前类标识为一个配置类
    @ComponentScan("com.atguigu.mvc.controller")//1、扫描组件
    @EnableWebMvc//5、mvc注解驱动
    public class WebConfig implements WebMvcConfigurer {
        //4、default-servlet-handler
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();// 默认的servlet可用
        }
    
        //8、拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            TestInterceptor testInterceptor = new TestInterceptor();
            // addPathPatterns添加拦截路径,用来配置拦截路径
            registry.addInterceptor(testInterceptor).addPathPatterns("/**");
        }
    
        //3、view-controller
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/hello").setViewName("hello");
        }
    
        //6、文件上传解析器
        @Bean// 加上这个注解,方法的返回值就是IOC容器的一个bean
        public MultipartResolver multipartResolver(){
            CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
            return commonsMultipartResolver;
        }
    
        //7、异常处理
        @Override
        public void configureHandlerExceptionResolvers(List resolvers) {
            SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
            Properties prop = new Properties();
            prop.setProperty("java.lang.ArithmeticException", "error");// 设置键值对
            exceptionResolver.setExceptionMappings(prop);// 设置异常映射
            exceptionResolver.setExceptionAttribute("exception");// 设置在请求域中共享的错误信息的键
            resolvers.add(exceptionResolver);
        }
    
        //配置生成模板解析器
        @Bean
        public ITemplateResolver templateResolver() {
            WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
            // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得
            ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(
                    webApplicationContext.getServletContext());
            templateResolver.setPrefix("/WEB-INF/templates/");// 调用属性的set方法来为属性赋值
            templateResolver.setSuffix(".html");
            templateResolver.setCharacterEncoding("UTF-8");
            templateResolver.setTemplateMode(TemplateMode.HTML);
            return templateResolver;
        }
    
        //生成模板引擎并为模板引擎注入模板解析器
        @Bean
        public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
            // 当前参数类型是什么,spring会在IOC容器中找到一个bean,来为我们当前的参数赋值,所以参数就相当于我们之前讲过的自动装配
            // 所以形参必须是能进行自动装配的,必须是当前spring的IOC容器中所拥有的bean,这个bean能为这个参数赋值的情况下,我们才能加这个参数
            SpringTemplateEngine templateEngine = new SpringTemplateEngine();
            templateEngine.setTemplateResolver(templateResolver);
            return templateEngine;
        }
    
        //生成视图解析器并未解析器注入模板引擎
        // SpringTemplateEngine是上一个方法的返回值,所以有bean来为templateEngine参数赋值
        @Bean
        public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
            ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
            viewResolver.setCharacterEncoding("UTF-8");
            viewResolver.setTemplateEngine(templateEngine);
            return viewResolver;
        }
    }
    
    测试功能
    @RequestMapping("/")
    public String index(){
    	return "index";
    }
    

    可正常访问页面

    SpringMVC执行流程 SpringMVC常用组件

    一、DispatcherServlet:前端控制器,不需要工程师开发,由框架提供
    作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求
    二、HandlerMapping:处理器映射器,不需要工程师开发,由框架提供
    作用:根据请求的url、method等信息查找Handler,即控制器方法,就是将请求与控制器方法进行映射
    三、Handler:处理器,需要工程师开发,即控制器
    作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理
    四、HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供
    作用:通过HandlerAdapter对处理器(控制器方法)进行执行,用来调用相对应的控制器方法
    五、ViewResolver:视图解析器,不需要工程师开发,由框架提供
    作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView
    六、View:视图
    作用:将模型数据通过页面展示给用户

    DispatcherServlet初始化过程

    DispatcherServlet 本质上是一个 Servlet,所以天然的遵循 Servlet 的生命周期。所以宏观上是Servlet生命周期来进行调度。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020128.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号