Spring MVC 中 HandlerInterceptorAdapter过滤器的使用

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。 
Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 

Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

 

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。 
Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

 

 

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)    throws Exception {    return true;    }    public void postHandle(    HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)    throws Exception {    }    public void afterCompletion(    HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)    throws Exception {    }  

 

 

 

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面) 
在preHandle中,可以进行编码、安全控制等处理; 
在postHandle中,有机会修改ModelAndView; 
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。 

如果基于xml配置使用Spring MVC,
可以利用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping进行Url映射(相当于struts的path映射)和拦截请求(注入interceptors),
如果基于注解使用Spring MVC,可以使用DefaultAnnotationHandlerMapping注入interceptors。
注意无论基于xml还是基于注解,HandlerMapping bean都是需要在xml中配置的。 

一个demo: 
在这个例子中,我们假设UserController中的注册操作只在9:00-12:00开放,那么就可以使用拦截器实现这个功能。 

 

 

 

public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {    private int openingTime;    private int closingTime;    private String mappingURL;//利用正则映射到需要拦截的路径    public void setOpeningTime(int openingTime) {    this.openingTime = openingTime;    }    public void setClosingTime(int closingTime) {    this.closingTime = closingTime;    }    public void setMappingURL(String mappingURL) {    this.mappingURL = mappingURL;    }    @Override    public boolean preHandle(HttpServletRequest request,    HttpServletResponse response, Object handler) throws Exception {    String url=request.getRequestURL().toString();    if(mappingURL==null || url.matches(mappingURL)){    Calendar c=Calendar.getInstance();    c.setTime(new Date());    int now=c.get(Calendar.HOUR_OF_DAY);    if(now<openingTime || now>closingTime){    request.setAttribute("msg", "注册开放时间:9:00-12:00");    request.getRequestDispatcher("/msg.jsp").forward(request, response);    return false;    }    return true;    }    return true;    }    
}    

xml配置:

 

<bean id="timeBasedAccessInterceptor" class="com.spring.handler.TimeBasedAccessInterceptor">    <property name="openingTime" value="9" />    <property name="closingTime" value="12" />    <property name="mappingURL" value=".*/user\.do\?action=reg.*" />    
</bean>    
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">    <property name="interceptors">    <list>    <ref bean="timeBasedAccessInterceptor"/>    </list>    </property>    
</bean>  


这里我们定义了一个mappingURL属性,实现利用正则表达式对url进行匹配,从而更细粒度的进行拦截。当然如果不定义mappingURL,则默认拦截所有对Controller的请求。 

 

UserController:

 

@Controller    
@RequestMapping("/user.do")    
public class UserController{    @Autowired    private UserService userService;    @RequestMapping(params="action=reg")    public ModelAndView reg(Users user) throws Exception {    userService.addUser(user);    return new ModelAndView("profile","user",user);    }    // other option ...    
}    

这个Controller相当于Struts的DispatchAction 

你也可以配置多个拦截器,每个拦截器进行不同的分工. 

 

 

我们项目里面的例子

 


 

 

package com.shishuo.studio.filter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import com.shishuo.studio.entity.User;
import com.shishuo.studio.exception.CookieNotFoundException;
import com.shishuo.studio.service.UserService;
import com.shishuo.studio.util.CookieUtils;/*** @author Herbert 拦截器的实现*/
@Component
public class AuthInterceptor implements HandlerInterceptor {@Autowiredprivate UserService userService;public void afterCompletion(HttpServletRequest request,HttpServletResponse respone, Object object, Exception exception)throws Exception {// TODO Auto-generated method stub}public void postHandle(HttpServletRequest request,HttpServletResponse response, Object object,ModelAndView modelAndView) throws Exception {}public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {try {User user = userService.getUserById(request);if (userService.checkAuth(user, request, response)) {return true;} else {response.sendRedirect("/user/login.htm");return false;}} catch (Exception e) {e.printStackTrace();}response.sendRedirect("/user/login.htm");return false;}
}

 

package com.shishuo.studio.filter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import com.shishuo.studio.service.CategoryService;/*** @author Herbert* */
@Component
public class GlobalInterceptor implements HandlerInterceptor {@Autowiredprivate CategoryService categoryService;@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {return true;}@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {if (null == modelAndView) {return;}// 系统配置参数modelAndView.addObject("categoryList",categoryService.getCategoryListOfDisplayByFatherId(0));}@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {// TODO Auto-generated method stub}}

 

package com.shishuo.studio.filter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import com.shishuo.studio.entity.User;
import com.shishuo.studio.entity.vo.StudioVo;
import com.shishuo.studio.exception.StudioNotFoundException;
import com.shishuo.studio.service.StudioService;
import com.shishuo.studio.service.UserService;/*** @author Herbert* */
@Component
public class StudioInterceptor implements HandlerInterceptor {@Autowiredprivate StudioService studioService;@Autowiredprivate UserService userService;@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {User user = userService.getUserById(request);try {StudioVo studio = studioService.getStudioById(user.getUserId());return true;} catch (StudioNotFoundException e) {response.sendRedirect("/auth/teacher/studio.htm");return false;}}@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {}
}

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7部必看的纪录片,每一部都堪称经典,让人叹为观止!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片的一大重要意义&#xff0c;就在于它能将我们的视野和脚步&#xff0c;引向我们无法企及的地方和领域&#xff0c;又能让那些我们曾经到过的地方、经历过的人事&#xff0c;变得更有深意。今天&#xff0c;就给大家分享7部顶级纪录…

通过SQL Server操作MySQL的步骤和方法

在多种数据库环境下&#xff0c;经常会遇见在不同数据库之间转换数据和互相进行操作的情况。以下简要介绍下用SQL Server操作MySQL的步骤和方法。 1 操作前的准备 1.1 安装MySQL驱动 想要在SQL Server中操作MySQL&#xff0c;首先要在SQL Server所在的服务器上安装MySQL的驱动。…

ubuntu 新增mysql用户_Ubuntu中给mysql添加新用户并分配权限

一.Ubuntu下启动mysql方法&#xff1a;/etc/init.d/sudo mysqld二.用户添加bingt;mysql -u rootmysqlgt; grant 权限1,权限2,...权限n on一.Ubuntu下启动mysql方法&#xff1a;/etc/init.d/sudo mysqld二.用户添加bin>mysql -u rootmysql> grant 权限1,权限2,...权限n on…

ABP Framework 5.0 RC.1 新特性和变更说明

.Net 6.0 发布之后&#xff0c;ABP Framework 也在第一时间进行了升级&#xff0c;并在一个多星期后&#xff08;2021-11-16&#xff09;发布了 5.0 RC.1 &#xff0c;新功能和重要变更基本已经确定。5.0版本新特性5.0版本新特性列表&#xff1a;•静态 C# 和 JavaScript 客户端…

技术成长的困扰

学习知识的来源都是微信公众号、微博、博客&#xff0c;太碎片化&#xff0c;造成的结果是没有自己的知识体系&#xff0c;不能从整个知识结构层面去看待问题。转载于:https://www.cnblogs.com/samniu/p/5147191.html

mysql分页原理和sqlserver里面序列的用法

mysql使用经验 1.比如分页 select * from table limit 6 和select * from table limit 0,6 等价select * from table limit 5,10&#xff1b; 一般前面的5放的是 漂移 后面的10放的是 一页多少行 拿到数据库 table里面的数据是 第6条到15条 42.121.56.21sqlserver里面序列的用…

土木工程到底有多惨?哭了哭了......

1 那我要去女寝当宿管&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 别说了快哭了▼3 今夜我们都是尾款人▼4 童叟无欺&#xff0c;与图片完全一致▼5 好样的&#xff0c;兄弟&#xff01;▼6 土木工程有多惨&#xff1f;&#xff08;素材来源网络…

基于ip tunnel连接不同三个不同网络的×××

就以公司的环境来测试&#xff1a; 局域网网段为192.168.0.0/24 公司linux网关服务址器地绑定两块网卡 内网为192.168.0.3&#xff08;作为局域网的网关&#xff09;公网IP地址为&#xff1a;111.111.111.111 机房内网网段为10.10.0.0/16 一台服务器绑有两块网卡 内网地址…

Easy UI中dategrid的getSelections方法只能获取一个id的解决办法

解决方案&#xff1a;检查idField属性值是否与json数据中的id相同(区分大小写) 实在不行就 去掉 idField属性 也可以解决问题 具体效果请看图&#xff1a; 转载于:https://www.cnblogs.com/hanfeng1949/archive/2013/05/28/3104288.html

java合并list_怎么把两个list合并

第二步骤&#xff1a;list添加set集合1、在实际使用中addAll方法也可以将set集合中的内容添加到list中2、实际代码如下所示&#xff1a;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;public class ListTest {public stati…

mybatis和hibernate的对比总结

mybatis和hibernate 第一步&#xff0c; 首先让我们对mybatis和hibernate对比了解下 1、 Hibernate &#xff1a;Hibernate 是当前非常流行的ORM框架&#xff0c;对数据库结构提供了较为完整的封装&#xff0c;都是为了简化Dao层的操作。Mybatis&#xff1a;Mybatis同…

.NET 6新特性试用 | Controller支持IAsyncDisposable

前言在.NET中&#xff0c;拥有非托管资源的类通常会实现IDisposable接口&#xff0c;以提供一种同步释放非托管资源的机制。但是&#xff0c;在某些情况下&#xff0c;需要提供一种异步机制来释放非托管资源&#xff0c;这时候可以实现IAsyncDisposable接口。在实现此接口后&am…

ngnix之rewrite

2019独角兽企业重金招聘Python工程师标准>>> REWITE重写[rootlocalhost nginx]# cd conf[rootlocalhost conf]# lsfastcgi.conf koi-win scgi_paramsfastcgi.conf.default mime.types scgi_params.defaultfastcgi_params …

【转】服务器维护工程师悲惨的一个星期

2012.5.11 17点40分,接到**科技部的电话,告诉我IBMX346的服务器同时坏了2块SCSI146G硬盘,现在系统进不去了.问我周六周日能否去修复,和我的领导沟通后明确要周一才能拿到配件. 周一11点才拿到2块SCSI 146G硬盘,匆忙赶去该行,还好不要数据恢复,估计不是很重要的业务,吃完中饭之后…

清华博士生放弃科研,跑去当中学教师,值得吗?

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;科学网博客 作者&#xff1a;程代展原清华大学程代展教授数年前发表博文《昨夜无眠&#xff0c;为了一个学生》&#xff0c;叙述一个亲传徒弟转行的事情。该文曾激起对科研有兴趣的网友的关注&#xff0c;也引发了人…

6、基本查询操作

在数据库的操作中&#xff0c;开发人员或者用户为了取得数据记录&#xff0c;需要检索数据表中的信息。在SQL语句中&#xff0c;检索数据记录是通过SELECT语句来完成的。SELECT语句可以检索数据表或者视图中的数据&#xff0c;并将查询出来的数据以结果集的形式显示出来。 1.查…

java web容器_Java Web容器安全

这里的Java Web容器特指Tomcat&#xff0c;Tomcat依然是最流行的Java Web容器&#xff0c;你大爷还是你大爷。本文并不涉及业务层面上的安全控制&#xff0c;只针对Tomcat自身所支持的相关安全控制功能与特性。首先看一下Web容器的四个基本安全特性验证 Authentication资源访问…

C# 中如何一次 catch 多个异常?

咨询区 Michael Stum&#xff1a;在项目开发中当抛出异常时&#xff0c;我会简单的用 System.Exception&#xff0c;但这种会捕获所有的异常&#xff0c;我不希望大一统&#xff0c;我只想捕获我预知的几个异常&#xff0c;然后在这里处理一些特定的业务逻辑。目前我只能这么实…

堆和堆排序

在讨论「堆排序」之前&#xff0c;先复习一下「选择排序」。 void SelectionSort(int a[], size_t n) {for (size_t i 0; i < n; i) {// 在剩余元素中找出最小的一个&#xff0c;然后与 a[i] 交换。size_t k i;for (size_t j i1; j < n; j) {if (a[j] < a[k]) {k …

Android之二维码生成和识别

二维码 1、ZXing库介绍 这里简单介绍一下ZXing库。ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。目前支持以下格式:UPC…