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