Spring-boot添加拦截器---------Interceptor进行认证验证

在工作中实用SpringBoot已经有一段时间了,但却因为一次吃饭被师傅的一句话点醒,决定仔细认真的研究一下自己学习的东西,加深理解。找了本SpringBoot应用书籍,直接看书有的时候看的有点晕,就索性结合着博客学习,感觉博客里的兄弟搞的挺好的,通俗易懂。

我们为什么学习实用拦截器,拦截器可以实现什么功能,有什么优势呢,下面是我直接搜的一个兄弟的总结:

原文链接:原文链接

拦截器可以说相当于是个过滤器:就是把 不想要的或不想显示的内容给过滤掉。拦截器可以抽象出一部分代码可以用来完善原来的action。同时可以减轻代码冗余,提高重用率。
比如在登入一个页面时,如果要求用户密码、权限等的验证,就可以用自定义的拦截器进行密码验证和权限限制。对符合的登入者才跳转到正确页面。这样如果有新增权限的话,不用在action里修改任何代码,直接在interceptor里修改就行了。

1、好处:拦截器也可以让你将通用的代码模块化并作为可重用的类。Struts2中的很多特性都是由拦截器来完成的。
2、作用:可以构成拦截器栈,完成特定功能。比如日志记录、登录判断、权限检查等作用。

 

那么我们准备实用拦截器之前需要学习一点东西:

我们先学习两个东西,HandlerInterceptor 和  WebMvcConfigurerAdapter

第一种:实现HandlerInterceptor 接口,或者是继承实现了HandlerInterceptor 接口的类,例如HandlerInterceptorAdapter; 
第二种:实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。

HandlerInterceptor接口中定义了三个方法。

boolean preHandle() 该方法在处理请求之前进行调用,就是在执行Controller的任务之前。如果返回true就继续往下执行,返回false就放弃执行。

void postHandle()该方法将在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作,比如可以在这里将渲染的视图名称更改为其他视图名称。

void afterCompletion()该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行,也就是页面已经渲染完毕后调用此方法。用于进行资源清理。

 


   
   
  1. public class SessionInterceptor implements HandlerInterceptor{
  2. /*在执行Controller的任务之前判断是否有Session信息
  3. 如果有Session信息就往下执行,去调用Controller。
  4. 如果没有Session就跳转到登录页面
  5. */
  6. @Override
  7. public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  8. HttpSession session=request.getSession();
  9. if(session.getAttribute( "User")!= null){
  10. return true;
  11. }
  12. String url = "/login.html";
  13. request.getRequestDispatcher(url).forward(request,response);
  14. return false;
  15. }
  16. @Override
  17. public void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  18. //controller 方法处理完毕后,调用此方法。
  19. }
  20. @Override
  21. public void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  22. //页面渲染完毕后调用此方法,通常用来清除某些资源,类似Java语法的finally。
  23. }
  24. }

WebMvcConfigurerAdapter:对Spring进行配置


   
   
  1. @Configuration
  2. public class WebSecurityConfig extends WebMvcConfigurerAdapter {
  3. @Bean
  4. public SessionInterceptor getSessionInterceptor () {
  5. return new SessionInterceptor();
  6. }
  7. @Override
  8. public void addInterceptors (InterceptorRegistry registry) {
  9. /*调用我们创建的SessionInterceptor。
  10. * addPathPatterns("/api/**)的意思是这个链接下的都要进入到SessionInterceptor里面去执行
  11. * excludePathPatterns("/login")的意思是login的url可以不用进入到SessionInterceptor中,直接
  12. * 放过执行。
  13. *
  14. * 注意:如果像注释那样写是不可以的。这样等于是创建了多个Interceptor。而不是只有一个Interceptor
  15. * 所以这里有个大坑,搞了很久才发现问题。
  16. *
  17. * */
  18. SessionInterceptor sessionInterceptor= new SessionInterceptor();
  19. registry.addInterceptor(sessionInterceptor).addPathPatterns( "/api/**")
  20. .excludePathPatterns( "/login", "/verify");
  21. // registry.addInterceptor(sessionInterceptor).excludePathPatterns("/login");
  22. // registry.addInterceptor(sessionInterceptor).excludePathPatterns("/verify");
  23. super.addInterceptors(registry);
  24. }
  25. }

WebMvcConfigurer

       WebMvcConfigurer是用来全局定制化SpringBoot的MVC特性。开发者通过实现WebMvcConfigurer接口来配置应用的MVC全局特性。


   
   
  1. @Configuration
  2. public class MvcConfigurer implements WebMvcConfigurer{
  3. //拦截器
  4. public void addInterceptors (InterceptorRegistry registry){
  5. }
  6. //跨域访问配置
  7. public void addCorsMappings (CorsRegistry registry){
  8. }
  9. //格式化
  10. public void addFormatters (FormatterRegistry registry){
  11. }
  12. //URI到视图的映射
  13. public void addViewControllers (ViewControllerRegistry registry){
  14. }
  15. //其他更多全局定制接口
  16. }

 

上面的代码就是实现这个功能的。来回顾一下需求和解决方法。

需求1、在登录前不管那个链接都跳转到Login页面。从WebMvcConfigurationAdapter里面看到,除了/login和verify其他的页面都要进入到Interceptor里面。

需求2、在登录验证成功里面添加Session就好了。

需求3、在Interceptor里面我们可以看到如果有Session就会通过,如果没有就会跳转到登录页面。

 

 

参考文档链接:https://blog.csdn.net/qq_24210767/article/details/78516616

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值