springmvc中自定义拦截器、文件上传

版权声明:本站所提供的文章资讯、软件资源、素材源码等内容均为本作者提供、网友推荐、互联网整理而来(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考,如有侵犯您的版权,请联系我,本作者将在三个工作日内改正。 https://blog.csdn.net/weixin_42323802/article/details/84141617

声明,使用JDK8、maven3.5.4、idea2018.2、spring5.0.7

springmvc中的拦截器,用于拦截前端发起的请求;

当请求到达DispatcherServlet前端控制器,DispatcherServlet根据请求路径到HandlerMapping查询具体的Handler,从HandlerMapping返回的值是一个HandlerExecutionChain执行链,
执行链包含一个具体的Handler对象和Interceptors(拦截器集合、存在的话就包括)。

一、自定义拦截器MyInterceptor

步骤:
1、自定义一个拦截器实现interceptor接口;
2、把MyInterceptor添加到springmvc,在 springmvc-servlet.xml配置文件中配置自定义的拦截器,使其生效;

子模块目录结构:
是

自定义的拦截器MyInterceptor :

/**
 * @auther SyntacticSugar
 * @data 2018/11/16 0016下午 12:22
 */
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("prehandle....");
        return true;  //返回true  、放行;false时候直接afterCompletion   
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("posthandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("aftercompletion");
    }
}

添加MyInterceptor 到springmvc中;

/* 表示拦截单级资源路径,比如/hello
/** 表示拦截多个资源路径 ,比如 /hello/test1
/ 表示根目录下所有的资源 ,即该项目下所有的请求级别路径
访问url进行测试:http://localhost:8080/users

  <!-- 配置拦截器、可以配置多个 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.baidu.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

测试结果、自定义的interceptor生效:
真的烦

由 < mvc:interceptors> 可以看出,拦截器可以配置多个,同时,handler 返回的执行链 HandlerExecutionChain 中也可能包含多个interceptors;
可以配置多个interceptor、执行顺序如下;
/
->interceptor1—>interceptor2—>interceptor3---->interceptorN---->Controller处理业务
->Controller返回结果---->postHandleN—>postHandle3–postHandle2–>postHandle1
->postHandle1---->View视图处理器渲染---->把渲染结果返回
afterCompletionN–>afterCompletion3—>afterCompletion2—>afterCompletion1

当拦截器prehandle方法返回值false时候,interceptor不放行,直接返回afterCompletion:
bu

拦截器和过滤器的区别:

两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。
从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验

(1)、Filter需要在web.xml中配置,依赖于Servlet;
(2)、Interceptor需要在SpringMVC中配置,依赖于框架;
(3)、Filter的执行顺序在Interceptor之前;
参考博文 https://blog.csdn.net/zxd1435513775/article/details/80556034


上传文件:

上传文件的表单,提交方式一定要是POST;表单类型一定要是multipart/form-data,表示可以上传文件等二进制数据。
1、引入依赖、springmvc-servlet.xml中配置文件上传解析器;
2、写controller
3、使用postman进行测试、或者使用Advanced REST client:

依赖:

<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
</dependency>

配置springmvc-servlet文件:

    <!--配置文件  上传解析器 -->
    <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 配置默认编码、上传的大小 -->
        <property name="defaultEncoding" value="utf-8"/>
        <property name="maxUploadSize" value="10485760"/>
    </bean>

定义上传文件的参数为file类型;
@RequestParam注解,定义请求参数;

package com.baidu.controller;
/**
 * @auther SyntacticSugar
 * @data 2018/11/16 0016上午 11:55
 */
@Controller
public class UploadController {
    @RequestMapping("upload")
    public String upload(@RequestParam("file")MultipartFile file){
        if (file!=null) {
            try {
                file.transferTo(new File("D:/upload/"+file.getOriginalFilename()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //  上传成功转发至  success.html  页面
        return "redirect:success.html";
    }
}

发送post请求:
shiyong
status:200 OK ,请求成功:
大使馆和

猜你喜欢

转载自blog.csdn.net/weixin_42323802/article/details/84141617