SSM-SpringMVC-4-拦截器

1 SpringMVC拦截器

1.1 拦截器的概念

SpringMVC的拦截器(Interceptor)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理,将拦截器按一定的顺序联结成一条链,这条链称为拦截器链,在访问被拦截的方法或字段时,拦截器链中的拦截器会按照被配置的顺序依次被调用,拦截器也是AOP思想的具体实现

1.2 拦截器和过滤器的区别

在这里插入图片描述

2 拦截器的快速入门

自定义拦截器的步骤:

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

2,在spring-mvc.xml中配置拦截器

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

public class MyInterceptor implements HandlerInterceptor {

    // 在目标方法被执行之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");

        // 判断请求中有无param参数 如果有且值为"yes"则放行
        // 如果没有则请求重定向到error.jsp页面
        String param = request.getParameter("param");
        if(param.equals("yes")) {
            return true;
        } else {
            request.getRequestDispatcher("/error.jsp").forward(request, response);
            return false;
        }

    }

    // 在目标方法执行后 视图对象返回之前执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");

        // 在返回视图前 更换视图 且向视图中增加新的数据
        modelAndView.setViewName("ok");
        modelAndView.addObject("name", "when");
    }

    // 目标方法全部执行完毕后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
        
        // 整个方法结束后,重定向到index.jsp页面
        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }


}

在这里插入图片描述

2,在spring-mvc.xml中配置拦截器:

    <!--  配置拦截器  -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--  path标明对哪些方法拦截 /**是拦截所有方法  -->
            <mvc:mapping path="/**"/>
            <bean class="com.coisini.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

3,测试:
当preHandle的返回值为false时,整个方法无法继续执行:
在这里插入图片描述
当preHandle的返回值为true时,整个方法可以连贯执行:
在这里插入图片描述
当在spring-mvc.xml中配置多个拦截器时,就构成了拦截器链:
在这里插入图片描述
在这里插入图片描述

3 用户登录权限控制

3.1 登录拦截器

在这里插入图片描述
1,自定义登录拦截器:

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) session.getAttribute("user");

        // session中没有user则代表用户没有登录 需要重定向到登录页面
        if(user == null) {
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return false;
        }

        // 已登录则放行
        return true;
    }


}

2,在spring-mvc中配置拦截器:

   <!-- 配置拦截器 -->
    <mvc:interceptors>
        <!--  权限拦截器 拦截除了登录操作外所有方法 -->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <!-- 排除对某些资源的拦截 这里需要放行登录方法 否则登录永远失败 -->
            <mvc:exclude-mapping path="/user/login"/>
            <bean class="com.coisini.interceptor.PrivilegeInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

3,测试,随机点击一个功能:
在这里插入图片描述

3.2 登录功能的完成

当跳转到登录页面时,用户输入用户名和密码后,交给Dao层查询,如果数据库中有对应的用户,则将User放到Session中并跳转到首页,如果不正确或不存在,回到登录界面

1,更改登录表单提交的地址:
在这里插入图片描述

2,创建表单提交映射的方法:

    @RequestMapping("/login")
    public String login(String username, String password, HttpSession session) {

        User user = this.userService.login(username, password);
        if(user != null) {
            // 登录成功,将user存储在Session中
            session.setAttribute("user", user);
            return "redirect:/index.jsp";
        }

        return "redirect:/login.jsp";
    }

3,测试用户zhangsan,密码123:
当正确输入时没有问题,但输入数据库不存在的用户信息时:

这个错误来源于底层查询时使用的jdbcTemplate.queryForObject(),该方法如果没有查到数据,会抛出一个EmptyResultDataAccessException异常,而不是null,为此需要对此进行处理,可以让Dao层的方法抛出该异常,在Service层进行try-catch捕获,如果出现异常向Controller层返回null即可避免

4 SpringMVC异常处理机制

对于web程序中出现的异常,以往都是在Service层中采用try-catch的方式直接处理,但是这样做也有许多问题:

1,异常处理的代码和Service层业务代码耦合在了一起

2,同一种异常可能会出现在多处,这样就不得不重复处理

为此,可以将异常处理的工作抽取出来,将Dao,Service,Controller出现的异常全部向上抛,最后由SpringMVC前端控制器交由异常处理器进行处理
在这里插入图片描述

4.1 异常处理的两种方式

1,使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver
需要在spring-mvc.xml文件中配置

2,使用Spring的异常处理接口HandlerExceptionResolver
自定义自己的异常处理器

1,使用SimpleMappingExceptionResolver:
SpringMVC已经定义好了该处理器,使用时可以根据项目情况在spring-mvc.xml中进行相应异常与视图的映射配置

   <!-- 配置简单异常处理器   -->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <!-- 具体异常的配置 每种异常对应一个页面 -->
        <property name="exceptionMappings">
            <map>
                <entry key="com.coisini.exception.MyException" value="myException"></entry>
                <entry key="com.lang.ClassCastException" value="classCastError"></entry>
            </map>
        </property>
        <!-- 默认异常对应error.jsp页面 -->
        <property name="defaultErrorView" value="error"></property>
    </bean>

在这里插入图片描述

2,自定义异常处理器:
自定义异常处理器的步骤:

1,创建异常处理器实现HandlerExceptionResolver

2,在spring-mvc.xml中配置异常处理器

1,创建异常处理器实现HandlerExceptionResolver:在这里插入图片描述
2,在spring-mvc.xml中配置异常处理器:

    <!-- 自定义异常处理器 -->
    <bean class="com.coisini.resolver.MyExceptionResolver"></bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值