Sprintboot的拦截器提供了精细的控制:在request被响应之前、request被响应之后、request全部结束之后至视图渲染之前 三个时间点,我们都可以通过编写他们的函数来控制。

首先新建一个拦截器passportInterpretor,这个拦截器类必须实现HandlerInterceptor接口,并重写三个成员函数。

然后注册拦截器。

下面举例,我在拦截器中做的事情是,从请求中拿到我想要的ticket,判断是否合法(过期、废弃等),如果合法就在视图中添加一个线程本地变量user,否则不做任何改变(放行请求),用于登录状态的页面显示。

  1. package com.example.market1.Interceptor;
  2.  
  3. import com.example.market1.DAO.TicketUserDAO;
  4. import com.example.market1.DAO.UserDAO;
  5. import com.example.market1.Model.HostHolder;
  6. import com.example.market1.Model.TicketLogin;
  7. import com.example.market1.Model.User;
  8. import com.example.market1.Utils.MarketUtils;
  9. import com.example.market1.Utils.MyTools;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Component;
  12. import org.springframework.web.servlet.HandlerInterceptor;
  13. import org.springframework.web.servlet.ModelAndView;
  14.  
  15. import javax.servlet.http.Cookie;
  16. import javax.servlet.http.HttpServletRequest;
  17. import javax.servlet.http.HttpServletResponse;
  18. import java.util.Date;
  19.  
  20. @Component
  21. public class PassportInterceptor implements HandlerInterceptor {
  22. @Autowired
  23. private UserDAO userDAO;
  24.  
  25. @Autowired
  26. private TicketUserDAO ticketUserDAO;
  27.  
  28. @Autowired
  29. private HostHolder hostHolder;
  30.  
  31. @Override
  32. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  33. String ticket = MarketUtils.getTicketFromRequst(request);
  34. if(ticket != null){
  35. TicketLogin ticketLogin = ticketUserDAO.getTicketLogin(ticket);
  36. if(ticketLogin == null || ticketLogin.getExpired().before(new Date()) || ticketLogin.getStatus() == 1){
  37. return true;
  38. }
  39. User user = userDAO.getUserById(ticketLogin.getUserid());
  40. MyTools.log("User got by ticket:" + user.getMail());
  41. hostHolder.setUser(user);
  42. }
  43. return true;
  44. }
  45.  
  46. @Override
  47. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  48. if(modelAndView != null && hostHolder.getUser() != null){
  49. modelAndView.addObject("user", hostHolder.getUser());
  50. }
  51. }
  52.  
  53. @Override
  54. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  55. hostHolder.clear();
  56. }
  57. }

然后新建一个注册拦截器的配置类:

(这里有一点需要注意,新版本的springboot中该类需要实现的接口是WebMvcConfigurer,

旧版本要实现的接口是WebMvcConfigurerAdapter 并且此时registry.addInterceptor之后要super.addInterceptor(registry)。)

  1. package com.example.market1.Configuration;
  2.  
  3. import com.example.market1.Interceptor.PassportInterceptor;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  7. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  8.  
  9. @Component
  10. public class MarketWebConfiguration implements WebMvcConfigurer {
  11. @Autowired
  12. PassportInterceptor passportInterceptor;
  13.  
  14. @Override
  15. public void addInterceptors(InterceptorRegistry registry) {
  16. registry.addInterceptor(passportInterceptor);
  17. }
  18. }

Spring boot实现自定义拦截器的更多相关文章

  1. 【Spring Boot】Spring Boot之自定义拦截器

    一.拦截器的作用 将通用的代码抽取出来,达到复用的效果.比如可以用来做日志记录.登录判断.权限校验等等 二.如何实现自定义拦截器 1)创建自定义拦截器类并实现HandlerInterceptor类 / ...

  2. spring boot 实现mybatis拦截器

    spring boot 实现mybatis拦截器 项目是个报表系统,服务端是简单的Java web架构,直接在请求参数里面加了个query id参数,就是mybatis mapper的query id ...

  3. spring boot中注册拦截器

    拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重 ...

  4. Spring MVC中自定义拦截器的简单示例

    1. 引言 拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter. 我们可以让普通的Bean实现HandlerIntercpetor接口或继承 ...

  5. spring boot 过滤器、拦截器的区别与使用

    原文:https://blog.csdn.net/heweimingming/article/details/79993591 拦截器与过滤器的区别: 1.过滤器和拦截器触发时机不一样,过滤器是在请求 ...

  6. Spring Mvc 的自定义拦截器

     spring mvc的拦截器 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户 ...

  7. Spring Boot实战:拦截器与过滤器

    一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...

  8. spring boot配置springMVC拦截器

    spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...

  9. Spring Boot 如何使用拦截器、过滤器、监听器?

    过滤器 过滤器的英文名称为 Filter, 是 Servlet 技术中最实用的技术. 如同它的名字一样,过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求,通常用作 ...

随机推荐

  1. MVC 5使用ViewData(对象)显示数据

    控制器协调处理好数据之后,是交由视图来显示数据.在控制器与视图交互有一个是ViewData.这次练习,Insus.NET就以它来做实例. 前些时间,Insus.NET实现的练习中,也有从控制器传数据给 ...

  2. 背水一战 Windows 10 (55) - 控件(集合类): SemanticZoom, ISemanticZoomInformation

    [源码下载] 背水一战 Windows 10 (55) - 控件(集合类): SemanticZoom, ISemanticZoomInformation 作者:webabcd 介绍背水一战 Wind ...

  3. .Net Mvc AutoMapper简单使用

    1.安装automapper nuget包. 2.新建一个AutoMapper配置类并实现一个静态配置方法. 方法一. using AutoMapper; using AutoMapperTest.M ...

  4. Python MySQL - 进行数据查询

    #coding=utf-8 import mysql.connector import importlib import sys # reload(sys) # sys.setdefaultencod ...

  5. VNC黑屏解决办法

    在Linux里安装配置完VNC服务端,发现多用户登陆会出现黑屏的情况,具体的现象为:客户端可以通过IP与会话号登陆进入系统,但登陆进去是漆黑一片,除了一个叉形的鼠标以外,伸手不见五指. 原因:用户的V ...

  6. c++中的const和volatile知识自我总结

    学习了下c++中的const关键字,总结如下. 1.const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”. int main() { c ...

  7. 解决Fiddler抓不到HTPPS

    刚开始启动Fiddler,设置代理后,直接打开浏览器,输入我们最记得的网址“baidu.com”,发现Fiddler什么都抓不到,这是为什么呢?难道是我的配置有问题,重新检查一下,浏览器的代理已经设置 ...

  8. 域名直接访问应用程序-不加端口号&不加路径名

    当访问域名的时候,端口默认指定的是80: 而80端口在Linux系统下,1024之前的端口是只有root用户才能使用的, 因此将,系统层面将端口80 映射到8080, iptables -t nat ...

  9. (转)Db2 数据库性能优化中,十个共性问题及难点的处理经验

    (转)https://mp.weixin.qq.com/s?__biz=MjM5NTk0MTM1Mw==&mid=2650629396&idx=1&sn=3ec17927b3d ...

  10. spring cloud(服务消费者(利用ribbon实现服务消费及负载均衡)——初学二)

    Ribbon是一个基于HTTP和TCP客户端的负载均衡器,利用ribbon实现服务消费,并实现客户端的负载均衡. 一.准备工作(利用上一节的内容) 启动服务注册中心 启动computer-servic ...