springMVC:HandlerInterceptor拦截器的使用

news/2024/7/6 1:10:42

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.使用背景

Web项目中需要判断http接口用户Post上来的数据是否合法,如果不合法要另做处理,用户Post上来的数据是Json形式的,我们用了@RequestBody标记自动将json形式的提交封装为一个Model对象,这样一来,我们就不能判断在自动封装过程中是否出现了异常,此时便想起了springMVC中的interceptor,用于处理请求之前,做一些处理,我们可以取消@RequestBody标记,然后在interceptor中取得请求体,检查是否符合json要求,即是不是一个valid interceptor,但是这里出现了一个问题: 
httpServletRequest的请求内容,只能被读取一次,在interceptor中读取了的话,在controller中便不能读取了,解决方式是,读取到的请求内容存起来,然后在controller中直接使用。 
这里用到了interceptor的一种,HandlerInterceptor,可以写一个小例子来记一下是怎么使用的!

2.HandlerInterceptor概述

在SpringMVC 中定义一个Interceptor是比较非常简单,主要有两种方式: 
第一种:实现HandlerInterceptor 接口,或者是继承实现了HandlerInterceptor 接口的类,例如HandlerInterceptorAdapter; 
第二种:实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。 
现在主要结合一个例子说一下第一种方式:实现HandlerInterceptor接口。 
HandlerInterceptor接口主要定义了三个方法: 
1. boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handle)方法:该方法将在请求处理之前进行调用,只有该方法返回true,才会继续执行后续的Interceptor和Controller,当返回值为true 时就会继续调用下一个Interceptor的preHandle 方法,如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法; 
2.void postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView)方法:该方法将在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。 
3.void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)方法:该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。用于进行资源清理。

3.简单的一个例子:

1.xml需要配置:两种配置方式(对所有的请求记性拦截,对特定的请求进行拦截)

<mvc:interceptors>
        <!--对所有的请求记性拦截-->
        <!--<beans:bean class="com.sunp.common.interceptor.Myinterceptor"/>-->
        <!--对特定的请求进行拦截-->
        <mvc:interceptor>
            <mapping path="/kfc/brands/brand1/*"/>
            <beans:bean class="com.sunp.common.interceptor.Myinterceptor"/>
        </mvc:interceptor>
</mvc:interceptors>

2.interceptors类

package com.sunp.common.interceptor;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mkyong.common.model.Shop;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.BufferedReader;
import java.io.IOException;

/**
 * Created by hzsunpeng on 2016/6/14.
 */
public class Myinterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("preHandle run!");
        return true;
    }

    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

        System.out.println("postHandle run!");
    }
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

        System.out.println("afterCompletion run!");
    }
}

 3.controller类(为了使用@Controller @PathVariable @ResponseBody注释等需要加一些配置文件,这里不再列出)

package com.sunp.common.controller;
import com.sunp.common.model.Shop;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by hzsunpeng on 2016/6/7.
 */
@Controller
@RequestMapping("/kfc/brands")
public class JSONController {

    @RequestMapping(value = "/brand1/{name}",method = RequestMethod.GET)
    public @ResponseBody Shop getShopInJSON(@PathVariable String name)
    {
        Shop sp = new Shop();
        sp.setName(name);
        sp.setStaffName(new String[]{"Staffname1","Staffname2"});
        System
        return sp;
    }
    //测试用
    @RequestMapping(value = "/json",method = RequestMethod.POST)
    public String index(HttpServletRequest request)
    {
        return "index";
    }
}

 

4.model Shop类

package com.sunp.common.model;

import java.io.Serializable;

/**
 * Created by hzsunpeng on 2016/6/7.
 */
public class Shop implements Serializable {
    private String name;
    private String[] staffName;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String[] getStaffName() {
        return staffName;
    }

    public void setStaffName(String[] staffName) {
        this.staffName = staffName;
    }

}

 运行结果:

 
控制台输出: 

转载于:https://my.oschina.net/u/2245781/blog/1592864


http://www.niftyadmin.cn/n/2675405.html

相关文章

【AtCoder】【ARC072E】Alice in linear land

Description 在数轴上有一个点&#xff0c;开始在原点&#xff0c;它要到位置T&#xff0c; 有一个操作序列&#xff0c;第i个元素为xixi&#xff0c;每次它会判断&#xff0c;如果它走了xixi个单位距离会离T更近&#xff0c;那么它就会走&#xff0c;否则原地不动&#xff0…

Web前端开发推荐书籍

Web前端开发推荐书籍 前言 学校里没有前端的课程&#xff0c;那如何学习JavaScript&#xff0c;又如何使自己成为一个合格的前端工程师呢&#xff1f; 读 书吧~相对于在网上学习&#xff0c;在项目中学习和跟着有经验的同事学习&#xff0c;书中有着相对完整的知识体系&#xf…

第 105 章 Ganglia

Ganglia是一个集群监控软件 Ganglia 是一个开源项目&#xff0c;它为高性能计算系统&#xff08;例如集群和网格&#xff09;提供了一个免费的可扩展分布式监视系统。 105.1. Server sudo apt-get install ganglia-monitor ganglia-webfrontendRestart apache2? 选择 Yessudo …

【UOJ 351】新年的叶子

Description 对于一棵树&#xff0c;每次随机染黑一个叶子&#xff08;可能会重复染黑&#xff09;&#xff0c;期望多少次后直径变小&#xff1f;. Solution 其实这题正确的题意应该是&#xff1a;对于每种直径与原图不同的染色方案&#xff0c;在第多少步时直径变小&#…

HTML新增布局标签

header&#xff1a; 标签定义文档的页眉&#xff0c;通常是一些引导和导航信息。它不局限于写在网页头部&#xff0c;也可以写在网页内容里面。 footer&#xff1a;作为页面的页脚时&#xff0c;一般包含了版权、相关文件和链接。 nav&#xff1a;是一个可以作为页面导航的链接…

桌面快捷方式的问题-创建-删除-判断

遇到了红米note1&#xff0c;我才知道了什么是开启一次应用创建一个创建一个快捷方式。 ………………………… 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[-] 背景实现增加快捷方式删除快捷方式快捷方式修改快捷方式存在判断兼容与注…

【AtCoder】【ARC077F】SS

Description 给出对于字符串的函数F(x)&#xff0c;表示在字符串后面加至少一个字符&#xff0c;使得新串由两个一样的字符串组成&#xff0c;如&#xff1a;f(aaabbb)aaabbbaaabbb 求对原串进行了无限次f()后的串&#xff0c;从第l位到第r位&#xff0c;每个字母出现了对少次…

iSAM vs SPA vs HOG-Man

原文&#xff1a;Why Use iSAM? Michael Kaess (2012) Comparison Fastest of the state-of-the-art SLAM algorithmsProvides the exact least-squares solutionProvides efficient access to marginal covariancesAlso deals with landmarks, not just pose graphsEasy to …