SpringMVC拦截器,上传,下载

SpringMVC拦截器,上传,下载
SpringMVC拦截器  基于反射,和sprig结合紧密,可以拿到ioc 容器的bean,不是基于servlet的,只会拦截springMVC请求
JSP里的过滤器  依赖于servlet  基于函数回调,基本拦截所有请求

SpringMVC拦截器(interceptor)
这篇博客的demo是基于我上一遍博客(SpringMVC 接受、处理Json,fastjson解析json,用Postman4发送json数据)的demo  感兴趣的朋友可以去看看

1.新建类SpringInterceptor  继承 HandlerInterceptor

public class SpringInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
            //请求发往controller之前就执行这个函数了,返回true 才会执行controller,假如这个函数返回的是false  那么请求就此中断,要返回true,请求才会继续执行下去
        //拦截用户请求是否合法  是否有违规字符  是否有sql注入
 //自己加判断   符合条件之后就返回true 

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
                //controller处理完之后,调用这个函数
        System.out.println("请求执行了");

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
            //请求完成后调用这个函数
        System.out.println("请求处理完了");

    }
}

2.在spring-mvc.xml声明SpringMVC拦截器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.0.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

        <!--加载解析json的组件   配置消息转换器-->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <!--这里顺序不能反,一定要先写text/html  不然ie下会出现下载提示-->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!--注意这里的顺序  一定要加载解析json的组件先加载  再开启springmvc的注解驱动  否则会报错,编译器也不会提示错误,很蛋疼-->
    <!--开启springmvc的注解驱动-->
    <mvc:annotation-driven/>
    <!--配置包扫描-->
    <context:component-scan base-package="com.dengweiquan.**" />


    <!--配置viewResolver(视图解析器)-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--getrequestdispature的时候要填的前缀  和后准都自动填好  注意斜号很关键 漏填个斜号都会错-->
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
        <!--jsp要用到jstl-->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
     </bean>
    <!--声明SpringMVC拦截器-->
    <mvc:interceptors>
        <!--拦截所有请求-->
        <!--<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>-->
        <!--拦截demo路径的请求   意思是只有请求demo路径的才能进到拦截器 -->
        <mvc:interceptor>
            <mvc:mapping path="/user/demo"/>
            <bean class="com.dengweiquan.interceptor.SpringInterceptor"/>
        </mvc:interceptor>

    </mvc:interceptors>

</beans>

访问  localhost:8080/user/demo  
会输出:
请求执行了
请求处理完了


SpringMVC的文件上传和下载 :
文件上传和下载都是死套路,大体都是差不多的
引入第三方包:
commons-fileupload-1.3.1
commons-io-2.4

1.在SpringMVC配置文件上传
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.0.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

        <!--加载解析json的组件   配置消息转换器-->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <!--这里顺序不能反,一定要先写text/html  不然ie下会出现下载提示-->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!--注意这里的顺序  一定要加载解析json的组件先加载  再开启springmvc的注解驱动  否则会报错,编译器也不会提示错误,很蛋疼-->
    <!--开启springmvc的注解驱动-->
    <mvc:annotation-driven/>
    <!--配置包扫描-->
    <context:component-scan base-package="com.dengweiquan.**" />


    <!--配置viewResolver(视图解析器)-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--getrequestdispature的时候要填的前缀  和后准都自动填好  注意斜号很关键 漏填个斜号都会错-->
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
        <!--jsp要用到jstl-->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
     </bean>
    <!--声明SpringMVC拦截器-->
    <mvc:interceptors>
        <!--拦截所有请求-->
        <!--<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>-->
        <!--拦截demo路径的请求   意思是只有请求demo路径的才能进到拦截器 -->
        <mvc:interceptor>
            <mvc:mapping path="/user/demo"/>
            <bean class="com.dengweiquan.interceptor.SpringInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

       <!--这个bean的id="multipartResolver"  一定不能写错,因为有专门处理文件上传的这个类-->
    <bean  id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--文件上传的过程中,在内存中可以占用多少 -->
        <property name="maxInMemorySize"  value="500000"/>
        <!--上传文件时最大不能超过多少-->
        <property name="maxUploadSize"  value="500000"/>
        <!--设置编码-->
        <property name="defaultEncoding" value="UTF-8" />

    </bean>
</beans>

2.修改UserController
@Controller
@RequestMapping("user")
public class UserController {

    //假如是@RequestMapping("/test",method=RequestMethod.GET)  限制前端的请求,意思是前端只能发送GET请求
    //假如是@RequestMapping("/test",method=RequestMethod.POST)  意思是前端只能发送POST请求
    //要加上@RequestBody  才能json自动转对象
    @RequestMapping("/test")
    public String  testUser(@RequestBody User user)   {

        return   "user";
    }
    @RequestMapping("/demo")
    public String demoUser(){


        //返回userspringmvc自动帮你加好了前后缀  就是我们要去的user.jsp   在viewResolver哪里已经配置好了路径的前后缀
        return "demo";
    }

    @RequestMapping("/upload")
    public String upload(MultipartFile file,HttpServletRequest request) throws IOException {
        //拿到file的名称
        String name=file.getOriginalFilename();
        //拿到文件之后   存放在服务器的根目录下面
        File uploadF=new File("/"+name);
        file.transferTo(uploadF);
        return "demo";
    }

}


3.修改demo.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
这里是demo.jsp
<%--这里form表单里的input标签里的name  一定要是file   因为Controller里的upload方法里的MultipartFile的参数是file--%>
<form  method="post" action="/user/upload"  enctype="multipart/form-data">
    <input type="text" name="id"/>
    <input type="file" name="file"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

提交之后
上传成功   完结撒花O(∩_∩)O

SpringMVC下载:
1.修改UserController
@Controller
@RequestMapping("user")
public class UserController {

    //假如是@RequestMapping("/test",method=RequestMethod.GET)  限制前端的请求,意思是前端只能发送GET请求
    //假如是@RequestMapping("/test",method=RequestMethod.POST)  意思是前端只能发送POST请求
    //要加上@RequestBody  才能json自动转对象
    @RequestMapping("/test")
    public String  testUser(@RequestBody User user)   {
        return   "user";
    }
    @RequestMapping("/demo")
    public String demoUser(){

        //返回userspringmvc自动帮你加好了前后缀  就是我们要去的user.jsp   在viewResolver哪里已经配置好了路径的前后缀
        return "demo";
    }

    @RequestMapping("/upload")
    public String upload(MultipartFile file,HttpServletRequest request) throws IOException {
        //拿到file的名称
        String name=file.getOriginalFilename();
        //拿到文件之后   存放在服务器(我的本地磁盘)的根目录下面
        File uploadF=new File("C:\\Users\\邓伟权\\IdeaProjects\\"+name);
        //倘若是多文件上传,则设置demo.jsp里的form表单多个input的file标签  然后设MultipartFile为数组  再用for循环取出

        file.transferTo(uploadF);
        return "demo";
    }

        //文件下载   返回的是个二进制流
    @RequestMapping("/download")
    public ResponseEntity<byte[]> download() throws IOException {
        //要下载的文件所在服务器(我的本地磁盘)路径
        String path="D:/123.jpg";
        File file=new File(path);
        //通过控制HTTP头(涉及到HTTP协议)来下载
        HttpHeaders  headers=new HttpHeaders();
        headers.setContentDispositionFormData("attachment",path);
        headers.setContentType(MediaType.IMAGE_JPEG);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
    }

}

修改demo.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
这里是demo.jsp
<%--这里form表单里的input标签里的name  一定要是file   因为Controller里的upload方法里的MultipartFile的参数是file--%>
<form  method="post" action="/user/upload"  enctype="multipart/form-data">
    <input type="text" name="id"/>

    <input type="file" name="file"/>
    <input type="submit" value="提交"/>
</form>

<a href="/user/download">点击我会下载图片呦!</a>
</body>
</html>

访问localhost:8080/user/download  点那个超链接  浏览器会提示下载了 
至于下载的图片为啥无法显示  我也没找到问题   希望知道的朋友可以说下给我听- -...












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值