从所周知,如果从开始阶段大家实现未登录时只能访问首页和登录页面的基本都是通过servlet + Filter(过滤器)来实现的,而在SSM整合时也是大同小异,现在介绍一下通过SpringBoot来实现这个功能
开发环境以及所用框架
IDEA(用STS也是一样的) + springboot + mybatis(或者JPA)
对应依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.briup</groupId>
<artifactId>springboot_test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_test</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
//此处为web启动器,本次实验相关
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
//lombok,STS使用需要安装对应插件
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
//测试处依赖,与本次实验无关
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
//使用为thymeleaf模板,也可用jsp或者freemark
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
//mysql数据库连接
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
//mybatis依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
</dependencies>
//插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
实现WebMvcConfigurer接口
@Configuration
//@EnableWebMvc
public class MyMvcConfig implements WebMvcConfigurer {
@Override
//通过此处加载拦截器
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new signinHandlerIntercepter())
.addPathPatterns("/**")
.excludePathPatterns("/signin", "/assets/**", "/error/**", "/signup",
"/register");
}
}
原理
因为springboot中自动配置的原因,故我们可以实现WebMvcConfigurer接口(不然为啥有人调侃咱们都是面向接口编程呢)从而使我们自己的拦截器组件放入,@EnableWebMvc表示全面接管SpringBoot中的Web模块。
打开源码类WebMvcAutoConfiguration中可以看见,其中已经帮我们实现了一个WebMvcAutoConfigurationAdapter。
可以看到其也实现了WebMvcConfigurer接口。
其中便有很多常用方法,如addResourceHandlers,当然我们也可以通过自己的将其覆盖掉,诸如上文中的MyMvcConfig便是做了一个SpringMVC的扩展。
实现自定义拦截器
public class signinHandlerIntercepter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("user");
if(user == null){
request.getRequestDispatcher("/signin").forward(request, response);
System.out.println("过滤器没有放行");
return false;
}
else {
System.out.println("过滤器放行了");
return true;
}
}
}
此处为实现拦截器,当然,也可以使用过滤器(Filter)的方式。从session中取对应的user,存在则放行,不存在则不放行。
user的来源
在页面表单处填写数据,提交后,系统查询数据库对比用户名密码,正确则将该对象放入session。也可以使用token,但这个涉及到后续知识,如Spring Security,redis等
<select id="findUserByAccount" resultType="com.briup.springboot_test.bean.User">
select * from web_user where account = #{userName} and password = #{password}
</select>
此处为使用mybatis的mapper文件,用来从数据库中查询用户名密码是否输入正确。
数据页面
当用户登录成功后,访问数据页面,过滤器就会放行,从而能进行正常的查询,实现了还未登录时无法查询数据,登录后才能查询
拓展
SpringBoot是支持RESTful风格的,可以通过firefox中的一个插件RESTClient,又或者使用另一种方法
<form method="post" id="formMethod">
<input type="hidden" name="_method" value="DELETE">
</form>
此处意思为发送DELETE请求。
然后application.properties中加上
spring.mvc.hiddenmethod.filter.enabled=true
如果是application.yml则加上
spring:
mvc:
hiddenmethod:
filter:
enabled: true
表示启用隐藏的请求方法
题外话
总得来说,本次也只是对SpringBoot中SpringMVC做了一个扩展,多看看源码和官方文档对于理解整个框架还是很有用的。