拦截器

拦截器的定义

处理器拦截器类似于servlet开发中的filter,用于对处理器进行预处理和后处理。

定义拦截器,实现HandlerInterceptor这个接口

接口的实现需要导入包import org.springframework.web.servlet.HandlerInterceptor;

这个包不能导错,不然不能自动添加方法。

代码:

package com.jch.interceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

public class HandlerInterceptor1 implements HandlerInterceptor{

         /**

          *  进入handler方法之前执行

          *  用于身份认证,身份校验

          *  比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不在向下执行

          */

         @Override

         public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {

                   // TODO Auto-generated method stub

                   return false;

         }

         /**

          *  进入handler之后,返回modelandview之前执行

          *  应用场景从modelandview出发,将共用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一制定视图

          */

         @Override

         public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

                            throws Exception {

                   // TODO Auto-generated method stub

         }

         /**

          *  执行handler完成执行此方法

          *  应用场景:统一异常处理,统一日志处理

          */

         @Override

         public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

                            throws Exception {

                   // TODO Auto-generated method stub

         }

}

拦截器的配置

SpringMVC拦截器针对HandlerMapping进行拦截设置

SpringMVC拦截器针对HandlerMapping进行拦截器设置

如果在某个HandlerMapping中配置拦截,经过该HandlerMapping映射成功的handler最终使用该拦截器。

一般不推荐使用,配置过于麻烦

类似全局的拦截器

SpringMVC配置类似全局的拦截器,SpringMVC框架将配置的类似全局的拦截器注入到每一个HandlerMapping中

拦截器的测试

测试需求

测试多个拦截器各个方法的执行时机

编写两个拦截器

代码;

package com.jch.interceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

public class HandlerInterceptor1 implements HandlerInterceptor{

         /**

          *  进入handler方法之前执行

          *  用于身份认证,身份校验

          *  比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不在向下执行

          */

         @Override

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

                   // TODO Auto-generated method stub

                   System.out.println("这是第1个拦截器,preHandle方法");

                   return false;

         }

         /**

          *  进入handler之后,返回modelandview之前执行

          *  应用场景从modelandview出发,将共用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一制定视图

          */

         @Override

         public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

                            throws Exception {

                   // TODO Auto-generated method stub

                   System.out.println("这是第1个拦截器,postHandle方法");

         }

         /**

          *  执行handler完成执行此方法

          *  应用场景:统一异常处理,统一日志处理

          */

         @Override

         public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

                            throws Exception {

                   // TODO Auto-generated method stub

                   System.out.println("这是第1个拦截器, afterCompletion方法");

         }

}

两个拦截器都放行

将两个return都改为true

在浏览器中随意访问一个路由看效果:

这是第1个拦截器,preHandle方法

这是第2个拦截器,preHandle方法

这是第2个拦截器,postHandle方法

这是第1个拦截器,postHandle方法

这是第2个拦截器,afterCompletion方法

这是第1个拦截器, afterCompletion方法

总结:

preHandle方法按顺序执行

postHandle方法和afterCompletion方法按拦截器配置的逆向顺序执行

拦截器1放行,拦截器2不放行

结果:

这是第1个拦截器,preHandle方法

这是第2个拦截器,preHandle方法

这是第1个拦截器, afterCompletion方法

总结:

拦截器1放行,拦截器的preHandle方法才会执行

拦截器2的preHandle方法不放行,拦截器2的postHandle方法和afterCompletion方法不会执行。

只要有一个拦截器拦截不放行postHandle方法都不会执行

拦截器1不放行,拦截器2不放行

结果:

这是第1个拦截器,preHandle方法

总结:

拦截器1 preHandle方法不放行,postHandle方法和afterCompletion方法都不会执行

拦截器1 preHandle方法不放行,拦截器2不执行。

小结

根据测试结果,对拦截器应用。

比如:

统一日志处理拦截器,需要该拦截器preHandler一定要放行,且将它放在拦截器链接中的第一个位置。

登录认证的拦截器,放在拦截器链接中的第一个位置

权限校验拦截器,放在登录校验拦截器之后。(因为登录通过后才校验权限)

拦截器的应用(实现登录认证)

需求

1、  用户请求URL

2、  拦截器进行校验

如果请求的URL是公开地址(无需登录就能访问的URL),让放行。、

如果用户session不存在跳转到登录界面

如果用户session存在,继续操作

登录的controller方法

package com.jch.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class LoginController {

         // 登录

         @RequestMapping("login.jch")

         public String login(HttpSession session , String username , String password) {

                   // 调用service进行用户身份验证

                   // ...这里假设验证通过

                   // 在session中保存用户身份信息

                   session.setAttribute("username", username);

                   return "redirect:/register.jch"; // /为项目根目录

         }

         // 退出登录

         @RequestMapping("logout.jch")

         public String login(HttpSession session) {

                   // 清楚session数据

                   session.invalidate();

                   return "redirect:/login.jch";

         }

}

登录认证拦截的实现

代码实现

package com.jch.interceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

public class LoginInterceptor implements HandlerInterceptor{

         /**

          *  进入handler方法之前执行

          *  用于身份认证,身份校验

          *  比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不在向下执行

          */

         @Override

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

                   // TODO Auto-generated method stub

                   // 获取请求的URL

                   String url = request.getRequestURI();

                   // 判断是否是公开地址(实际使用将公开地址配置在配置文件中)这里公开地址就是登录提交的地址

                   if(url.indexOf("login.jch")>=0) {

                            // 如果要登录提交,那么放行

                            return true;

                   }

                   // 判断session

                   HttpSession session = request.getSession();

                   String username = (String)session.getAttribute("username");

                   if(username != null) {

                            // 有身份信息,放行

                            return true;

                   }

                   // 身份验证不通过跳转到登录界面

                   request.getRequestDispatcher("/views/home/login.jsp").forward(request, response);

                   System.out.println("这是第1个拦截器,preHandle方法");

                   return false;

         }

         /**

          *  进入handler之后,返回modelandview之前执行

          *  应用场景从modelandview出发,将共用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一制定视图

          */

         @Override

         public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

                            throws Exception {

                   // TODO Auto-generated method stub

                   System.out.println("这是第1个拦截器,postHandle方法");

         }

         /**

          *  执行handler完成执行此方法

          *  应用场景:统一异常处理,统一日志处理

          */

         @Override

         public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

                            throws Exception {

                   // TODO Auto-generated method stub

                   System.out.println("这是第1个拦截器, afterCompletion方法");

         }

}

配置拦截器

在springmvc的前端控制器配置文件中配置interceptor拦截器

<!-- 配置拦截器 -->

                 <mvc:interceptors>

                 <!-- 多个拦截器,顺序执行 -->

                           <!-- 登录认证拦截器 -->

                           <mvc:interceptor>

                                    <mvc:mapping path="/**"/><!-- 标识拦截所有的URL包括所有的子URL -->

                                    <bean class="com.jch.interceptor.LoginInterceptor"></bean>

                           </mvc:interceptor>

                 </mvc:interceptors>

启动Tomcat查看测试结果。

SpringMVC-拦截器做一个登录认证的小Demo的更多相关文章

  1. springboot+springmvc拦截器做登录拦截

    springboot+springmvc拦截器做登录拦截 LoginInterceptor 实现 HandlerInterceptor 接口,自定义拦截器处理方法 LoginConfiguration ...

  2. SpringMVC拦截器(实现登录验证拦截器)

    本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ ...

  3. SpringMVC拦截器实现用户登录拦截

    本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 1 < ...

  4. springmvc拦截器实现用户登录权限验证

    实现用户登录权限验证 先看一下我的项目的目录,我是在intellij idea 上开发的 1.先创建一个User类 package cn.lzc.po; public class User { pri ...

  5. springmvc拦截器的简单了解

    1.定义一个拦截器 2.在springmvc.xml中配置拦截器. (1)拦截器拦截的请求是建立在前端控制器配置之下的,若DispatcherServlet拦截的是*.action,则拦截器即使配置 ...

  6. SpringMVC 拦截器实现原理和登录实现

    SpringMVC 拦截器的原理图 springMVC拦截器的实现一般有两种方式 第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口 第二种方 ...

  7. springMVC使用拦截器检查用户登录

    参考文章 编写拦截器类 package cultivate_web.interceptor; import javax.servlet.http.HttpServletRequest; import ...

  8. Springboot中SpringMvc拦截器配置与应用(实战)

    一.什么是拦截器,及其作用 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对 ...

  9. 学习SpringMVC——拦截器

    拦截器,顾名思义就是用来拦截的. 那什么是拦截,又为什么要拦截.对于Spring MVC来说,拦截器主要的工作对象就是用户的请求,拦截下来之后,我们可以在拦截的各个阶段悉心呵护[为所欲为].常见的比如 ...

随机推荐

  1. android主流开源自动化框架(monkeyrunner,robotium,uiautomator)转载

    摘要: android自动化框架小结:monkey,monkeyrunner,cts,robotium,uiautomator android自动化框架: Uiautomator: 优点:可以对所有操 ...

  2. 如何隐藏WooCommerce Shop Page页面的标题

    有时我们不想显示WooCommerce Shop Page页面标题,如下图所示,需要如何操作呢?随ytkah一起来看看吧.在主题function.php文件中添加下面的代码就可以隐藏了 add_fil ...

  3. LeetCode 112. Path Sum路径总和 (C++)

    题目: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...

  4. 基于DFA算法、RegExp对象和vee-validate实现前端敏感词过滤

    面临敏感词过滤的问题,最简单的方案就是对要检测的文本,遍历所有敏感词,逐个检测输入的文本是否包含指定的敏感词. 很明显上面这种实现方法的检测时间会随着敏感词库数量的增加而线性增加.系统会因此面临性能和 ...

  5. 【转】Java代码编译过程简述

    转载:https://blog.csdn.net/fuzhongmin05/article/details/54880257. 代码编译是由Javac编译器来完成,流程如下图1所示: 图1 Javac ...

  6. Linux性能优化实战学习笔记:第五十讲

    一.上节回顾 上一节,我以 ksoftirqd CPU 使用率高的问题为例,带你一起学习了内核线程 CPU 使用率高时的分析方法.先简单回顾一下. 当碰到内核线程的资源使用异常时,很多常用的进程级性能 ...

  7. Shell脚本是什么、它是必需的吗?

    一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell脚本)来完成这些日常工作任务.

  8. git拆分仓库

    1.git filter-branch拆分当前分支 修改仓库目录,改成拆分后的结构 创建一个当前分支的拷贝分支 git filter-branch -f --tag-name-filter cat - ...

  9. 分布式RPC框架实现

    现在大部分的互联网公司都会采用微服务架构,但具体实现微服务架构的方式有所不同,主流上分为两种,一种是基于Http协议的远程调用,另外一种是基于RPC方式的调用.两种方式都有自己的代表框架,前者是著名的 ...

  10. nuget安装说明

    1.先百度安装nuget.server 比如 https://www.cnblogs.com/tomfang/articles/3999303.html 2.官网下载nuget.exe nuget p ...