拦截器的概念就不介绍了:

SpringMVC中拦截器的执行规则:

一个小示例展示:

我搞两个拦截器:

第一个:

package org.dreamtech.springmvc.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 Interceptor1 implements HandlerInterceptor { @Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("页面渲染后1"); } @Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("方法后1"); } @Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("方法前1");
return true;
} }

第二个:

package org.dreamtech.springmvc.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 Interceptor2 implements HandlerInterceptor { @Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("页面渲染后2"); } @Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("方法后2"); } @Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("方法前2");
return true;
} }

然后把它配置到SpringMVC.xml中:

    <!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置多个拦截器 -->
<mvc:interceptor>
<!-- 拦截所有 -->
<mvc:mapping path="/**" />
<!-- 自定义拦截器类 -->
<bean class="org.dreamtech.springmvc.interceptor.Interceptor1" />
</mvc:interceptor>
<mvc:interceptor>
<!-- 拦截所有 -->
<mvc:mapping path="/**" />
<!-- 自定义拦截器类 -->
<bean class="org.dreamtech.springmvc.interceptor.Interceptor2s" />
</mvc:interceptor>
</mvc:interceptors>

执行之后:

然而我们如果把拦截器一的方法前不放行:

    @Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("方法前1");
return false;
}

这时候,发现控制台只是打印了:方法前1

但是,我们如果把拦截器二的方法前不放行:

打印的却是:

到这里就可以看出SpringMVC的执行规则了:

为了方便,我借用某博主的图片:

文字解释:

preHandler按拦截器定义顺序调用,

postHandler按拦截器定义逆序调用,

afterCompletion按拦截器定义逆序调用,

postHandler在所有的拦截器返回成功时候才会调用,

afterCompletion在preHandler返回true才会调用

应用:

登录功能:只有登录才能查看其他信息

限制:在非登陆状态下无法访问该网站任何一处

随意写一个登录页面:

<body>
<form action="${pageContext.request.contextPath }/login.action" method="post">
用户名:<input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>

只用一个拦截器:

    <mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="org.dreamtech.springmvc.interceptor.Interceptor2" />
</mvc:interceptor>
</mvc:interceptors>

拦截器:

package org.dreamtech.springmvc.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 Interceptor2 implements HandlerInterceptor { @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
throws Exception { } @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
throws Exception { } @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
String requestURI = request.getRequestURI();
/*
* URI:/login.action
* URL:http://xxx/xxx/login.action
*/
if(!requestURI.contains("/login")){
String username = (String) request.getSession().getAttribute("USER_SESSION");
if(username==null){
response.sendRedirect(request.getContextPath()+"/login.action");
return false;
}
}
return true;
} }

实现:

    @RequestMapping(value = "/login.action", method = RequestMethod.GET)
public String login() {
return "login"; } @RequestMapping(value = "/login.action", method = RequestMethod.POST)
public String login(String username, HttpSession httpSession) {
httpSession.setAttribute("USER_SESSION", username);
return "redirect:/item/itemlist.action"; }

这里注意:我直接返回字符串:login是因为提前做了配置:

    <bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

SpringMVC框架六:拦截器的更多相关文章

  1. SpringMVC框架05——拦截器

    1.拦截器概述 Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证.记录请求信息的 ...

  2. springmvc框架使用拦截器实现301永久重定向,其实用过滤器应该是更好

    做seo的朋友提出要求 所有不带www.的访问需要301到带www的域名,以集中权重 可以使用过滤器检查servername带不带www,也可以使用拦截器 不会配置过滤器,所以先用拦截器实现吧,不过我 ...

  3. SpringMVC中的拦截器、过滤器的区别、处理异常

    1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...

  4. 【SpringMVC学习11】SpringMVC中的拦截器

    Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...

  5. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  6. 9.springMVC中的拦截器

    springMVC中的拦截器大概大致可以分为以下几个步骤去学习: 1.自定义一个类实现HandlerInterceptor接口,这里要了解其中几个方法的作用 2.在springMVC的配置文件中添加拦 ...

  7. springMVC的全局拦截器

    先说说为什么要使用springMVC的全局拦截器,比如 当我们在访问接口的时候,我们一般都会先判断这个用户是否登陆,我们就要在每个接口的前面都要判断一下,想想是不是很蛋疼,那工作量... 这时候,我们 ...

  8. 针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题

    一.针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题 首先,我们先来了解一下authc登录拦截器工作原理 authc拦截器有2个作用: 1>登录认证     请求进来时 ...

  9. SpringMVC 学习笔记(拦截器的配置))

    在设置SpringMVC的拦截器时,需要在SpringMVC中配置 拦截器对象,拦截器的的对象要 实现 HandlerInterceptor 接口 拦截器类的设置: public class inte ...

  10. SpringMVC(AbstractController,拦截器,注解)

    1.Controller接口及其实现类 Controller是控制器/处理器接口,只有一个方法handleRequest,用于进行请求的功能处理(功能处理方法),处理完请求后返回ModelAndVie ...

随机推荐

  1. 将python文件打包成exe可运行文件

    https://blog.csdn.net/douzhenwen/article/details/78886244

  2. 装了SVN软件,但是文件夹没有绿色和红色的图标显示

    第一步: win+R,输入regedit,打开注册表.查找ShellIconOverlayIdentifiers,可以找到Tortoise相关的标签,这个时候会发现,这些标签都排在后面.需要在这些标签 ...

  3. pd16.5增加字段备注

    EXEC sp_addextendedproperty 'MS_Description', %.q:COLNNAME%, 'user', dbo, 'table', %TABLE%, 'column' ...

  4. parseInt ,parseDouble,parseFloat

    转载https://www.cnblogs.com/originate918/p/6377616.html

  5. kbmmw 5.08 正式发布

    欢迎大家围观. Important notes (changes that may break existing code)         ============================= ...

  6. C#应用NPOI实现导出EXcel表格中插入饼状图(可实现动态数据生成)

    一.思路:   1.excel是可以通过NPOI插入图片的: 2.C#通过NPOI生成饼状图: 3.把生成的饼状图以字节流的形式插入到表格 二.看代码: #region 生成饼图图例 /// < ...

  7. sjms-2 创建型模式

    设计模式分类 创建型模式(5种):工厂方法模式.抽象工厂模式.创建者模式.原型模式.单例模式结构型模式(7种):适配器模式.桥模式.组合模式.装饰模式.外观模式.享元模式.代理模式行为型模式(11种) ...

  8. eclipse 无法记住svn密码

    每次要求输入密码,很恼人.经过一番折腾,在stackoverflow上找到了解决方案,上面大神果然多 简单的说,就是通过查看工作空间的日志文件,发现报了个java异常,缺少一个class文件(org. ...

  9. 数据库的Connection、Cursor两大对象

    Python 数据库图解流程 Connection.Cursor比喻 Connection()的参数列表 host,连接的数据库服务器主机名,默认为本地主机(localhost). user,连接数据 ...

  10. 《Serverless架构-无服务单页应用开发》读后感

    本书的作者是[美]Ben Rady,译者郑赞美.简传挺,书中作者详细的介绍了如何使用html.js以及amazon提供的诸多云服务(Simple Storage Service(S3).Cognito ...