SpringMVC框架六:拦截器
拦截器的概念就不介绍了:
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框架六:拦截器的更多相关文章
- SpringMVC框架05——拦截器
1.拦截器概述 Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证.记录请求信息的 ...
- springmvc框架使用拦截器实现301永久重定向,其实用过滤器应该是更好
做seo的朋友提出要求 所有不带www.的访问需要301到带www的域名,以集中权重 可以使用过滤器检查servername带不带www,也可以使用拦截器 不会配置过滤器,所以先用拦截器实现吧,不过我 ...
- SpringMVC中的拦截器、过滤器的区别、处理异常
1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...
- 【SpringMVC学习11】SpringMVC中的拦截器
Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- 9.springMVC中的拦截器
springMVC中的拦截器大概大致可以分为以下几个步骤去学习: 1.自定义一个类实现HandlerInterceptor接口,这里要了解其中几个方法的作用 2.在springMVC的配置文件中添加拦 ...
- springMVC的全局拦截器
先说说为什么要使用springMVC的全局拦截器,比如 当我们在访问接口的时候,我们一般都会先判断这个用户是否登陆,我们就要在每个接口的前面都要判断一下,想想是不是很蛋疼,那工作量... 这时候,我们 ...
- 针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题
一.针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题 首先,我们先来了解一下authc登录拦截器工作原理 authc拦截器有2个作用: 1>登录认证 请求进来时 ...
- SpringMVC 学习笔记(拦截器的配置))
在设置SpringMVC的拦截器时,需要在SpringMVC中配置 拦截器对象,拦截器的的对象要 实现 HandlerInterceptor 接口 拦截器类的设置: public class inte ...
- SpringMVC(AbstractController,拦截器,注解)
1.Controller接口及其实现类 Controller是控制器/处理器接口,只有一个方法handleRequest,用于进行请求的功能处理(功能处理方法),处理完请求后返回ModelAndVie ...
随机推荐
- Springmvc中@RequestMapping 属性用法归纳
简介: @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestM ...
- OO第二次作业总结
OO~第二次作业总结 连续三周的电梯作业结束了,总的来说这三次作业做的还算平稳,既没有被刀,也没有刀中别人.那么接下来开始谈谈我对这三次作业的认识. 一.设计策略 我三次作业的设计思路基本上是相同的, ...
- web网站使用qq第三方登录
Html代码: <a href=’/QQlogin’>qq登录</a> //后台代码: @RequestMapping(value = "/QQlogin" ...
- 字符串API练习三则
(1)按照Ascii码字典的顺序排列字符串.核心API:int compareTo(String),若大于则返回1,小于返回-1,等于返回0. class StringArray { static v ...
- 基于grafana+telegraf的服务器监控方案
准备工作:安装InfluxDb 1 Windows 1.1 下载agent https://dl.influxdata.com/telegraf/releases/telegraf-1.10 ...
- java中如何使用break跳出多重循环
java 中已知的三种跳出多重循环的方式: System.out.println("---------java中跳出多重循环的三种方式:---------"); System.ou ...
- app微信支付-java服务端接口 支付-查询-退款
个人不怎么看得懂微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然也可以自己写完打个jar包) 参数要用jdo ...
- Game Theory
HDU 5795 || 3032 把x个石子的堆分成非空两(i, j)或三堆(i, j, k)的操作->(sg[i] ^ sg[j])或(sg[i] ^ sg[j] ^ sg[k])是x的后继 ...
- C++二分图匹配基础:zoj1002 FireNet 火力网
直接给出题目吧... 问题 D(1988): [高级算法]火力网 时间限制: 1 Sec 内存限制: 128 MB 题目描述 给出一个N*N的网格,用'.'表示空地,用'X'表示墙.在网格上放碉堡,可 ...
- 采用Google预训bert实现中文NER任务
本博文介绍用Google pre-training的bert(Bidirectional Encoder Representational from Transformers)做中文NER(Name ...