一、背景:

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

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

五、拦截器应用:

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

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

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

再就是权限要求了。

七、拦截器总结:

       拦截器可以让你在Action和result被执行之前或之后进行一些处理。同时,拦截器也可以让你将通用的代码模块化并作为可重用的类。其中Struts2中的很多特性都是由拦截器来完成的。拦截是AOP的一种实现策略。拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。比较显而易见的就是能够切实保障用户的财产信息安全,为有关部门提供权限或者职权领域的有效划分与约束。

【SSM】拦截器的原理、实现的更多相关文章

  1. 【ssm】拦截器的原理及实现

    一.背景: 走过了双11,我们又迎来了黑色星期五,刚过了黑五,双12又将到来.不管剁手的没有剁手的,估计这次都要剁手了!虽然作为程序猿的我,没有钱但是我们长眼睛了,我们关注到的是我们天猫.淘宝.支付宝 ...

  2. Mybatis拦截器实现原理深度分析

    1.拦截器简介 拦截器可以说使我们平时开发经常用到的技术了,Spring AOP.Mybatis自定义插件原理都是基于拦截器实现的,而拦截器又是以动态代理为基础实现的,每个框架对拦截器的实现不完全相同 ...

  3. 浅谈Struts2拦截器的原理与实现

    拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...

  4. Spring异步调用原理及SpringAop拦截器链原理

    一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTI ...

  5. Struts自定义拦截器&拦截器工作原理

    0.拦截器的调用原理: 拦截器是一个继承了序列化接口的普通接口.其工作原理是讲需要被拦截的对象作为参数传到intercept()方法内,在方法内部对此对象进行处理之后再执行原方法.intercept( ...

  6. SpringMvc拦截器运行原理。

    首先,先简单的说一下怎么配置SpringMvc的拦截器. 分两步,第一步先定义一个类,实现HandlerInterceptor接口. import javax.servlet.http.HttpSer ...

  7. 自己打断点走的struts流程&拦截器工作原理

    ①. 请求发送给 StrutsPrepareAndExecuteFilter ②. StrutsPrepareAndExecuteFilter 判定该请求是否是一个 Struts2 请 求(Actio ...

  8. struts拦截器实现原理

    图1: 上1来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请 ...

  9. SSM拦截器应用

    1.创建工具包 2.编写拦截器业务逻辑类容(在此为验证登录效果) @Override public void doFilter(ServletRequest req, ServletResponse ...

随机推荐

  1. ArrayList排序

    今天发现,ArrayList 排序不满足期望. 起先,List是这样Before sort: [1, @I, am, Love, java, very, Much] 使用Collections.sor ...

  2. 插头DP专题

    建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...

  3. nyoj366_D的小L_字典序_全排列

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

  4. Divide and conquer:Sumsets(POJ 2549)

    数集 题目大意:给定一些数的集合,要你求出集合中满足a+b+c=d的最大的d(每个数只能用一次) 这题有两种解法, 第一种就是对分,把a+b的和先求出来,然后再枚举d-c,枚举的时候输入按照降序搜索就 ...

  5. JS 基本语句

    1.循环中必备的条件: 初始值  循环条件  状态改变   循环体 for(初始值  循环条件  状态改变)    {       循环体     } for(var i=0;i<100;i++ ...

  6. 【QT】C++ GUI Qt4 学习笔记2

    Go To Cell 利用QT Desinger做好界面后加入的代码有 gotocelldialog.h #ifndef GOTOCELLDIALOG_H #define GOTOCELLDIALOG ...

  7. 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...

    37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...

  8. POJ 1753 Flip game ( 高斯消元枚举自由变量)

    题目链接 题意:给定一个4*4的矩阵,有两种颜色,每次反转一个颜色会反转他自身以及上下左右的颜色,问把他们全变成一种颜色的最少步数. 题解:4*4的矩阵打表可知一共有四个自由变元,枚举变元求最小解即可 ...

  9. Debian下查看系统版本信息命令汇总

    Debian下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然. 1.odoo@debian64:~$ uname -a(Debian查看版本当前操 ...

  10. ios 中直接修改frame里边某个属性的简便方法

    参考:http://www.cnblogs.com/wengzilin/p/4359865.html 在iOS中view的frame属性使用地太频繁了,尤其是调UI的时候.我们知道,正常情况下我们无法 ...