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

相关推荐
Listen·Rain4 小时前
向量化详解
java·人工智能·spring·机器学习·ai
添砖java_8575 小时前
网页聊天室测试报告
java·spring boot·spring·maven
xixingzhe26 小时前
Spring 依赖注入
java·后端·spring
闲猫15 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
醇氧1 天前
Spring 容器 Map 注入机制详解
java·后端·spring
ylscode1 天前
Cloudflare Workers Cache 深度解析:边缘缓存如何重塑无服务器性能边界
java·spring·mybatis
沉静的小伙1 天前
Spring事务
java·数据库·spring
Wang's Blog1 天前
Java框架快速入门: Spring Bean核心配置与实例化详解
java·开发语言·spring
爱敲代码的小鱼1 天前
springboot原理篇:
java·spring boot·spring
k↑1 天前
SpringCloud + React19 集成Scalar的API文档
后端·spring·spring cloud