当前位置: 首页>后端>正文

自定义SpringMVC参数解析器 springmvc参数解析原理

一、什么是SpringMVC

SpringMVC就是一个Spring内置的MVC框架。

MVC框架,它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化等等),而且使用简单,与Spring无缝集成。支持 RESTful风格的URL请求。

采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。

SpringMVC的作用

MVC模式(Model-View-Controller):解决页面代码和后台代码的分离。

SpringMVC原理

在没有使用SpringMVC之前我们都是使用Servlet在做Web开发。但是使用Servlet开发在接收请求参数,数据共享,页面跳转等操作相对比较复杂。servlet是java进行web开发的标准,既然springMVC是对servlet的封装,那么很显然SpringMVC底层就是Servlet,SpringMVC就是对Servlet进行深层次的封装。

回顾MVC模式

MVC分别是:模型model(javabean)、视图view(jsp/img)、控制器Controller(Action/servlet)。

C存在的目的就是为了保证M和V的一致性,当M发生改变时,C可以把M中的新内容更新到V中。

SpringMVC执行流程和原理

自定义SpringMVC参数解析器 springmvc参数解析原理,自定义SpringMVC参数解析器 springmvc参数解析原理_自定义SpringMVC参数解析器,第1张

SpringMVC执行流程:

01、用户发送出请求被前端控制器DispatcherServlet拦截进行处理。 02、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。 03、HandlerMapping找到具体的处理器(查找xml配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。 04、DispatcherServlet调用HandlerAdapter(处理器适配器)。 05、HandlerAdapter经过适配调用具体的处理器(Handler/Controller)。 06、Controller执行完成返回ModelAndView对象。 07、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。 08、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。 09、ViewReslover解析ModelAndView后返回具体View(视图)给DispatcherServlet。 10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。 11、DispatcherServlet响应View给用户。

二、SpringMVC配置文件信息

1.配置pom.xml引入需要的jar

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>SpringMvc</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SpringMvc Maven Webapp</name>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>


    <spring.version>5.2.5.RELEASE</spring.version>
    <aopalliance.version>1.0</aopalliance.version>
    <aspectj.weaver>1.9.2</aspectj.weaver>
    <!-- junit版本号 -->
    <junit.version>4.5</junit.version>
  </properties>
  <dependencies>
    <!-- spring -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13</version>
      <scope>test</scope>
    </dependency>

    <!--切入点表达式的支持-->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.6.11</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>compile</scope>
    </dependency>

    <!-- Spring-jdbc 用于配置JdbcTemplate -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!--c3p0-->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.17</version>
    </dependency>


    <!--springmvc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!--文件上传-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.5</version>
    </dependency>

    <!--servlet-->
    <!--引入Servlet开始-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <!--引入Servlet结束-->
    <!--引入jsp相关开始-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>
    <!--引入jsp相关结束-->
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.3.10</version>
    </dependency>

    <!--jackson ( 如果spring版本 高于5.0 ,那么Jackson版本 要从2.9开始)-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.7</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.7</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.7</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>


  </dependencies>


  <build>
    <!--配置内部tomcat插件-->
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <path>/</path>
          <port>9999</port>
          <uriEncoding>UTF-8</uriEncoding>
        </configuration>
      </plugin>

      <!--配置代码生成器插件-->
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <!--此处驱动版本和上面同步-->
            <version>5.1.3</version>
          </dependency>
        </dependencies>
        <configuration>
          <!--配置文件的路径-->
          <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
          <overwrite>true</overwrite>
        </configuration>
      </plugin>
    </plugins>

    <!--配置资源打包方式
    解决maven 找不到mapper映射文件:放在resources里面不用配置-->
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>
</project>

2.配置springmvc.xml配置文件,开启注解扫描和视图解析器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--注解扫描-->
    <context:component-scan base-package="com.yzx.controller"/>


    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix"  value="/"/>
        <property name="suffix"  value=".html"/>
    </bean>
    <!--配置全局时间转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.yzx.util.TimeUtil"/>
            </set>
        </property>
    </bean>
    <!--mvc注解驱动,支持mvc的注解 (当前注解驱动,可以解决大多数问题,但是类型转换还需手动引入)-->
    <!--<mvc:annotation-driven/>-->


    <!--使用全家转换器的话,mvc注解写法-->
    <mvc:annotation-driven conversion-service="conversionService"/>

    <!--配置支持静态页面访问 (针对 web.xml中 拦截所有路径的配置)-->
    <mvc:default-servlet-handler/>


    <!--配置文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--请求编码格式-->
        <property name="defaultEncoding" value="utf-8"/>

        <!--上传文件大小上限-->
        <property name="maxUploadSize" value="1048576000"/>

        <!--上传文件单个大小上限-->
        <property name="maxUploadSizePerFile"  value="10485760"/>
    </bean>

    <!--拦截器配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截的路径 path语法:/**/*-->
            <mvc:mapping path="/**/*"/>
            <!--放行的路径 -->
            <mvc:exclude-mapping path="/login"/>
            <mvc:exclude-mapping path="/model/**"/>
            <bean class="com.yzx.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>
3.配置web.xml配置中文编码过滤器,解决post乱码问题

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  <!--配置中文编码过滤器,放到springmvc前端控制器上面-->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--配置当前编码过滤器的 规则,指定编码为UTF-8-->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <!--强制将当前工程的请求和响应编码设置为utf-8-->
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <!--配置前端控制器-->
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:SpringMvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>login.html</welcome-file>
  </welcome-file-list>
</web-app>

三.获取前台页面参数

1、通过原生HttpServletRequest获取前端参数

前台 jsp:

<fieldset>
  <legend>参数传递方式1--使用HTTPServletRequest</legend>
  <form action="param/param1" method="get">
    账号:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit" value="提交"><br>
  </form>
</fieldset>

后台 controller:

@Controller
@RequestMapping("/param")

//1、通过原生HttpServletRequest获取前端参数
public class ParamController {
    @RequestMapping("/param1")
    public String  param1(HttpServletRequest  request){
        String  username=request.getParameter("username");
        String  password=request.getParameter("password");
        System.out.println(username+"     "+password);
        return "login";
    }

2、前端页面参数和Controller方法参数名一致的获取方式

前台 jsp:

<fieldset>
  <legend>参数传递方式2--方法的参数名和页面参数一致</legend>
  <form action="param/param2" method="post">
    账号:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit" value="提交"><br>
  </form>
</fieldset>

后台 controller:

//2、前端页面参数和Controller方法参数名一致
    @RequestMapping("/param2")
    public String  param2(String  username,String  password){
        System.out.println(username+"     "+password);
        return "login";
}

前端页面参数和Controller方法参数名不一致的获取方式

前台 jsp:

<fieldset>
  <legend>参数传递方式3--方法参数名和页面参数名称不一致</legend>
  <form action="param/param3" method="post">
    账号:<input type="text" name="username1"><br>
    密码:<input type="text" name="password1"><br>
    <input type="submit" value="提交"><br>
  </form>
</fieldset>

后台 controller:

//2、前端页面参数和Controller方法参数名一致/不一致的获取方式
    @RequestMapping("/param3")
       public String  param3(@RequestParam("username1")String  username, @RequestParam("password1")String  password){
         System.out.println(username+"    param3    "+password);
         return "login";
}

3、通过对象接收前端参数(包含对象类型参数和集合类型参数)中文乱码的配置

前台 jsp:

<fieldset>
  <legend>参数传递方式3--参数过多使用对象作为参数</legend>
  <form action="param/param4" method="post">
    账号:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit" value="提交"><br>
  </form>
</fieldset>

后台 controller:

//3、通过对象接收前端参数(包含对象类型参数和集合类型参数)中文乱码的配置

ava@RequestMapping("/param4")
public String  param4(User user){
    System.out.println(user);
    return "login";
}

4、时间类型参数的转换问题 ConversionServiceFactoryBean的配置

(1) springmvc资源文件配置mvc注解驱动和配置支持静态页面访问

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--注解扫描-->
    <context:component-scan base-package="com.yzx.controller"/>


        
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix"  value="/"/>
        <property name="suffix"  value=".jsp"/>
    </bean>
    <!--配置全局时间转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.yzx.util.TimeUtil"/>
            </set>
        </property>
    </bean>
    <!--mvc注解驱动,支持mvc的注解 (当前注解驱动,可以解决大多数问题,但是类型转换还需手动引入)-->
    <!--<mvc:annotation-driven/>-->


    <!--使用全家转换器的话,mvc注解写法-->
    <mvc:annotation-driven conversion-service="conversionService"/>

    <!--配置支持静态页面访问 (针对 web.xml中 拦截所有路径的配置)-->
    <mvc:default-servlet-handler/>
</beans>

(2) 具体实现:

① 第一种实现(实体类注解实现)

//时间类型
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private   Date    time;

② 第二种实现(数据库和实体类通过string类型记录时间)

③ 第三种实现(通过创建时间类型转换的类,然后在springmvc中配置全局日期时间转换器)

package com.yzx.util;

import cn.hutool.core.util.StrUtil;
import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeUtil implements Converter <String,Date>{


    @Override
    public Date convert(String s) {
        if(StrUtil.isEmpty(s)){
            throw   new RuntimeException("时间类型不允许为空");
        }
//        else  if(s.length()!=10){
//            throw new RuntimeException("时间格式错误,应该是年月日的格式!");
//        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = null;
        try {
            parse=sdf.parse(s);
            return parse;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}



前台jsp:

<fieldset>
  <legend>参数传递方式5--包含时间类型,需要类型转换</legend>
  <form action="param/param5" method="post">
    账号:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    日期:<input type="datetime-local" name="time"><br>
    <input type="submit" value="提交"><br>
  </form>
</fieldset>

后台 controller:

//4、时间类型参数的转换问题 ConversionServiceFactoryBean的配置
    @RequestMapping("/param5")
     public String  param5(User user){
       System.out.println(user);
       return "login";
}

四、后台传值到前台

1、使用ModelAndView传值(普通值和map集合)

前台jsp:

${str}<br>
${name}<br>
${age}

后台controller:

@Controller
@RequestMapping("/model")
public class ModelController {
    //1、使用ModelAndView传值(普通值和map集合)
    @RequestMapping("/test1")
    public ModelAndView  test1(ModelAndView  mv){
        mv.addObject("str","你好");
        Map map=new HashMap();
        map.put("name","小杨");
        map.put("age","20");
        mv.addAllObjects(map);
        mv.setViewName("test");
        return mv;
    }

2、使用Model传值

前台jsp:

${str}<br>
${name}<br>
${age}

后台controller:

//2、使用Model传值
    @RequestMapping("/test2")
    public  String  test2(Model m){
        m.addAttribute("str","你好");
        Map map=new HashMap();
        map.put("name","老范");
        map.put("age","19");
        m.addAllAttributes(map);
        return  "test";
    }

3、使用普通对象(javabean对象传值)默认提示根据配置返回的jsp页面

前台jsp:

首先在webapp下面建一个model包 在model下面建一个test3.jsp测试

${user}

后台controller: user是封装的实体对象


   


//3、使用普通对象(javabean对象传值)默认提示根据配置返回的jsp页面
    @RequestMapping("/test3")
    public  User  test3(){
        User  user=new  User("123","456");
        return  user;
    }

4、使用redirect跳过视图解析器 如redirect:/login.html

后台controller:

//4、使用redirect和forward的使用  ,跳过视图解析器
    @RequestMapping("/test5")
    public String test5() {
        return "redirect:/login.html";
    }

使用forward跳过视图解析器 如forward:/login.html

后台controller:

//4使用forward跳过视图解析器
    @RequestMapping("/test6")
    public String test6() {
        return "forward:/login.html";
    }

五、文件上传和文件下载

文件上传

创建一个upload.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    注意name "uploadFile" 一定要和后台一样
<form action="/upload/upload" method="post" enctype="multipart/form-data">
    头像:<input type="file" name="uploadFile"><br/>
    <input type="submit" value="提交">

</form>
</body>
</html>

配置文件上传解析器 :

<!--配置文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--请求编码格式-->
        <property name="defaultEncoding" value="utf-8"/>

        <!--上传文件大小上限-->
        <property name="maxUploadSize" value="1048576000"/>

        <!--上传文件单个大小上限-->
        <property name="maxUploadSizePerFile"  value="10485760"/>
    </bean>

控制层 controller

@Controller
@RequestMapping("/upload")
public class UploadController {
    @RequestMapping("/upload")
    @ResponseBody
    public String  upload(MultipartFile  uploadFile, HttpServletRequest  request){
        String  originalFilename=uploadFile.getOriginalFilename();//获取原始文件名称
        System.out.println(originalFilename);

        //目的仓库地址在项目内部
        //String  upload=request.getServletContext().getRealPath("upload");//存储文件的文件夹路径

        //目的仓库地址在项目内部
        String  upload="D:\upload";
        System.out.println(upload);
        //与目的地建立连接
        File file=new File(upload);
        if(!file.exists()){//判断是否存在,不存在创建
            file.mkdirs();
        }
        //获取文件后缀名
        String  suffix=originalFilename.substring(originalFilename.lastIndexOf("."),originalFilename.length());
        //构建文件上传具体路径
        String  filename=upload.concat(File.separator).concat(UUID.randomUUID().toString()).concat(suffix);
        System.out.println(filename);
        try {
            //上传
            uploadFile.transferTo(new File(filename));
            return filename;
        } catch (IOException e) {
            e.printStackTrace();
        }
     return null;
    }

文件下载

文件上传和文件下载的区别是控制层的不同 控制层 controller

/** * 文件下载 * ResponseEntity进行返回的 */ @RequestMapping("/download") public ResponseEntity<byte[]> download(HttpServletRequest request,String filename){ //文件地址在项目内部的(目的地址信息) //String upload=request.getServletContext().getRealPath("upload");

//目的仓库在项目之外
    String  upload="D:\upload";
    //先拼接具体的位置路径,然后通过file进行建立连接
    File file=new File(upload+File.separator+filename);
    if(!file.exists()){//如果不存在文件,直接返回null
        return null;
    }

    try {
        //创建标头文件对象
        HttpHeaders  headers=new HttpHeaders();
        //解决乱码问题
        String  downloadfile=new String(filename.getBytes(StandardCharsets.UTF_8),"iso-8859-1");
        //以下载的方式打开文件
        headers.setContentDispositionFormData("attachment",downloadfile);
        //二进制流
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();

    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;

}

六、拦截器

Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。

用户可以自己定义一些拦截器来实现特定的功能。它也是 AOP 思想的具体应用。自定义拦截器, 要求必须实现:HandlerInterceptor 接口

过滤器和拦截器区别:

过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用。

拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。

过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。

拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的。

配置拦截器

springmvc.xml

<!--拦截器配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截的路径 path语法:/**/*-->
            <mvc:mapping path="/**/*"/>
            <!--放行的路径 -->
            <mvc:exclude-mapping path="/login"/>
            <mvc:exclude-mapping path="/model/**"/>
            <bean class="com.yzx.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
控制层用seeion传user到LoginInterceptor

@Controller
@RequestMapping
public class LoginController {

    @RequestMapping("/login")
    @ResponseBody
    public  Object  login(String username, String  password, HttpSession  session){
        if(StrUtil.isNotEmpty(username)&&StrUtil.isNotEmpty(password)){
            System.out.println("登录");
            session.setAttribute("user","user");
        }else{
            System.out.println("退出");
            session.removeAttribute("user");
        }

        return null;
    }
}

创建com.yzx.interceptor.LoginInterceptor

package com.yzx.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 拦截器
 */
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 预处理种,返回true是放行,  返回false是拦截
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object  user=request.getSession().getAttribute("user");
        if(user!=null){
            System.out.println(true);
            return true;
        }else{
            System.out.println(false);
            response.sendRedirect("/login.html");
            return  false;
        }
    }
}

https://www.xamrdz.com/backend/34z1962903.html

相关文章: