springmvc的拦截器,全局异常处理和文件上传

拦截器:

拦截不符合规则的,放行符合规则的。 等价于过滤器。

拦截器只拦截controller层API接口。

如何定义拦截器。

定义一个类并实现拦截器接口

复制代码
public class MyInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取session对象
        HttpSession session=request.getSession();
        //获取session当前用户的信息
        Object userinfo = session.getAttribute("userinfo");
        if(userinfo==null){
            //没有登录,跳转到登录页面
            response.sendRedirect("/login.jsp");
            return false;
        }
        return true; //如果返回值为true,表示拦截器放行。否则,拦截器不放行
    }
}

注册拦截器并配置拦截规则--springmvc配置文件中

复制代码
   <!--注册自定义拦截器以及拦截规则-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--path:拦截的路径 /**表示拦截多层路径-->
            <mvc:mapping path="/**"/>
            <!--排除的路径。-->
            <mvc:exclude-mapping path="/user/login"/>
             <!--放置自定义的拦截器类-->
            <bean class="com.aaa.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

全局异常处理

如果controller发生异常,我们需要对controller层中的所有方法都进行处理。这样比较麻烦。我们可以对所有controller中的接口提供一个统一的异常处理。

定义全局异常类

复制代码
//全局异常处理类.
@ControllerAdvice
public class MyGlobalException {
    @ExceptionHandler(Exception.class) //当发生Exception类型的异常会执行该方法,并异常对象传递给该方法的参数。
    @ResponseBody
    public String handlerException(Exception e){
        System.out.println(e.getMessage());
        System.out.println("错误~~~~~~~~~~~~~~~~~~~~~~~~~");
        return "error2222222222222222222222";//经过视图解析器: /views/error.jsp
    }
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public String handlerArithmeticException(Exception e){
        System.out.println("错误****************************");
        return "error2222222222222222222";
    }
​
}
​

注意:保证springmvc能够扫描到该异常处理类

复制代码
function loadEmp(){
        $.ajax({
            url:"/emp/list",
            type:"get",
            dataType:"json",
            //服务器响应成功
            success:function(data){
                console.log(data)
                var str="";
                for(var i=0;i<data.length;i++){
                    str+="<tr>"
                    str+="<td>"+data[i].empId+"</td>"
                    str+="<td>"+data[i].empName+"</td>"
                    str+="<td>"+data[i].empJob+"</td>"
                    str+="<td>"+data[i].empSalary+"</td>"
                    str+="<td>"+data[i].dept.deptName+"</td>"
                    str+="<td><a οnclick='deleteEmp("+data[i].empId+")'>删除</a><a οnclick='/views/update.jsp'>修改</a></td>"
                    str+="</tr>"
​
                }
                document.getElementById("empBody").innerHTML=str;
            },
            //服务器响应故障
            error: function (data){
                console.log(data);
            }
        })
    }

文件上传

原理

完成文件上传--本地服务器保存

引入文件上传的依赖jar

复制代码
    <!--文件上传依赖-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.5</version>
    </dependency>

配置文件上传解析器

复制代码
 <!--文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--最大上传的大小。单位byte字节。5M=5*1024*1024-->
        <property name="maxUploadSize" value="5242880"/>
        <!--设置文件上传的编码-->
        <property name="defaultEncoding" value="utf-8"/>
    </bean>

编写文件上传的页面

复制代码
   <%--文件上传的表单提交方式必须为post.而且需要设置表单提交的编码格式。enctype="multipart/form-data" 该类型表示既能上传文本又能上传文件。--%>
   <form action="/upload" method="post" enctype="multipart/form-data">
      选择文件:<input type="file" name="myfile"/><br>
      姓名:<input type="text" name="username"/><br>
      <input type="submit"/>
   </form>

编写上传的api接口

复制代码
  @RequestMapping("/upload")
    public String upload(MultipartFile myfile, HttpServletRequest request) throws IOException {
        //1.获取保存文件的路径
        String realPath = request.getSession().getServletContext().getRealPath("/images");
        //2.根据上面的路径创建文件对象
        File file=new File(realPath);
        //3.判断该文件夹是否存在
        if(!file.exists()){
            file.mkdirs();
        }
        //4.获取上传文件的名称. 获取登录者ip+登录者id+登录者的时间戳
        String filename = UUID.randomUUID().toString().replace("-","")+myfile.getOriginalFilename();
        //5.把上传的文件保存到指定服务器下的路径。
        File target=new File(realPath+"/"+filename);
        myfile.transferTo(target);
        System.out.println("上传成功");
        return "main";
    }

完成文件上传--文件保存到文件服务器

如果把文件存在本地服务器,服务器与服务器之间无法共享文件。我们需要一个专门存放文件的服务器。

可以自己搭建文件服务器[FastDFS Hadoop] 或者租第三方阿里云。

相关推荐
小兔兔吃萝卜3 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
AAA修煤气灶刘哥4 小时前
面试官: SpringBoot自动配置的原理是什么?从启动到生效,一文讲透
后端·spring·面试
qq_三哥啊6 小时前
【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
spring·intellij-idea·mybatis
别惹CC7 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
寒士obj7 小时前
Spring事物
java·spring
IT毕设实战小研15 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
甄超锋16 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
Java小白程序员20 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
甄超锋20 小时前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven
还是鼠鼠21 小时前
tlias智能学习辅助系统--Maven 高级-私服介绍与资源上传下载
java·spring boot·后端·spring·maven