拦截器概念

这里引用百度百科里面的说法,java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作

用途

  1. 日志记录:记录请求的一些信息和请求参数
  2. 权限校验:如登陆校验,管理员权限校验
  3. 性能监控:监控请求处理的时间
  4. 通用行为:如读取cookie信息等

配置Spring MVC拦截器

配置 dispatch-servlet.xml


<mvc:interceptors><!-- 如果在interceptors中配置bean,那么所有定义在这里的bean都会被拦截--><!--<bean></bean>--><mvc:interceptor><mvc:mapping path="/manage/**"/><!--过滤登陆死循环情况--><!--<mvc:exclude-mapping path="/manage/login.do"/>--><bean class="com.test.controller.common.interceptor.AuthorityInterceptor"/></mvc:interceptor></mvc:interceptors>
分析配置中的节点
  • interceptors节点:这个节点是SpringMVC的拦截器集配置节点,在这个节点里面我们可以声明多个interceptor
  • interceptor节点:这个节点是配置拦截路径以及你拦截器实现类的节点
    • mapping节点:符合mapping路径匹配的请求都会经过拦截器
    • exclude-mapping节点:符合exclude-mapping路径匹配的请求都不会经过拦截器
    • bean节点:配置我们自己的实现类,实现类要实现HandlerInterceptor接口
path情况分析
  1. 如果要拦截同一个controller下的所有的请求,如/manage/***.do,path应该为 /manage/*
  2. 如果要拦截请求路径为manage包下不同controller的所有请求,如 /manage/product/b.do/manage/order/list.do,path应该为/manage/**
  3. 如果想要某个请求不走拦截器,那么可以配置exclude-mappingpath应该为具体的url,准确到方法,如/manage/login.do
spring MVC拦截器请求流程
spring请求流程具体如下:
  1. 浏览器/客户端发送请求给我们的服务器
  2. 请求来到Spring的dispatchServlet进行请求分发
  3. dispatchServlet检查我们在dispatch-servlet.xml定义好的规则,按照规则判断请求是否走拦截器
  4. 如果判断请求不走拦截器,请求直接分发到对应的controller(这里默认有对应的controller)
  5. 如果判断请求是走拦截器的,就走我们自己实现的拦截器,验证请求,通过就放行,走到controller,反之则提前返回给客户端
spring请求流程图

实现拦截器示例(java)

这是自己实现的一个统一登陆校验拦截器,具体代码如下,写代码之前一定要根据自己的实际情况,把dispatch-servlet.xml中的拦截器路径配置好,不然拦截器无法正常工作

@Slf4j
public class AuthorityInterceptor implements HandlerInterceptor{@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info(("preCompletion"));//请求中controller的方法名HandlerMethod handlerMethod = (HandlerMethod)handler;//解析handlermethod//获取方法名String methodName = handlerMethod.getMethod().getName();//获取类名,simplename是获取名字不带包名,name是带包名的String className = handlerMethod.getBean().getClass().getSimpleName();//解析参数StringBuffer stringBuffer = new StringBuffer();Map paramMap = request.getParameterMap();Iterator it = paramMap.entrySet().iterator();while ((it.hasNext())){Map.Entry entry = (Map.Entry) it.next();String mapKey = (String) entry.getKey();String mapValue = "";//request的这个参数map的value返回的是一个String[]Object obj = entry.getValue();if (obj instanceof String[]){String[] strs = (String[])obj;mapValue = Arrays.toString(strs);}stringBuffer.append(mapKey).append("=").append(mapValue);}//判断登陆,如果是登陆就放行if(StringUtils.equals(className, UserManageController.class.getSimpleName())&&StringUtils.equals(methodName,"login")){//登陆的时候不能把参数的日志也打上,如果日志泄露,账号密码就会泄露log.info("权限拦截器拦截到的请求 className{} methodName{}",className,methodName);return true;}//判断登陆User user = session.getAttribute(Const.CURRENT_USER);if(user == null )){//未登录,返回false,不会调用controller里面的方法//response必须重置重置,否则会宝getWritter() has already been called for this response//这里我们手动接管了SpringMVC原生的返回,而是托管到拦截器中返回response.reset();//这是返回编码,否者会乱码response.setCharacterEncoding("UTF-8");//设置返回值类型response.setContentType("application/json;chartset=UTF-8");PrintWriter out = response.getWriter();out.print("你想返回的错误信息")}out.flush();out.close();return false;}return  true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info(("postCompletion"));}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info(("afterCompletion"));}
}

Spring MVC拦截器配置以及统一登陆校验实现相关推荐

  1. Spring mvc 拦截器 配置心得

    session超过时间自动跳转到登录页面.要求请求的每个url都要进行拦截,当然,js,css这些东西除外. spring-mvc.xml Xml代码   <!-- 拦截器配置 --> & ...

  2. Spring MVC拦截器~~~登陆验证拦截

    [ 30 分 钟 轻 松 入 门 Spring MVC][web 三 大 组 件 之 ~ ~ Filter 过 滤 器] Interceptor 拦截器学习: 1.了解spring mvc拦截器的概念 ...

  3. 使用session监听+spring MVC拦截器禁止用户重复登录

    在许多web项目中,需要禁止用户重复登录.一般来说有两种做法: 一是在用户表中维护一个字段isOnLine(是否在线),用户登录时,设定值为true,用户退出时设定为false,在重复登录时,检索到该 ...

  4. spring mvc拦截器_Spring MVC拦截器示例

    spring mvc拦截器 我认为现在是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示说:在传入的HTT ...

  5. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...

  6. spring mvc 拦截器拦截jsp页面

    spring mvc 拦截器怎么拦截jsp页面 你这个 是拦截带 /jsp 的 .do请求 解决方案 用spring 的拦截器 去拦截 所有的 .do 请求, 然后写一个 过滤器去拦截 所有的.jsp ...

  7. Java Spring MVC框架 VIII 之 Spring MVC拦截器

    Java Spring MVC框架 VIII 之 Spring MVC拦截器 Spring MVC拦截器 1.拦截器简介 拦截器是SpringMvc框架提供的功能 它可以在控制器方法运行之前或运行之后 ...

  8. spring mvc拦截器HandlerInterceptor

    本文主要介绍springmvc中的拦截器,包括拦截器定义和的配置,然后演示了一个链式拦截的测试示例,最后通过一个登录认证的例子展示了拦截器的应用 拦截定义 定义拦截器,实现HandlerInterce ...

  9. Spring MVC拦截器

    1.如何实现登录权限检查 使用session进行约定值的检查 实现方法: (1)使用Filter (2)使用Spring的拦截器 拦截器组件简介:Spring MVC特有组件,可以在调用Control ...

  10. 面试:给我说一下Spring MVC拦截器的原理?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/namaQ ...

最新文章

  1. 1.1 为什么需要 ML 策略-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  2. 课时 12:可观测性-监控与日志(莫源)
  3. miui 8.2 android版本下载,miui8系统
  4. Bitmap尺度变换
  5. telnet服务器响应慢,交换机s10508 telnet登录后上反应慢
  6. primefaces教程_Primefaces BlockUI组件示例教程
  7. 智能优化算法:鸟群算法-附代码
  8. asp html5 ajax,ASP – AJAX 与 ASP | 菜鸟教程
  9. 苹果屏幕上的小圆点_官网新增2个内购软件 ! iOS 14上最值得使用的5个好功能,你都会了吗?...
  10. Codeforce - 1040B - Shashlik Cooking(水题)
  11. 深度理解感受野(一)什么是感受野?
  12. android手机两年变卡,安卓手机用一两年就卡是通病,知道这几招,还可以用很久...
  13. 结庐在人境,而无车马喧
  14. 设计模式学习--观察者模式(Observer Pattern)
  15. TCP/IP协议号和端口
  16. R语言安装Sampling包
  17. 2021高考成绩排名查询河北,河北高考排名查询方法,2021年河北高考成绩位次全省排名查询...
  18. java数据结构20:Big Bang(链表的插入、删除、遍历和查找)
  19. vue2[黑马程序员]
  20. 高频DCDC电源减小EMI的布局技巧

热门文章

  1. 微信公众号发送模版消息 Java实现
  2. eclipse的安装与环境配置
  3. 软件项目开发文档 模板
  4. wireshark(2)- ethernet工具 xcap wireshark tcpdump
  5. 读书笔记-OpenCL编程指南 HelloWorld
  6. 蓝牙MESH学习笔记
  7. 【干货】java参考文献论文类
  8. PIFA-平面倒F天线[搬运]
  9. ezcad旋转轴标刻参数_激光打标机软件ezcad中菜单下的多文档标刻功能介绍及其操作设置...
  10. 酒店管理系统(前台后台管理)