Spring Boot 拦截器的使用详解
文章目录
前言
Spring Boot拦截器的使用。Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。
一、拦截器是什么?
先理解一下AOP的概念,AOP不是一种具体的技术,而是一种编程思想。
在面向对象编程的过程中,我们很容易通过继承、多态来解决纵向扩展。
但是对于横向的功能,比如,在所有的service方法中开启事务,或者统一记录日志等功能,面向对象的是无法解决的。所以AOP——面向切面编程其实是面向对象编程思想的一个补充。而我们今天讲的拦截器属于面向切面编程的具体实现。
二、配置拦截器
1.项目结构
2.创建自定义的拦截器类并实现HandlerInterceptor接口
代码如下(示例):
package com.adu.interceptor.demo.Service;
import com.adu.interceptor.demo.model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class InterceptorHandlder implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//业务拦截的规则
//从Seesion中获取该用户是否登录,判断是否登录
User user = (User) request.getSession().getAttribute("user");
if(user == null){
//未登录
response.sendRedirect(request.getContextPath()+"/Error");
return false;
}
else { return true;}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
3.在model下面创建实体类User类
package com.adu.interceptor.demo.model;
public class User {
private String id;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
private String username;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
4.创建UserController控制层类
package com.adu.interceptor.demo.Controller;
import com.adu.interceptor.demo.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpSession;
@Controller
/*
* 我们这里是表示login为模拟登录的页面
* center为模拟登录之后可以看到的页面,未登录之前不能看到该页面,返回时Error页面,需要通过Session取到数据才可以展示center页面
* 也即是我们登录后设置了Session
* out资源类似于游客可以看的页面,就是不登录都可以直接访问的页面
* */
public class UserController {
@RequestMapping("/login")
public @ResponseBody
Object login(HttpSession session) {
User user = new User();
user.setId("1000");
user.setUsername("zhngsan");
session.setAttribute("user", user);
return "login Success";
}
@RequestMapping("/center")
public @ResponseBody
Object center() {
return "登录之后的资源";
}
@RequestMapping("/out")
public @ResponseBody
Object out() {
return "外部资源";
}
@RequestMapping("/Error")
public @ResponseBody Object Error() {
return "未登录";
}
}
5. 定义配置类
这里需要重写addInterceptors方法,增加拦截的页面,在这里我们定义拦截的页面为center页面,也就是模拟登录之后可以看到的页面,未登录的话拦截器拦截会直接返回到Error页面上。
package com.adu.interceptor.demo.Interceptor;
import com.adu.interceptor.demo.Service.InterceptorHandlder;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConf implements WebMvcConfigurer {
//添加自己定义的拦截器,这里相当于在mVC中的拦截器的Xml配置文件中的类容
//mvc:interceptor
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new InterceptorHandlder()).addPathPatterns("/center").excludePathPatterns();
}
}
6.网页测试
1.我们直接访问http://localhost:8080/center页面
- 我们先访问http://localhost:8080/login,再次访问http://localhost:8080/center页面
总结
本篇文章主要是简单对Spring Boot 中的拦截器做了一个简单的介绍,后续还有很多的知识,需要我们去多多动手实践。所谓“实践出真知”,多实践一些原理也就慢慢的明白了。