springMVC4(16)拦截器解析与登陆拦截模拟
在SpringMVC中,我们会常常使用到拦截器,尽管SpringAOP也能帮我们实现强大的拦截器功能,但在Web资源供给上。却没有SpringMVC来得方便快捷。
使用SpringMVC拦截器的核心应用场景是依据我们的实际需求,个性化定制拦截器,再对特定url进行拦截处理。
而自己定义拦截器。首先须要我们实现HandlerInterceptor拦截器接口。以下是它的定义:
package org.springframework.web.servlet;
public interface HandlerInterceptor {
//在控制器方法调用前运行
//返回值为是否中断。true,表示继续运行(下一个拦截器或处理器)
//false则会中断兴许的全部操作。所以我们须要使用response来响应请求
boolean preHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler)
throws Exception;
//在控制器方法调用后,解析视图前调用。我们能够对视图和模型做进一步渲染或改动
void postHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView)
throws Exception;
//整个请求完毕,即视图渲染结束后调用。这个时候能够做些资源清理工作,或日志记录等
void afterCompletion(
HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex)
throws Exception;
}
非常多时候,我们仅仅须要实现以上三个方法的随意一个或两个。这个时候我们能够选择继承HandlerInterceptorAdapter。
它实现了AsyncHandlerInterceptor接口,为每一个方法提供了空实现,这样。我们就能够依据需求重写自己用到的拦截方法就可以。具体定义例如以下:
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
@Override
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
}
@Override
public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
@Override
public void afterConcurrentHandlingStarted(
HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
}
}
相对于HandlerInterceptor,HandlerInterceptorAdapter多了一个实现方法afterConcurrentHandlingStarted()。它来自HandlerInterceptorAdapter的直接实现类AsyncHandlerInterceptor,AsyncHandlerInterceptor接口直接继承了HandlerInterceptor。并新添了afterConcurrentHandlingStarted()方法用于处理异步请求,当Controller中有异步请求方法的时候会触发该方法时,异步请求先支持preHandle、然后运行afterConcurrentHandlingStarted。异步线程完毕之后运行preHandle、postHandle、afterCompletion。
以下我们以登陆请求为例。编写我们的自己定义拦截器:
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {
// 获得请求路径的uri
String uri = request.getRequestURI();
// 进入登录页面,推断session中是否有key。有的话重定向到首页。否则进入登录界面
if(uri.contains("login")) {
if(request.getSession().getAttribute("user") != null) {
response.sendRedirect(request.getContextPath());//默认跟路径为首页
} else {
return true;//继续登陆请求
}
}
// 其它情况推断session中是否有key,有的话继续用户的操作
if(request.getSession().getAttribute("user") != null) {
return true;
}
// 最后的情况就是进入登录页面
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
}
以下是我们的拦截器配置:
<mvc:interceptors>
<mvc:interceptor><!--配置局部拦截器,须要满足下列路径条件-->
<mvc:exclude-mapping path="/user/logout"/><!--注销-->
<mvc:exclude-mapping path="/home/"/><!--在home中定义了无须登陆的方法请求,直接过滤拦截-->
<mvc:mapping path="/**"/>
<bean class="com.mvc.interceptor..LoginInterceptor"/><!--自己定义拦截器注冊-->
</mvc:interceptor>
<!-- 我们能够直接在者注冊自己定义拦截器Bean来配置全局拦截器,会对全部请求拦截-->
</mvc:interceptors>
在我们的拦截中,假设配置了多个拦截器,会形成一条拦截器链。运行顺序相似于AOP,前置拦截先定义的先运行。后置拦截和完结拦截(afterCompletion)后注冊的后运行,关于拦截器的运行顺序的深入理解可參考我的还有一篇文章《 spring学习笔记(12)@AspectJ研磨分析[3]增强织入顺序实例具体解释》
springMVC4(16)拦截器解析与登陆拦截模拟的更多相关文章
- Springboot 拦截器配置(登录拦截)
Springboot 拦截器配置(登录拦截) 注意这里环境为springboot为2.1版本 1.编写拦截器实现类,实现接口 HandlerInterceptor, 重写里面需要的三个比较常用的方 ...
- struts2拦截器配置;拦截器栈;配置默认拦截器;拦截方法的拦截器MethodFilterInterceptor;完成登录验证
struts2.xml 内容 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...
- 说说struts2中拦截器的请求流程一(模拟大致流程)
本文可作为北京尚学堂struts2课程的学习笔记. 首先 什么是拦截器?拦截器能干什么? 拦截器,顾名思义就是拦截对象然后做操作的东西,至于是拦截谁?那自然是拦截action了.能做什么操作呢?你想让 ...
- AOP 貌似是拦截器 对方法进行拦截
AOP 貌似是拦截器 对方法进行拦截
- JavaWeb -- Struts 自定义拦截器, 登录权限拦截
1. 自定义拦截器, 登录权限拦截 login.jsp 登录JSP <%@ page language="java" contentType="text/html; ...
- Struts2他们拦截器实例定义—登陆权限验证
版本号:struts2.1.6 这种情况下实现功能:用户需要指定username登陆,进入相应的页面运行成功登陆作战,否则,它返回到着陆的登录页面,当直接进入操作页面(登陆访问页面后的能力)如果不同意 ...
- SpringMVC源码情操陶冶-InterceptorsBeanDefinitionParser拦截器解析器
解析mvc:interceptors节点 观察下InterceptorsBeanDefinitionParser的源码备注 /** * {@link org.springframework.beans ...
- 使用SpirngMvc拦截器实现对登陆用户的身份验证
登陆成功则按returnUrl进行跳转,即跳转到登陆之前的页面,否则跳转到登陆页面,返回登陆错误信息. 1.SpringMVC.xml <!-- 映射器 --> <bean clas ...
- springboot项目配置拦截器,进行登陆等拦截
新建拦截类: public class LoginInterceptor implements HandlerInterceptor{ private static Log logger = LogF ...
随机推荐
- Windows Server 2012 R2 with Update (x64) - DVD (Chinese-Simplified)
http://www.msdn.hk/html/2014/1404.html Windows Server 2012 R2 with Update (x64) - DVD (Chinese-Simpl ...
- Openjudge-4115-佐助和鸣人
这一题是一道广搜的题目,首先我们通过读入字符串读入每一行,然后顺带找到鸣人的位置. 然后我们初始化之后,就进行广搜,还是广搜的格式,但是要压入队列的条件我们可以稍微变一变,我们可以直接判断下一个要走的 ...
- 用户管理命令--useradd
用户管理命令--useradd 作用:用于添加一个新的用户 格式:useradd [ 选项 ] 用户名 选项的常用介绍 -u: UID指定用户id,必须是唯一的,并且大于499 -c: 添加注释,可以 ...
- 对数组内容使用了json_encode返回汉字内容返回了空值
如果使用json_encode对数组进行转成JSON字符串时候,发现汉字的全部为空,这样可以说明的一点是你的页面上用的一定不是UTF8编码,在PHP手册中对json_encode中待编码的值已经说明所 ...
- linux tomcat启动报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
解决方法: 1.先找出java安装路径 $ which java /data/apps/java/jdk1.8.0_91/bin/java 2.在catalina.sh中加入配置 JAVA_HOME= ...
- Go:文件操作
一.打开文件和关闭文件 os包File结构体的两个方法: func Open(name string) (file *File, err error) Open打开一个文件用于读取.如果操作成功,返回 ...
- fit in gnuplot
Table of Contents 1. fit-gnuplot 1 fit-gnuplot syntax >> fit [xrange][yrange] function 'datafi ...
- LeetCode 304. Range Sum Query 2D – Immutable
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
- awk中RS,ORS,FS,OFS区别与联系
学习awk时,一定要记得动手去实践,只有在实践中才能发现问题,以下就我在学习中和实践中的经验,总结一下RS,ORS,FS,OFS的区别和联系. 一.OS和ORS 1.RS是记录分隔符,默认的分隔符是\ ...
- HDU1757-A Simple Math Problem,矩阵快速幂,构造矩阵水过
A Simple Math Problem 一个矩阵快速幂水题,关键在于如何构造矩阵.做过一些很裸的矩阵快速幂,比如斐波那契的变形,这个题就类似那种构造.比赛的时候手残把矩阵相乘的一个j写成了i,调试 ...