ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springmvc系列第3篇:springmvc拦截器

2020-12-05 12:29:50  阅读:173  来源: 互联网

标签:Exception 拦截器 系列 springmvc request param Handler throws


文章目录

一、拦截器的定义

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>

标签:Exception,拦截器,系列,springmvc,request,param,Handler,throws
来源: https://blog.csdn.net/qq_29445811/article/details/110677770

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有