zoukankan      html  css  js  c++  java
  • 【SSM】拦截器的原理、实现

    一、背景:

           走过了双11,我们又迎来了黑色星期五,刚过了黑五,双12又将到来。不管剁手的没有剁手的,估计这次都要剁手了!虽然作为程序猿的我,没有钱但是我们长眼睛了,我们关注到的是我们天猫、淘宝、支付宝之间的登录系统的关联,即只要我们在一个系统上登陆过了,在同门户的其他系统上就不用再次登陆了,这个涉及到的是我们的接下来下次要聊到的——SSO(单点登录);而这次我们要聊的,是我们的拦截器,因为只要我们没有登录,随便输入一个合法的地址涉及到订单或者隐私信息的内容时,就会被干到登录页面上去,这就是我们的拦截器。

    二、拦截器结构图:

                        

    三、拦截器执行原理(流程):

    1、拦截请求的url;

    2、从cookie中获取token;

    3、如果没有token,则直接拦截,打回登录页面;

    4、获取到token,调用sso(单点登录)系统的服务查询用户信息,返回session(用户信息);

    5、对获取到的session进行处理。如果session已经过期,直接打回系统登录页面;如果session有效,则直      接放行,达到用户的请求页面

    四、拦截器实现:

    1、在SpringMvc中配置拦截器:

    2、在springmvc中需要实现HandlerInterceptor接口。

    1. public class LoginInterceptor implements HandlerInterceptor {  
    2.       
    3.     @Autowired   
    4.     private UserService userService;  
    5.     @Value("SSO_LOGIN_URL")  
    6.     private String SSO_LOGIN_URL;  
    7.   
    8.     @Override  
    9.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
    10.             throws Exception {  
    11.         // 1、拦截请求url  
    12.         // 2、从cookie中取token  
    13.         // 3、如果没有toke跳转到登录页面。  
    14.         // 4、取到token,需要调用sso系统的服务查询用户信息。  
    15.         TbUser user = userService.getUserByToken(request, response);  
    16.         // 5、如果用户session已经过期,跳转到登录页面  
    17.         if (user == null) {  
    18.             response.sendRedirect(SSO_LOGIN_URL);  
    19.             return false;  
    20.         }  
    21.         // 6、如果没有过期,放行。  
    22.         return true;  
    23.     }  
    24.   
    25.     @Override  
    26.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,  
    27.             ModelAndView modelAndView) throws Exception {  
    28.   
    29.     }  
    30.   
    31.     @Override  
    32.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
    33.             throws Exception {  
    34.     }  
    35. }  

    3、对不同情况作出相应,就是在我们的的controller中响应不同的页面。其中登录的url中包含回调的参数,参数就是回调的url,sso登录Controller接收参数,当登录成功后跳转到回调的url

    五、拦截器应用:

           像我们已知的拦截器,主要应用于有关个人隐私信息或者有关财产安全的支付功能上;另一个就是对权限有要求的时候,也会应用拦截器。

    六、我们接触过的拦截器:

           比如说京东,在我们搜索东西的时候是不需要我们的个人信息的,但是当我们提交订单或者查看个人订单的时候,肯定会走拦截器判断的用户信息真实有效性的。大家可以做个试验,京东提交订单结束后进入支付页面前后,分别清除浏览器缓存,进行刷新,我们是会被打回登录页面的。再者像现在的淘宝,连浏览都要求登陆,这里利用的都是拦截器,简单来说,就是我们每进入一个设置好有拦截要求的页面,这个东西都系都会走一遍,不符合条件或者不安全了,直接打回登陆页面。

           再就是权限要求了。

    七、拦截器总结:

           拦截器可以让你在Action和result被执行之前或之后进行一些处理。同时,拦截器也可以让你将通用的代码模块化并作为可重用的类。其中Struts2中的很多特性都是由拦截器来完成的。拦截是AOP的一种实现策略。拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。比较显而易见的就是能够切实保障用户的财产信息安全,为有关部门提供权限或者职权领域的有效划分与约束。
  • 相关阅读:
    Tree Constructe(icpc济南)(二分图+构造)
    Cleaning(CF1474D)
    Matrix Equation (2020icpc济南)
    关于位运算
    poj2540半平面交+判范围
    做题记录0(并查集|树状数组)
    ac自动机
    二次剩余
    BSGS算法
    无向图的桥
  • 原文地址:https://www.cnblogs.com/DoubleEggs/p/6112119.html
Copyright © 2011-2022 走看看