分享

springmvc系列第3篇:springmvc拦截器

 印度阿三17 2020-12-05

文章目录

一、拦截器的定义

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;

/**
 * 登录
 */
@Controller
public 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./content-4-775051.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多