Spring-boot添加Interceptor进行认证验证

 

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24210767/article/details/78516616

背景:自己在做一个Agile的管理系统,需要做到用户认证和页面拦截跳转。所以需要验证是否有Session和Cookie的信息。如果没有就重新定向到登录页面,然后为了这个问题各种在网上找解决方法,说到这里真的很生气呀。网上大家写博客真的是内容参差不齐,很多博客即不说清楚原理也不说清楚解决的方法。一边看一边生气,既然写出来给大家看就得要保证博客的质量吧。不然就是浪费时间,如果你只想是把博客当做是记事本的话,我建议用有道云笔记或许更好用。好了不说了,只希望大家可以写出高质量的博客共建和谐美好的IT社区。既然我自己都这么说了,我肯定要保证博客的质量了,下面我会用最详细让大家都能看到,而且保证可以解决。

问题重现:1、在登录之前不管是那个链接,都跳转到登录界面。

                  2、在登录之后如果认证成功会添加Session信息。

                  3、如果在有Session认证的情况下可以可以访问。

解决方法:我们先学习两个东西,HandlerInterceptor 和  WebMvcConfigurerAdapter

HandleIntercepotr: 在Spring中定义一个Interceptor是非常简单的,主要有两种方式:

第一种:实现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.  
  3. /*在执行Controller的任务之前判断是否有Session信息

  4. 如果有Session信息就往下执行,去调用Controller。

  5. 如果没有Session就跳转到登录页面

  6. */

  7. @Override

  8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

  9.  
  10. HttpSession session=request.getSession();

  11. if(session.getAttribute("User")!=null){

  12. return true;

  13. }

  14. String url = "/login.html";

  15. request.getRequestDispatcher(url).forward(request,response);

  16. return false;

  17. }

  18.  
  19. @Override

  20. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

  21.  
  22. }

  23.  
  24. @Override

  25. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

  26.  
  27. }

  28. }

 

WebMvcConfigurerAdapter:对Spring进行配置

 

 
  1. @Configuration

  2. public class WebSecurityConfig extends WebMvcConfigurerAdapter {

  3.  
  4.  
  5. @Bean

  6. public SessionInterceptor getSessionInterceptor() {

  7. return new SessionInterceptor();

  8. }

  9.  
  10. @Override

  11. public void addInterceptors(InterceptorRegistry registry) {

  12. /*调用我们创建的SessionInterceptor。

  13. * addPathPatterns("/api/**)的意思是这个链接下的都要进入到SessionInterceptor里面去执行

  14. * excludePathPatterns("/login")的意思是login的url可以不用进入到SessionInterceptor中,直接

  15. * 放过执行。

  16. *

  17. * 注意:如果像注释那样写是不可以的。这样等于是创建了多个Interceptor。而不是只有一个Interceptor

  18. * 所以这里有个大坑,搞了很久才发现问题。

  19. *

  20. * */

  21. SessionInterceptor sessionInterceptor=new SessionInterceptor();

  22. registry.addInterceptor(sessionInterceptor).addPathPatterns("/api/**")

  23. .excludePathPatterns("/login","/verify");

  24. // registry.addInterceptor(sessionInterceptor).excludePathPatterns("/login");

  25. // registry.addInterceptor(sessionInterceptor).excludePathPatterns("/verify");

  26. super.addInterceptors(registry);

  27. }

  28. }

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

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

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

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

总结:在登录和验证拦截方面这个方法是可以的。但是有保证安全性,还需要加入token和x-csrf-token等一系列的认证和验证条件。所以还有很多的东西需要学习,如果看完博客有不懂的地方可以留言,我如果上线看到了都会做相应的回复的。

PS:最烦那些自己解决了问题,不说出来怎么解决的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值