springmvc(三)

一、跨域请求

域:由ip/域名:端口组成,就是提供一个网络服务

localhost:8080 一个域
​ 127.0.0.1:8080 一个域
​ 10.8.163.53:8080 一个域
localhost:8085 一个域
以上都不是同一个域

什么是跨域请求?

就是在一个域下的服务/网页 通过Ajax等工具访问 另外一个 域下的请求 就是跨域,tomcat服务器为了保证安全,默认情况下不允许跨域请求

在这里插入图片描述

第一步:在loalhost:8080 创建服务,允许跨域

/**
 * 跨域请求
 */
@RestController
@CrossOrigin(origins = "http://localhost:8085") //允许另外一个域对应的网页中ajax 访问 注意最后不要加
// /标记在类上 表明当类下所有的处理器都允许 http://localhost:8085下 的界面发起跨域请求
public class CrossOriginController {


    @RequestMapping("/findStudentById")
    public Student findStudentById(int id){

        Student student = new Student();
        student.setSex("F");
        student.setId(id);
        student.setName("XXX");

        return student;
    }

}

第二步:另一域中 localhost:8085 创建html 发起跨域请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script src="/js/jquery-3.3.1.js"></script>
</head>
<body>

<button onclick="getStudentById()">获取学生 id=1</button>

<script>

    /*
    * 此时   $.ajax  请求 和  当前  html/crossorgin.html 处于同一域下
    * http://localhost:8080/findStudentById?id=1    html/crossorgin.html 处于同一域下
    *
    *
    *
    *  */
    function getStudentById(){
        $.ajax({
            url:"http://localhost:8080/findStudentById?id=1",
            type:'get',//
            success:function (data) {

                alert(data)
            },
            error:function () {
                alert("服务器错误")
            },
            dataType:'json'
        })
    }
</script>
</body>
</html>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、文件上传下载

文件上传

使用表单上传

多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单,而该表单必须满足以下3个条件:
-form表单的method属性设置为post;
-form表单的enctype属性设置为multipart/form-data;
-提供的文件上传输入框。

<!--
    上传文件
           1.method="post"
           2.enctype="multipart/form-data"
           3.<input type="file" name="file">
-->
<form action="/xx" method="post" enctype="multipart/form-data">
    
    文件名:<input type="text" name="filename"><br>
    文件:<input type="file" name="file">
    
    <input type="submit" value="上传">
    
</form>

处理器接收文件

当form表单的enctype属性为multipart/form-data时,浏览器就会采用二进制流来处理表单数据,服务器端就会对文件上传的请求进行解析处理。Spring MVC通过MultipartResolver实现文件上传功能。MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipartResolver来完成文件上传工作。

1、导入依赖


    <!--文件上传依赖-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
    </dependency>

2、在springmvc-servlet.xml 添加

 <!--
           配置文件大小 字节   <property name="maxUploadSize" value="1024000000"></property>
           编码格式          <property name="defaultEncoding" value="utf-8"></property>
           
           id 必须为 multipartResolver
    -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <property name="defaultEncoding" value="utf-8"></property>
        <property name="maxUploadSize" value="1024000000"></property>
    </bean>

3、接收文件

/**
     * 接收文件
     *
     *  List<MultipartFile> file 对应 form <input type="file" name="file">
     * @param filename
     * @param file
     * @return
     */
    @RequestMapping("/fileUpload")
    @ResponseBody  // 返回json 字符串
    public String fileUpload(String filename, List<MultipartFile> files) throws IOException {

        System.out.println("filename = " + filename);

        if (files==null || files.size()==0){

            return "error";
        }

        for (MultipartFile multipartFile:files){

            File rootFile = new File("c:/java2102");

            if (!rootFile.exists()){// 如果文件不存在
                rootFile.mkdirs(); // 创建文件夹
            }

            // 得到文件上传的名字
           String realName =   multipartFile.getOriginalFilename();
            // UUID.randomUUID().toString() 唯一字符串 防止文件 被覆盖
            //  File.separator  /
            File file = new File("c:/java2102"+File.separator + UUID.randomUUID().toString() +realName);
           // 将接收到的文件保存到本地磁盘
            multipartFile.transferTo(file);
        }

        return "success";
    }

文件下载

在后台使用Spring MVC提供的ResponseEntity类型对象完成文件下载,使用它可以很方便的定义返回的HttpHeaders对象和HttpStatus对象,通过对这两个对象的设置,即可完成下载文件时所需的配置信息。

在这里插入图片描述

 /**
     * 文件下载
     * @param filename
     * @return
     * @throws IOException
     */
    @RequestMapping("/downloadFile")
    public ResponseEntity<byte[]> downloadFile(String filename,HttpServletRequest request) throws Exception {


        File file = new File("c:/java2102"+File.separator +filename);

        HttpHeaders headers = new HttpHeaders();

        // 设置下载的文件名称
        // 对应文件名称重编码  让浏览器识别
        headers.setContentDispositionFormData("attachment",getFilename(request,filename));
        // 通知浏览器以下载的形式 打开文件
        //浏览器以 二进制文件流 下载文件
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);


//        (@Nullable T body,
//        @Nullable MultiValueMap<String, String> headers, Object status
        return new ResponseEntity<>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
    }

解决中文文件名乱码问题:

 /**
     * 根据浏览器的不同进行编码设置,返回编码后的文件名
     */
    public String getFilename(HttpServletRequest request,
                              String filename) throws Exception {
        // IE不同版本User-Agent中出现的关键词
        String[] IEBrowserKeyWords = {"MSIE", "Trident", "Edge"};
        // 获取请求头代理信息
        String userAgent = request.getHeader("User-Agent");
        for (String keyWord : IEBrowserKeyWords) {
            if (userAgent.contains(keyWord)) {
                //IE内核浏览器,统一为UTF-8编码显示
                return URLEncoder.encode(filename, "UTF-8");
            }
        }
        //火狐等其它浏览器统一为ISO-8859-1编码显示
        return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
    }

拦截器

拦截器:就是springmvc可以拦截过滤前端的请求,和过滤器的作用一样,但是拦截器只对经过Dispathcher的请求有效

拦截器 过滤器 Aop:抽取公共代码 拦截 过滤 鉴权
事务:只能用aop

springmvc 拦截器的实现:

第一种方式:通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。

第一种方式: 通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。

示例

1、实现HandlerInterceptor接口

/**
 * 继承HandlerInterceptor 实现 拦截器
 *
 *
 */
public class CustomerInterceptor implements HandlerInterceptor {

    @Override// 在处理器之前调
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("CustomerInterceptor ----preHandle 请求前");


        String idStr = request.getParameter("id");

        if (idStr!=null){
            int id = Integer.valueOf(idStr);

            if (id>0){ // 如果大于放行
                return true;
            }
        }

        // 拦截
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("被拦截了");
        return false;


    }

    @Override// 处理器 响应请求后
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        System.out.println("CustomerInterceptor ----postHandle 处理器响应请求后");
    }

    @Override //整个 请求响应成功之后调用  渲染成功之后
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        System.out.println("CustomerInterceptor ----afterCompletion 处理器响应前端完成渲染成功  后");
    }
}
public class MyInterceptor1 implements HandlerInterceptor {

    @Override// 在处理器之前调
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("MyInterceptor1 ----preHandle 请求前");


    // 放行
        return true;


    }

    @Override// 处理器 响应请求后
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        System.out.println("MyInterceptor1 ----postHandle 处理器响应请求后");
    }

    @Override //整个 请求响应成功之后调用  渲染成功之后
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        System.out.println("MyInterceptor1 ----afterCompletion 处理器响应前端完成渲染成功  后");
    }
}

声明拦截器

  <!--
        配置拦截器

        拦截器的顺序有 声明标签的顺序决定:越靠上越优先
    -->
    <mvc:interceptors>
        <!--  声明一个全局拦截器 对所有的请求 进行拦截-->
       <!-- <bean class="com.qfedu.filter.CustomerInterceptor"></bean>-->
        
        <mvc:interceptor>
            <!-- 配置局部拦截器 只对部分
             /student/** 拦截
             忽略    /student/findAllStudent
             -->
            <mvc:mapping path="/student/**"/>
            <mvc:exclude-mapping path="/student/findAllStudent"/>
            <bean class="com.qfedu.filter.MyInterceptor1"></bean>
        </mvc:interceptor>

        <mvc:interceptor>
            <!-- 局部拦截器  三者之间有顺序规定 必须先
              <mvc:mapping
              <mvc:exclude-mapping
               <bean
            -->
            <mvc:mapping path="/findStudentById"/>
            <bean class="com.qfedu.filter.CustomerInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

拦截器顺序优先级

在这里插入图片描述

原文地址:https://blog.csdn.net/xue_yun_xiang/article/details/116806720

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


开发过程中是不可避免地会出现各种异常情况的,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中,合理处理异常、避免异常产生、以及对异常进行有效的调试是非常重要的。 对于异常的处理,一般分为两种方式: 编程式异常处理:是指在代
说明:使用注解方式实现AOP切面。 什么是AOP? 面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。 AOP底层使用动态代理。 AOP术语 连接点
Spring MVC中的拦截器是一种可以在请求处理过程中对请求进行拦截和处理的机制。 拦截器可以用于执行一些公共的操作,例如日志记录、权限验证、数据转换等。在Spring MVC中,可以通过实现HandlerInterceptor接口来创建自定义的拦截器,并通过配置来指定拦截器的应用范围和顺序。 S
在 JavaWeb 中,共享域指的是在 Servlet 中存储数据,以便在同一 Web 应用程序的多个组件中进行共享和访问。常见的共享域有四种:ServletContext、HttpSession、HttpServletRequest、PageContext。 ServletContext 共享域:
文件上传 说明: 使用maven构建web工程。 使用Thymeleaf技术进行服务器页面渲染。 使用ResponseEntity实现下载文件的功能。 @Controller public class FileDownloadAndUpload { @GetMapping(&quot;/file/d
创建初始化类,替换web.xml 在Servlet3.0环境中,Web容器(Tomcat)会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。 Spring提供了这个接口的实现,名为SpringS
在 Web 应用的三层架构中,确保在表述层(Presentation Layer)对数据进行检查和校验是非常重要的。正确的数据校验可以确保业务逻辑层(Business Logic Layer)基于有效和合法的数据进行处理,同时将错误的数据隔离在业务逻辑层之外。这有助于提高系统的健壮性、安全性和可维护
什么是事务? 事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功,要么都失败,如果操作之间有一个失败所有操作都失败 。 事务四个特性(ACID) 原子性 一组操作要么都成功,要么都失败。 一致性 一组数据从事务1合法状态转为事务2的另一种合法状态,就是一致。 隔离性 事
什么是JdbcTemplate? Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作。 准备工作 引入jdbcTemplate的相关依赖: 案例实操 创建jdbc.properties文件,配置数据库信息 jdbc.driver=com.mysql.cj.
SpringMVC1.MVC架构MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范是将业务逻辑、数据、显示分离的方法来写代码MVC主要作用是:降低了视图和业务逻辑之间的双向耦合MVC是一个架构模型,不是一种设计模式。1.model(模型)数据模型,提供要展示的数据,因此包
SpringMVC学习笔记1.SpringMVC应用1.1SpringMVC简介​SpringMVC全名叫SpringWebMVC,是⼀种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品。​MVC全名是ModelViewController,是模型(model)-视图(view)-控制器(co
11.1数据回显基本用法数据回显就是当用户数据提交失败时,自动填充好已经输入的数据。一般来说,如果使用Ajax来做数据提交,基本上是没有数据回显这个需求的,但是如果是通过表单做数据提交,那么数据回显就非常有必要了。11.1.1简单数据类型简单数据类型,实际上框架在这里没有
一、SpringMVC简介1、SpringMVC中重要组件DispatcherServlet:前端控制器,接收所有请求(如果配置/不包含jsp)HandlerMapping:解析请求格式的.判断希望要执行哪个具体的方法.HandlerAdapter:负责调用具体的方法.ViewResovler:视图解析器.解析结果,准备跳转到具体的物
1.它们主要负责的模块Spring主要应用于业务逻辑层。SpringMVC主要应用于表现层。MyBatis主要应用于持久层。2.它们的核心Spring有三大核心,分别是IOC(控制反转),DI(依赖注入)和AOP(面向切面编程)。SpringMVC的核心是DispatcherServlet(前端控制器)。MyBatis的核心是ORM(对
3.注解开发Springmvc1.使用注解开发要注意开启注解支持,2.注解简化了,处理映射器和处理适配器,只用去管视图解析器即可案例代码:1.web.xml,基本不变可以直接拿去用<!--调用DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name>
拦截器概述SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。**过滤器与拦截器的区别:**拦截器是AOP思想的具体应用。过滤器servlet规范中的一部分,任何javaweb工程都可以使用
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="
学习内容:1、SSH&SSM2、Spring3、Struts2&SpringMVC4、Hibernate&MyBatis学习产出:1.SSH和SSM都是有Spring框架的,他们两个差不多。2.Spring分为四个模块,持久层,表示层,检测层,还有核心层,核心层分为2个关键核心功能。分别为,控制反转(IOC),依赖注入(DI),和面向切面编程
一、SpringMVC项目无法引入js,css的问题具体原因是css和js等被SpringMVC拦截了:解决方案:在spring-mvc.xml中配置<mvc:default-servlet-handler/><?xmlversion="1.0"encoding="UTF-8"?><beansxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
开发环境:Eclipse/MyEclipse、Tomcat8、Jdk1.8数据库:MySQL前端:JavaScript、jQuery、bootstrap4、particles.js后端:maven、SpringMVC、MyBatis、ajax、mysql读写分离、mybatis分页适用于:课程设计,毕业设计,学习等等系统介绍