Spring MVC Handler拦截器用例

Spring MVC HandlerInterceptor Example


在这里我将使用 WebMvcConfigurerAdapter 编写一个 HandlerInterceptor 的用例.

Spring HandlerInterceptor 与 Servlet 过滤器类似, Servlet 过滤器更强大些, 不过它只能在 web.xml 中配置( 正如对 DispatcherServlet 的配置一样, 译者注 ), 而 HandlerInterceptor 可通过 Spring 应用上下文 xml 文件和 Java 代码配置, HandlerInterceptor 可以用来避免重复的处理程序代码, 比如用作认证检测, 区域检查等不同用途.

在 Java 中, 我们可以重写 WebMvcConfigurerAdapter#addInterceptors( InterceptorRegistry ) 方法, 该回调方法在参数中提供了一个 InterceptorRegistry 对象,

使用 InterceptorRegistry#addInterceptor( HandlerInterceptor ) 方法可以向 Spring 注入 HandlerInterceptor 接口, 该接口有适配器 HandlerInterceptorAdapter.

InterceptorRegistry#addInterceptor( HandlerInterceptor ) 方法返回一个 InterceptorRegistration,允许您进一步配置已注册的拦截器,例如添加应该应用的URL模式。

On this page we will provide Spring MVC HandlerInterceptor example with WebMvcConfigurerAdapter. Spring HandlerInterceptor works similar to the Servlet Filter. Servlet filters are more powerful than Spring HandlerInterceptor. Servlet Filters are configured in web.xml and Spring HandlerInterceptor is configured in Spring application context xml file or Java configuration. Spring HandlerInterceptor can be used to avoid repetitive handler code. We can use HandlerInterceptor for different purposes like authorization checks, locale checks etc. In java configuration, WebMvcConfigurerAdapter has a method as addInterceptors in which InterceptorRegistry is passed as an argument. Using InterceptorRegistry.addInterceptor(), we add our interceptors and using InterceptorRegistry.addInterceptor().addPathPatterns(), we provide path pattern specific to given interceptor. If an interceptor has not been provided with any path pattern, it is called for each request. Spring provides HandlerInterceptorAdapter adapter class for implementing only required handler methods of HandlerInterceptor. HandlerInterceptor has three methods.

HandlerInterceptor 接口有三个方法:

preHandle(): It is executed before actual handler is executed. 在实际处理之前执行, 返回值是布尔类型, false 取消处理
postHandle(): It is executed after handler is executed. 在实际处理之后执行
afterCompletion(): It is executed after the complete request is finished.  在完成请求后执行
也就是说, 你可能这样重写 WebMvcConfigurerAdapter :
import ...@EnableMvc
@ComponetScan(basePackageClasses = { Index.class })
public final class MyWebAppInitializer extends WebConfigAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor( new HandlerInterceptorAdapter() {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true; // 继续处理}}).addPathPatterns("/*", "/*.jpg");//}...
}

如果不调用 addPathPatterns( String... ) , 则会匹配所有 RequestMapping


Spring 过滤器用例

javax.servlet
Interface Filter
All Known Implementing Classes:
GenericFilter, HttpFilter

default void    destroy()
//Called by the web container to indicate to a filter that it is being taken out of service.void    doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
//The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.default void    init(FilterConfig filterConfig)
//Called by the web container to indicate to a filter that it is being placed into service.

实现效果:

package club.init;import java.io.IOException;
import java.util.Enumeration;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class StaticResourceFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {intercept((HttpServletRequest)request, (HttpServletResponse)response, chain);}public void intercept(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {// 添加服务器名try {response.addHeader("Server", "Fast Tomcat");} catch (Exception e) {e.printStackTrace();}// 获取 referEnumeration<String> headers = request.getHeaderNames();String refer = null;String content = "GET " + request.getRequestURI() + "\n";while (headers.hasMoreElements()) {String header = headers.nextElement();content += String.format("%s : %s\n", header, request.getHeader(header));if ("referer".equals(header)) {refer = request.getHeader(header);break;}}Log.d(content);if (request.getRequestURI().matches(".*\\..+")) {// 静态资源if (refer == null || !refer.matches("https?://abc.com/.*")) {response.setStatus(404);response.addHeader("Error", "You can't use this resource without abc.com");return;}response.addHeader("Content-Disposition", String.format("attachment; filename*=UTF-8''%s", request.getRequestURI().replaceAll(".*/", "")));}try {chain.doFilter(request, response);} catch (IOException | ServletException e) {e.printStackTrace();}}}

最好使用 HttpFilter 这个类

这里有一个使用过滤器的项目: https://github.com/develon2015/Spring-filter


转载于:https://www.cnblogs.com/develon/p/11503814.html

Spring Servlet 拦截器 过滤器相关推荐

  1. spring boot拦截器 过滤器

    1.拦截器 登录拦截 自定义拦截路径 //全局配置继承WebMvcConfigurer接口 @Configuration public class MyHandler implements WebMv ...

  2. spring拦截器-过滤器的区别

    1.  理解 拦截器 :是在面向切面编程的时候,在你的 service 或者一个方法前调用一个方法,或者在方法后调用一个方法:比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业 ...

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

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

  4. java过滤器原理,拦截器,过滤器,监听器 区别及执行顺序

    本文引用该作者(花开半夏)著作内容,觉得写的很好,记录一下便于回看防止失踪,更多详情请查看原作者. 同时还搜罗了其他便于理解的博文感兴趣的可以看看促进理解 拦截器,过滤器,监听器执行顺序(被拦截个人过 ...

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

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

  6. Spring Boot拦截器(WebMvcConfigurerAdapter)

    直接按我的步骤走都没有问题: 1 配置自定义的拦截器: package com.configs;import org.slf4j.Logger; import org.slf4j.LoggerFact ...

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

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

  8. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

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

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

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

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

最新文章

  1. 粒子滤波在图像跟踪领域的实践
  2. javascript读取txt_JavaScript编程语言学习笔记——编程
  3. java 使用jasper_使用Jasper Reports以Java创建报告
  4. ZJU期末考试记录(研究生)——数据挖掘
  5. “双十一”即将来临,先来看看快递物流企业的大数据
  6. 算法导论-堆排序习题解
  7. 微软自带报ocienvcreate失败_微软推出的免费神器,治好了我的拖延症!
  8. 时尚高端电商网页设计素材
  9. 设计软件哪里找?图片素材哪里找?
  10. 计划任务文件 linux,Linux计划任务Crontab学习笔记(3):配置文件
  11. MySQL数据库修改密码忘记密码
  12. 如何用EasyRecovery找回删除的文档(附注册机下载地址)
  13. syn重发_TCP/IP中SYN,FIN的缩写意思
  14. win7网络里计算机登录失败,Win7访问网上邻居提示“登陆失败”原因及解决方法...
  15. 华为云上传docker镜像
  16. ACA云原生3阿里云容器产品体系
  17. static变量和普通变量的区别
  18. eBay 大数据平台的 HDFS 性能优化实践
  19. 城固一中2021高考成绩查询,汉中市各高中2020年高考喜报成绩一览
  20. 18山东省夏令营游记

热门文章

  1. 数据库 备份 压缩
  2. Affinity Designer 查询面板渐变颜色
  3. SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化(进阶篇)
  4. 帮你轻松理解Commonjs、AMD、CMD、ES6的区别
  5. ExecutorService中submit和execute、Runnable和Callable
  6. C++17特性一览(转载)
  7. vba自动生成html,动态生成嵌入在VBA电子邮件生成中的HTML表
  8. Vmware使用net模式共享虚拟机linux IP
  9. (day 15 - 双指针)剑指 Offer 18. 删除链表的节点
  10. 计算机集群用什么网络,什么是计算机系统集群?