Spring MVC 拦截器
1.DispatcherServlet
SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet。
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理。 所以我们现在web.xml中加入以下配置:
<!-- 初始化 DispatcherServlet时,该框架在 web应用程序WEB-INF目录中寻找一个名为[servlet-名称]-servlet.xml的文件, 并在那里定义相关的Beans,重写在全局中定义的任何Beans --> <servlet> <servlet-name>springMybatis</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMybatis</servlet-name> <!-- 所有的的请求,都会被DispatcherServlet处理 --> <url-pattern>/</url-pattern> </servlet-mapping>
2.静态资源不拦截
如果只配置拦截类似于*.do格式的url,则对静态资源的访问是没有问题的,但是如果配置拦截了所有的请求(如我们上面配置的“/”),就会造成js文件、css文件、图片文件等静态资源无法访问。
一般实现拦截器主要是为了权限管理,主要是拦截一些url请求,所以不对静态资源进行拦截。要过滤掉静态资源一般有两种方式,
第一种是采用<mvc:default-servlet-handler />,(一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomcat的defaultServlet来处理静态文件,在web.xml里配置如下代码即可:)
<!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css -->
<!-- 不拦截静态文件 -->
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/js/*</url-pattern> <url-pattern>/css/*</url-pattern> <url-pattern>/images/*</url-pattern> <url-pattern>/fonts/*</url-pattern>
</servlet-mapping>
Tomcat, Jetty, JBoss, and GlassFish 默认 Servlet的名字 -- "default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字 -- "FileServlet"
WebSphere 默认 Servlet的名字 -- "SimpleFileServlet"
如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:
<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />
第二种是采用<mvc:resources />,在springmvc的配置文件中加入以下代码:
<mvc:resources mapping="/js/**" location="/static_resources/javascript/"/>
<mvc:resources mapping="/styles/**" location="/static_resources/css/"/>
<mvc:resources mapping="/images/**" location="/static_resources/images/"/>
3.自定义拦截器
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法。preHandle在业务处理器处理请求之前被调用,
postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。所以要想实现自己的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。
首先在springmvc.xml中加入自己定义的拦截器我的实现逻辑CommonInterceptor,
<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors> <mvc:interceptor> <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller --> <mvc:mapping path="/" /> <mvc:mapping path="/user/**" /> <mvc:mapping path="/test/**" /> <bean class="com.alibaba.interceptor.CommonInterceptor"></bean> </mvc:interceptor> <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
我的拦截逻辑是“在未登录前,任何访问url都跳转到login页面;登录成功后跳转至先前的url”,具体代码如下:
/** * */
package com.alibaba.interceptor; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.alibaba.util.RequestUtil; /** * @author tfj * 2014-8-1 */
public class CommonInterceptor extends HandlerInterceptorAdapter{ private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class); public static final String LAST_PAGE = "com.alibaba.lastPage"; /* * 利用正则映射到需要拦截的路径 private String mappingURL; public void setMappingURL(String mappingURL) { this.mappingURL = mappingURL; } */ /** * 在业务处理器处理请求之前被调用 * 如果返回false * 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 * 如果返回true * 执行下一个拦截器,直到所有的拦截器都执行完毕 * 再执行被拦截的Controller * 然后进入拦截器链, * 从最后一个拦截器往回执行所有的postHandle() * 接着再从最后一个拦截器往回执行所有的afterCompletion() */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if ("GET".equalsIgnoreCase(request.getMethod())) { RequestUtil.saveRequest(); } log.info("==============执行顺序: 1、preHandle================"); String requestUri = request.getRequestURI(); String contextPath = request.getContextPath(); String url = requestUri.substring(contextPath.length()); log.info("requestUri:"+requestUri); log.info("contextPath:"+contextPath); log.info("url:"+url); String username = (String)request.getSession().getAttribute("user"); if(username == null){ log.info("Interceptor:跳转到login页面!"); request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); return false; }else return true; } /** * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 * 可在modelAndView中加入数据,比如当前时间 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("==============执行顺序: 2、postHandle================"); if(modelAndView != null){ //加入当前时间 modelAndView.addObject("var", "测试postHandle"); } } /** * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 * * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion() */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("==============执行顺序: 3、afterCompletion================"); } }
注:上述代码里我写了一个RequestUtil,主要实现获取当前Request、Session对象,保存和加密页面,取出等功能。
至此,拦截器已经实现了,效果如图:
我直接访问/test/hello,会被拦截
转载于:https://www.cnblogs.com/skyLogin/p/6577221.html
Spring MVC 拦截器相关推荐
- 使用session监听+spring MVC拦截器禁止用户重复登录
在许多web项目中,需要禁止用户重复登录.一般来说有两种做法: 一是在用户表中维护一个字段isOnLine(是否在线),用户登录时,设定值为true,用户退出时设定为false,在重复登录时,检索到该 ...
- spring mvc拦截器_Spring MVC拦截器示例
spring mvc拦截器 我认为现在是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示说:在传入的HTT ...
- Spring MVC拦截器~~~登陆验证拦截
[ 30 分 钟 轻 松 入 门 Spring MVC][web 三 大 组 件 之 ~ ~ Filter 过 滤 器] Interceptor 拦截器学习: 1.了解spring mvc拦截器的概念 ...
- 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
[Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...
- Java Spring MVC框架 VIII 之 Spring MVC拦截器
Java Spring MVC框架 VIII 之 Spring MVC拦截器 Spring MVC拦截器 1.拦截器简介 拦截器是SpringMvc框架提供的功能 它可以在控制器方法运行之前或运行之后 ...
- spring mvc 拦截器拦截jsp页面
spring mvc 拦截器怎么拦截jsp页面 你这个 是拦截带 /jsp 的 .do请求 解决方案 用spring 的拦截器 去拦截 所有的 .do 请求, 然后写一个 过滤器去拦截 所有的.jsp ...
- Spring MVC拦截器
1.如何实现登录权限检查 使用session进行约定值的检查 实现方法: (1)使用Filter (2)使用Spring的拦截器 拦截器组件简介:Spring MVC特有组件,可以在调用Control ...
- Spring MVC拦截器示例
我以为是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示进行操作:在传入的HTTP请求到达您的Spring ...
- Spring MVC拦截器实现
到这段时, 想起来了以前学底层一些的servlet & jsp技术时, 过滤器和拦截器也有相关实现, 但比起来,spring的实现,可用性高很多. 其它代码不再放上来, 只放拦截器实现和xml ...
- 面试:给我说一下Spring MVC拦截器的原理?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/namaQ ...
最新文章
- (转)动态SQL和PL/SQL的EXECUTE IMMEDIATE选项
- Openstack迁移DDH最佳实践
- smarty模板引擎总结六配置网站title,keywords,description
- screen实现关闭ssh之后继续运行代码
- linux location root访问文件夹404_如何使网站支持https访问?nginx配置https证书
- 计算机编程竞赛怎么入门,acm编程比赛入门题目集..pdf
- oem718d 基准站设置_诺瓦泰NovAtel OEM718D全系统多频单机测向板卡
- [BZOJ1006]神奇的国度
- fx2n4ad模块中文手册_三菱PLC特殊功能模块FX2N-4AD实用程序讲解
- android平板电脑的虚拟键盘,苹果平板电脑ipad虚拟键盘介绍 ipad虚拟键盘使用方法【详解】...
- smss,lsass, http://laji.xrlyy.com病毒处理
- Node.js版-七夕无事,人艰勿拆,求别说...
- 《蔡康永的说话之道》-[中]蔡康永
- java下载basic_Java-basic(1)
- 计算机用户名和密码在哪个文件夹,登陆邮箱、论坛等的帐号和密码存放在电脑中的哪个文件夹中?...
- 如何将ios键盘返回由英文设置成中文
- 2022年,送给程序员的运动健身知识
- Google advertiser api开发概述——入门指南
- appcan.frame.open打开的浮空窗口页面不开启弹动的情况下,也会有微微的滑动bug...
- 查看HDFS文件系统数据的三种方法
热门文章
- 删库跑路大神的一生:曾在家造炸弹被捕,现卖房押宝NFT,原是开源创业之星...
- Waymo无人车高层动荡:CFO今日也走了,半年已失8名高管
- 「树莓派+1万块乐高」打造乐高分类器,树莓派官方转发,网友:我想借来用两天...
- 一路撑起支付宝的OceanBase数据库,背后究竟有哪些杀手锏?| 云·创课程报名
- 用飞桨做自然语言处理:神经网络语言模型应用实例
- jQuery操作input
- iOS开发之设计模式篇
- 360浏览器、chrome开发扩展插件教程(2)为html添加行为
- SSE eventSource简介
- maven scala plugin 实现jvmArgs,执行过程原理解析笔记