异常解析器:

  • 用于统一处理 servlet 中的异常;

拦截器:

  • 用于统一处理业务中需要统一处理的页面(比如登录判断等), 可抽取出来统一处理.

我们一般需要在每个页面都通过在session中寻找有无loginID来判断这个用户是否登录,如果没有找到就需要写一个逻辑重定向到login界面,如果每个控制器都这样来一下,代码就会重复,这个时候我们就可以用拦截器针对特定的url控制器进行判断是否要重定向

先修改一下界面

index.jsp

<button class="btn btn-primary"><a href="/attend">interceptor</a></button>

control

//该控制器注册了拦截器,此时session上没有loginID(很显然没有)就不会到attend界面,而是到login界面
@RequestMapping(value = "/attend")
public String getAttend(){ return "attend";
} //这是没有登录信息之后拦截器响应过来的login界面请求
@RequestMapping(value = "/login")
public String getLogin(){
return "login";
}

添加两个界面

使用拦截器

创建拦截器 MyInterceptor.java:(实现 HandlerInterceptor 接口并重写其三个方法)

//创建拦截器 MyInterceptor.java:(实现 HandlerInterceptor 接口并重写其三个方法)
public class MyInterceptor implements HandlerInterceptor {
//在control之前执行,在这里写control中重复的功能
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if (session.getAttribute("loginID")!=null){
System.out.println("loginID有值");
//return true即放行,执行后来的control
return true;
}
//中断之前响应请求,为没有登录转向一个定好的界面
System.out.println("login无值");
response.sendRedirect("/login");
return false;
} //在control之后,响应之前执行,一般不会使用
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("control到请求响应时间段");
} //在视图渲染完毕之后执行,做一些资源的回收操作,一般不会使用
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}

注册拦截器(在springmvc配置文件)

<!--全部拦截器-->
<mvc:interceptors>
<!--添加一个拦截器-->
<mvc:interceptor>
<!--需要拦截的路径-->
<mvc:mapping path="/attend"/>
<!--使用哪个拦截器-->
<bean class="com.wang.converter.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

拦截器的优先顺序

拦截器1

//拦截器1

public class Inteceptor1 implements HandlerInterceptor{

    //方法执行前1
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//返回值boolean类型 决定是否放行
System.out.println("方法执行前1");
return true;
} //方法执行后1
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
System.out.println("方法执行后1");
} //页面渲染后1
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
System.out.println("页面渲染后1");
} }

拦截器2

//拦截器1

public class Inteceptor1 implements HandlerInterceptor{

    //方法执行前1
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//返回值boolean类型 决定是否放行
System.out.println("方法执行前1");
return true;
} //方法执行后1
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
System.out.println("方法执行后1");
} //页面渲染后1
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
System.out.println("页面渲染后1");
} }

拦截器的配置(注意顺序)

//拦截器1

public class Inteceptor1 implements HandlerInterceptor{

    //方法执行前1
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//返回值boolean类型 决定是否放行
System.out.println("方法执行前1");
return true;
} //方法执行后1
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
System.out.println("方法执行后1");
} //页面渲染后1
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
System.out.println("页面渲染后1");
} }

结果:

最新文章

  1. C++随笔:从Hello World 探秘CoreCLR的内部(1)
  2. sublime3的安装和插件之类的
  3. 20145301&amp;20145321&amp;20145335实验三
  4. 复选框全选、全不选和反选的效果实现VIEW:1592
  5. python logging TimedRotatingFileHandler 作用
  6. BZOJ 2878 迷失游乐园
  7. 当用户登录,经常会有实时的下拉框,例如,输入邮箱,将会@qq.com,@163.com,@sohu.com
  8. string services
  9. Electron 实战桌面计算器应用
  10. Tomcat 8启动速度慢原因1: At least one JAR was scanned for TLDs yet contained no TLDs
  11. 迷茫&lt;第二篇:回到老家湖南长沙&gt;
  12. SQL反模式学习笔记19 使用*号,隐式的列
  13. 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page1-6
  14. elementUI vue tree input 懒加载 输入下拉树型示例 点击其他区域关闭自定义div
  15. java质数判断
  16. java单例模式总结
  17. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第三集之磁盘分区】
  18. android 换行符(\n) 在TextView中显示不正常的问题
  19. Android 借助Stetho在Chrome上调试Android网络、数据库、Sharedpreferences
  20. T-SQL应用实例

热门文章

  1. 车联网V-2X智能汽车驾驶
  2. 嵌入式Linux的OTA更新,基础知识和实现
  3. C#后台定义一个DataTable并手动写入静态数据(测试数据)
  4. Postman 的基本功能按钮解释、发送post请求及get请求、查看响应信息
  5. fiddler选项卡-Statistc(统计)
  6. 菜鸟刷题路(随缘刷题):leetcode88
  7. 【NX二次开发】基准特征
  8. 报错:vmnet8设置中出现错误。子网IP和子网掩码不一致
  9. 微信订阅号中获取openid以及个人信息
  10. 在 NUC980 上运行 RT-Thread