springmvc系列第3篇:springmvc拦截器

文章目录

  • 一、拦截器的定义
    • 1.定义
    • 2.拦截器配置
  • 二、拦截器应用登录认证
    • 1.登录拦截认证的拦截器
    • 2.配置登录拦截器

一、拦截器的定义

1.定义

spring web mvc的处理器拦截器类似于Servlet中的过滤器Filter,用于对处理器进行预处理和后处理。
定义拦截器,实现HandlerInterceptor接口。接口中提供了三个方法:
preHandle:进入Handler方法之前执行
用于身份认证,身份授权。比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不再向下执行
postHandle:进入Handler方法之后,返回ModelAndView之前执行
应用场景:从ModelAndView出发,将公用的模型数据(比如菜单的导航)传到视图,也可以统一指定视图
afterCompletion:执行Handler完成后执行此方法
统一异常处理,日志处理

2.拦截器配置

springmvc是针对HandlerMapping进行拦截设置。
第一种配置:如果在某个HandlerMapping中配置拦截,经过该HandlerMapping映射成功的Handler最终使用该拦截器。

    <!--针对HandlerMapping配置拦截器    一般不推荐使用此拦截器    -->    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">        <property name="interceptors">            <list>               <ref bean="myHandlerInteceptor"/>            </list>        </property>    </bean>    <bean id="myHandlerInteceptor" class="com.ming.interceptor.MyHandlerInteceptor"/>

第二种配置:spingmvc配置类似全局的拦截器,springmvc框架将你配置的类似全局的拦截器注入到每个HandlerMapping中

    <!--全局拦截器配置-->    <mvc:interceptors>        <!--多个拦截器按顺序执行-->        <mvc:interceptor>            <mvc:mapping path="/**"/>            <bean id="myHandlerInteceptor" class="com.ming.interceptor.MyHandlerInteceptor"/>        </mvc:interceptor>        <mvc:interceptor>            <mvc:mapping path="/**"/>            <bean id="myHandlerInteceptor2" class="com.ming.interceptor.MyHandlerInteceptor2"/>        </mvc:interceptor>    </mvc:interceptors>

总结:多拦截器执行顺序:preHandle按拦截器的配置顺序执行,postHandle和afterCompletion按拦截器配置的逆向顺序执行

package com.ming.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 测试拦截器,基于aop */public class MyHandlerInteceptor implements HandlerInterceptor {    /**     * 进入Handler方法之前执行     * 用于身份认证,身份授权     * 比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不再向下执行     * @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进入Handler方法之前执行");        //return false 表示拦截,不向下执行        //return true 表示放行        return true;    }    /**     * 进入Handler方法之后,返回ModelAndView之前执行     * 应用场景:从ModelAndView出发,将公用的模型数据(比如菜单的导航)传到视图,也可以统一指定视图     * @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("进入Handler方法之后,返回ModelAndView之前执行");    }    /**     * 执行Handler完成后执行此方法     * 统一异常处理,日志处理     * @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("执行Handler完成后执行此方法");    }}

二、拦截器应用登录认证

1.登录拦截认证的拦截器

package com.ming.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/** * 登录拦截器 */public class LoginHandlerInteceptor implements HandlerInterceptor {    /**     * 进入Handler方法之前执行     * 用于身份认证,身份授权     * 比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不再向下执行     * @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进入Handler方法之前执行");        //获取url        String url = request.getRequestURI();        //判断url是否公开地址,实际使用是将公开地址配置在配置文件中        if(url.indexOf("login.action")>=0){            //用户登录公开地址,用户登录放行            return true;        }        //判断session        HttpSession session =request.getSession();       String username = (String) session.getAttribute("username");        if(username!=null){            //用户存在,放行            return true;        }        //用户不存在,跳转到登录页面        request.getRequestDispatcher("/WEB_INF/jsp/login.jsp").forward(request,response);        //return false 表示拦截,不向下执行        //return true 表示放行        return false;    }    /**     * 进入Handler方法之后,返回ModelAndView之前执行     * 应用场景:从ModelAndView出发,将公用的模型数据(比如菜单的导航)传到视图,也可以统一指定视图     * @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("进入Handler方法之后,返回ModelAndView之前执行");    }    /**     * 执行Handler完成后执行此方法     * 统一异常处理,日志处理     * @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("执行Handler完成后执行此方法");    }}

模拟登录

package com.ming.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;/** * 登录 */@Controllerpublic class LoginController {    @RequestMapping("/login")    public String login(HttpSession session, String username, String password) throws Exception{        //调用service进行用户认证        session.setAttribute("username",username);        return "redirect:/items/queryItems.action";    }    @RequestMapping("/loginout")    public String loginout(HttpSession session, String username, String password) throws Exception{       //清除session        session.invalidate();        return "redirect:/items/queryItems.action";    }}

2.配置登录拦截器

    <!--全局拦截器配置-->    <mvc:interceptors>        <!--多个拦截器按顺序执行-->        <mvc:interceptor>            <!--/**拦截所有的url包括子路径-->            <mvc:mapping path="/**"/>            <bean id="loginHandlerInteceptor" class="com.ming.interceptor.LoginHandlerInteceptor"/>        </mvc:interceptor>        <mvc:interceptor>            <!--/**拦截所有的url包括子路径-->            <mvc:mapping path="/**"/>            <bean id="myHandlerInteceptor" class="com.ming.interceptor.MyHandlerInteceptor"/>        </mvc:interceptor>    </mvc:interceptors>

来源:https://www.icode9.com/content-4-775051.html

(0)

相关推荐