springMVC-9-异常处理器和拦截器
异常解析器:
- 用于统一处理 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");
}
}
结果: