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] 或者租第三方阿里云。

相关推荐
小丁爱养花26 分钟前
Spring MVC:综合练习 - 深刻理解前后端交互过程
java·spring·mvc
是小崔啊1 小时前
Spring源码05 - AOP深入代理的创建
java·spring
马剑威(威哥爱编程)3 小时前
2025春招 SpringCloud 面试题汇总
后端·spring·spring cloud
小高不明7 小时前
仿 RabbitMQ 的消息队列3(实战项目)
java·开发语言·spring·rabbitmq·mybatis
Yeats_Liao8 小时前
Spring 框架:配置缓存管理器、注解参数与过期时间
java·spring·缓存
Yeats_Liao8 小时前
Spring 定时任务:@Scheduled 注解四大参数解析
android·java·spring
码明8 小时前
SpringBoot整合ssm——图书管理系统
java·spring boot·spring
荆州克莱9 小时前
微信小程序获取位置服务
spring boot·spring·spring cloud·css3·技术
程序猿零零漆9 小时前
SpringCloud系列教程:微服务的未来(十五)实现登录校验、网关传递用户、OpenFeign传递用户
spring·spring cloud·微服务
赵相机-9 小时前
Spring集成Redis|通用Redis工具类
spring boot·redis·spring