ICode9

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

pringMVC框架如何定义拦截器呢?

2020-09-30 14:52:21  阅读:244  来源: 互联网

标签:pringMVC 拦截器 框架 request mv user ModelAndView public


SpringMVC 中的 Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆等操作。

pringMVC框架如何定义拦截器呢?

SpringMVC 拦截器的定义方式

  • 实现接口
  • 继承适配器

FU
如需要跟多资料请点击下方图片⬇(扫码加好友→备注66,不备注拒绝添加哦)
image

案例实操

实现接口

实现 HandlerInterceptor 接口方式定义我们的拦截器代码如下:

public class MyInterceptor implements HandlerInterceptor{ 

    /** 

    * preHandle 在请求方法拦截前执行 

    * 返回 true 代表对当前请求进行放行处理 

    */ 

    @Override 

    public boolean preHandle(HttpServletRequest request, 

        HttpServletResponse response, Object handler) throws Exception { 

        System.out.println("action 之前执行!!!"); 

        return true; //继续执行 action 

    } 

    /** 

    * 请求执行后,生成视图前执行 

    */ 

    @Override 

    public void postHandle(HttpServletRequest request, 

        HttpServletResponse response, Object handler, 

        ModelAndView modelAndView) throws Exception { 

            System.out.println("Action 执行之后,生成视图之前执行!!");  

    } 

    /** 

    * 在请求方法执行后进行拦截 

    */ 

    @Override 

    public void afterCompletion(HttpServletRequest request, 

        HttpServletResponse response, Object handler, Exception ex) 

        throws Exception { 

            System.out.println("方法执行后进行拦截。。释放资源。。。"); 

    } 

} 

对应配置有两种方式:

配置方式一(拦截所有请求配置方式):

<mvc:interceptors> 

    <!-- 使用 bean 定义一个 Interceptor 

    直接定义在 mvc:interceptors 根下面的 Interceptor 将拦截所有的请求 --> 

    <bean class="com.xxx.interceptors.MyInterceptor" /> 

</mvc:interceptors> 

配置方式二(拦截指定请求配置方式)

<mvc:interceptors>

<!-- 定义在 mvc:interceptor 下面 拦截所有 test 地址开头的请求-->

<mvc:interceptor> 

    <mvc:mapping path="/test/*.do" /> 

        <bean class="com.xxx.interceptors.MyInterceptor" /> 

    </mvc:interceptor> 

</mvc:interceptors> 

效果:

请求地址: http://localhost:8080/springmvc03/test/hello.do

控制台打印结果信息:

pringMVC框架如何定义拦截器呢?

多个拦截器配置(多个拦截器组成一个拦截器链 ,栈式结构 123 321 退出):

<mvc:interceptors> 

    <mvc:interceptor> 

        <!-- 拦截所有请求 --> 

        <mvc:mapping path="/**" /> 

            <bean class="com.xxx.interceptors.MyInterceptor" /> 

    </mvc:interceptor> 

    <mvc:interceptor> 

        <!-- 拦截所有请求 --> 

        <mvc:mapping path="/**" /> 

        <bean class="com.xxx.interceptors.MyInterceptor2" /> 

    </mvc:interceptor> 

</mvc:interceptors> 

继承适配器

继承 HandlerInterceptorAdapter 方式定义拦截器(实际上最终还是 HandlerInterceptor 接口实现)

public class MyInterceptor2 extends HandlerInterceptorAdapter{ 

    /** 
    * 重写 preHandle 请求执行前执行 
    */ 

    @Override 

    public boolean preHandle(HttpServletRequest request, 

        HttpServletResponse response, Object handler) throws Exception { 

        System.out.println("请求前执行。。。"); 

        return true; 

    } 

} 

扩展

使用拦截器完成用户是否登录请求验证拦截器定义:

public class LoginInterceptor implements HandlerInterceptor{ 

    /** 

    * 方法拦截前执行 

    */ 

    @Override 

    public boolean preHandle(HttpServletRequest request, 

    HttpServletResponse response, Object handler) throws Exception { 

        User user= (User) request.getSession().getAttribute("user"); 

        /** 

        * 判断 uri 是否包含路径 

        * 包含就放行 

        */ 

        if(request.getRequestURI().indexOf("userLogin.do")>-1){ 

            return true; 

    }  

        /** 

        * 判断 session user 是否为空 

        */ 

        if(null==user){ 

        response.sendRedirect(request.getContextPath()+"/login.jsp"); 

        return false; 

        } 

        return true; //继续执行 action 

    } 

    @Override 

    public void postHandle(HttpServletRequest request, 

    HttpServletResponse response, Object handler, 

    ModelAndView modelAndView) throws Exception { 

        System.out.println("Action 执行之后,生成视图之前执行!!");  

    } 

    /** 

    * 在方法执行后进行拦截 

    */ 

    @Override 

    public void afterCompletion(HttpServletRequest request, 

    HttpServletResponse response, Object handler, Exception ex) 

    throws Exception { 

        System.out.println("方法执行后进行拦截。。释放资源。。。"); 

    } 

} 

UserController 类

/** 

\*  

\* @author Administrator 

\* 模拟 用户操作 

*/ 

@Controller 

@RequestMapping("/user") 

public class UserLoginController { 

    @RequestMapping("/userLogin") 

    public ModelAndView userLogin(HttpServletRequest request){ 

        ModelAndView mv=new ModelAndView(); 

        User user=new User(); 

        user.setUserName("xxx"); 

        user.setUserPwd("123456"); 

        request.getSession().setAttribute("user", user); 

        mv.setViewName("success"); 

        return mv;  

    } 

    @RequestMapping("/addUser") 

    public ModelAndView addUser(){ 

        System.out.println("添加用户记录。。。"); 

        ModelAndView mv=new ModelAndView(); 

        mv.setViewName("success"); 

        return mv; 

    } 

    @RequestMapping("/delUser") 

    public ModelAndView delUser(){ 

        ModelAndView mv=new ModelAndView(); 

        mv.setViewName("success"); 

        return mv; 

    } 

    @RequestMapping("/updateUser") 

    public ModelAndView updateUser(){ 

        ModelAndView mv=new ModelAndView(); 

        mv.setViewName("success"); 

        return mv; 

    }
} 

拦截器 xml 配置

<!-- 拦截所有请求 --> 

<mvc:interceptors> 

    <mvc:interceptor> 

        <mvc:mapping path="/**" /> 

        <bean class="com.xxx.interceptors.LoginInterceptor" /> 

    </mvc:interceptor> 

</mvc:interceptors> 

标签:pringMVC,拦截器,框架,request,mv,user,ModelAndView,public
来源: https://blog.51cto.com/14944745/2539517

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

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

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

ICode9版权所有