SpringMVC笔记(3)

一、SpringMVC 拦截器

1.1 快速入门

步骤

  1. 创建拦截器类实现HandlerInterceptor接口

    public class MyInterceptor01 implements HandlerInterceptor {
    
        /**
         * 在目标方法执行之前
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle...");
    
            //true则放行
            return true;
        }
    
        /**
         * 在目标方法执行之后,视图对象返回之前
         * @param request
         * @param response
         * @param handler
         * @param modelAndView
         * @throws Exception
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle..");
        }
    
        /**
         * 在流程都执行完毕后执行
         * @param request
         * @param response
         * @param handler
         * @param ex
         * @throws Exception
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCom...");
        }
    }
    
  2. 配置拦截器

    <!--    拦截器-->
        <mvc:interceptors>
            <mvc:interceptor>
    <!--            拦截路径-->
                <mvc:mapping path="/**"/>
    <!--            拦截器的依赖注入-->
                <bean class="interceptor.MyInterceptor01"></bean>
            </mvc:interceptor>
        </mvc:interceptors>
    
  3. 测试拦截器的拦截效果

    preHandle...
    目标函数执行。。
    postHandle..
    afterCom...

1.2 用户登录权限控制

步骤

  1. 编写登录验证拦截器

    /**
     * 登录拦截
     * @author 郜宇博
     */
    public class PrivilegeInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            //判断用户是否登录
            // 判断session中是否存在user对象
            HttpSession session = request.getSession();
            //获取user对象
            User user = (User) session.getAttribute("user");
            //判断是否存在
            if(user == null){
                //无用户
                //重定向到登录界面
                response.sendRedirect(request.getContextPath()+"/login.jsp");
                return false;
            }
            //放行
            return true;
        }
    }
    
  2. 配置拦截器(spring-mvc.xml中)

    <!--    配置登录权限拦截器-->
        <mvc:interceptors>
            <mvc:interceptor>
                <!--           拦截目标-->
                <mvc:mapping path="/**"/>
                <!--            放行目标-->
                <mvc:exclude-mapping path="/user/login"/>
                <bean class="springTest.interceptor.PrivilegeInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    </beans>
    

二、SpringMVC异常处理

2.1 异常处理的思路

系统中异常包括两类:预期异常运行时异常****RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。

系统的DaoServiceController出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,如下图:

2.2 异常处理的两种方式

2.2.1简单异常处理器:

使用SpringMVC提供的SimpleMappingExceptionResolver

1. 配置异常处理器
2. 编写异常页面
<!--    配置简单异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--        默认错误视图-->
        <property name="defaultErrorView" value="error.jsp"></property>
<!--        单独异常配置-->
        <property name="exceptionMappings">
            <map>
<!--                类转换异常-->
                <entry key="java.lang.ClassCastException" value="error1.jsp"></entry>
                
            </map>
        </property>
    </bean>

2.2.2异常处理接口:

实现Spring的HandelerExceptionResolver

  1. 实现异常处理接口
public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();

        //e异常是否是ClassCastException的实例
        if(e instanceof ClassCastException){
            //设置模型和视图
            modelAndView.addObject("error","类转换异常");
        }
        else if (e instanceof DataAccessException){
            //设置模型和视图
            modelAndView.addObject("error","数据访问异常");
        }
            modelAndView.setViewName("error.jsp");
        return modelAndView;
    }
}
  1. 配置
<!--    配置自定义异常-->
    <bean class="springTest.ExceptionTest.MyExceptionResolver"/>
posted @ 2021-08-26 19:10  橡皮筋儿  阅读(88)  评论(0编辑  收藏  举报