SpringMVC笔记(3)

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前端控制器交由异常处理器进行异常处理,如下图:

<span>SpringMVC笔记(3)</span>

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"/>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115192.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月12日 上午9:18
下一篇 2021年11月12日 上午9:18


相关推荐

  • 案例:EVE和ENSP对接LLDP协议「建议收藏」

    案例:EVE和ENSP对接LLDP协议「建议收藏」1.EVE与ENSP使用cloud对接LLDP协议(拓扑)2.思科开启LLDP(EVE需使用2018年后的L2/L3IOU才支持LLDP功能)Switch(config)#lldprun//思科全局运行开启lldpSwitch(config)#inte0/1Switch(config-if)#lldptransmitSwitch(config-if)#lldpreceive//接口下开启lldp传送与接受华为开启LLDP[Huawei]lldpenableInfo:Glo

    2022年5月5日
    89
  • 全局莫兰指数_空间自相关 | 莫兰指数

    全局莫兰指数_空间自相关 | 莫兰指数空间自相关:是指一些变量在同一个分布区内的观测数据之间潜在的相互依赖性。其中,自相关中的“自”表示当你进行相关性观察统计量,是来源于不同对象的同一属性。Tobler(1970)曾指出“地理学第一定律:任何东西与别的东西之间都是相关的,但近处的东西比远处的东西相关性更强”。空间自相关统计量是用于度量地理数据(geographicdata)的一个基本性质:某位置上的数据与其他位置上的数据间…

    2022年6月25日
    63
  • C语言异或操作的妙用

    C语言异或操作的妙用如果想要交换 2 个变量 一般的做法是引入第三个变量 nbsp 例如 nbsp cpp nbsp viewplaincop nbsp nbsp a nbsp nbsp a nbsp nbsp b nbsp nbsp b nbsp temp nbsp nbsp nbsp 这样 2 个变量中的值就实现了交换 那能不能不引入其他变量就可以实现变量值的交换呢 答案是肯定的 用异或操作可以实现 有 2 种实现方法 本质上是一样的 法 1 nbsp cpp nbsp vi

    2026年3月17日
    2
  • java解析XML的所需Jar包「建议收藏」

    java解析XML的所需Jar包「建议收藏」链接:https://pan.baidu.com/s/1ck6YIRT2MpiDLsCAxi-I9Q提取码:yjss其中包括dom4j和jaxen包

    2022年5月9日
    182
  • 只用 Claude Skills,打造专属 AI 伴侣|附完整教程

    只用 Claude Skills,打造专属 AI 伴侣|附完整教程

    2026年3月16日
    2
  • 如何在CentOS上配置虚拟IP地址 (VIP)

    如何在CentOS上配置虚拟IP地址 (VIP)目录介绍教程第1步第2步第3步第4步第5步本教程将指导您如何在服务器上配置虚拟IP地址。介绍顾名思义,虚拟IP地址(VIP)是一个没有实际物理网络接口的IP地址。传入的数据包被发送到VIP,但所有数据包都通过真实的网络接口传输。虚拟IP地址通常用于数据库高可用性。应用程序将其用于数据库连接,而不是普通的主机IP地址。当活动数据库失败时,VIP将转移到新升…

    2022年10月20日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号