一、什么是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执行流程:
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;
}
}
}