1. 程式人生 > >Spring -- 通過攔截器使用註解方式校驗引數

Spring -- 通過攔截器使用註解方式校驗引數

public class OpenHandlerInterceptor extends HandlerInterceptorAdapter {

    private static final Logger LOGGER = Logger.getLogger(OpenHandlerInterceptor.class);

    protected static final String APPLICATION_CHARSET="application/json; charset=utf-8";

    protected static final String UTF_8 = "UTF-8";
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
            if(handler instanceof HandlerMethod){
                HandlerMethod handlerMethod = (HandlerMethod) handler;
                Method method = handlerMethod.getMethod();
                CheckParam checkParam = method.getAnnotation(CheckParam.class);
                if(checkParam == null || !checkParam.require() || StringUtils.isEmpty(checkParam.fieldNames())) {
                    return true;
                }
                //防止中文,符號
                String fieldNames = checkParam.fieldNames().replace(",",",");
                boolean jsonParam = CheckFieldsNotNull(request, fieldNames);
                if(!jsonParam){
                    ErrorMsg(response);
                    return false;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            ErrorMsg(response);
            return false;
        }
        return true;

    }

    /**
     * 校驗必傳引數屬性是否存在
     * @param request
     * @param fieldNames
     * @return
     * @throws Exception
     */
    public static boolean CheckFieldsNotNull(HttpServletRequest request, String fieldNames) throws Exception{
        LOGGER.info(String.format("校驗欄位:{%s}",fieldNames));
        String requestParam = HttpHelper.getBodyString(request);
        if(StringUtils.isEmpty(requestParam)){
            return false;
        }
        Gson gson = new Gson();
        ArrayList<Map> arrayList = gson.fromJson(requestParam, ArrayList.class);
        for (String fieldName : fieldNames.split(",")) {
            Preconditions.checkNotNull(arrayList.get(0).get(fieldName),fieldName + "is null");
        }
        return true;
    }

    /**
     * 錯誤資訊
     * @param response
     * @throws IOException
     */
    public static void ErrorMsg( HttpServletResponse response) throws Exception {
        PrintWriter out = response.getWriter();
        response.setCharacterEncoding(UTF_8);
        response.setContentType(APPLICATION_CHARSET);
        out.write(JsonMapper.toJsonString(Result.fail(ErrorMessageEnum.MISS_REQUEST_PARAM.getValue(),ErrorMessageEnum.MISS_REQUEST_PARAM.getDesc())));
    }
}
以上程式碼就實現了攔截器的引數校驗,但是從中遇到一個問題,流只能讀一次。所以我們在controller再次獲取的是null值,為了解決請求中的流多次複用,所以實現了一個Filter,通過Filter來解決流只能讀取一次的問題。程式碼如下:

相關推薦

Spring -- 通過攔截使用註解方式引數

public class OpenHandlerInterceptor extends HandlerInterceptorAdapter { private static final Logger LOGGER = Logger.getLogger(OpenHandlerInterceptor.c

Spring MVC攔截+註解方式實現防止表單重複提交

表單重複提交是在多使用者Web應用中最常見、帶來很多麻煩的一個問題。有很多的應用場景都會遇到重複提交問題,比如: 1.點選提交按鈕兩次。2.點選重新整理按鈕。3.使用瀏覽器後退按鈕重複之前的操作,導致重複提交表單。4.使用瀏覽器歷史記錄重複提交表單。5.瀏覽器重複的HTTP

Spring AOP註解方式引數

簡介: 大家應該對Spring並不陌生,而且對Spring AOP也一樣不陌生。本章講解使用註解AOP方式去校驗引數。首先,介紹一下Spring AOP的原理,Spring AOP採用動態代理實現, 在Spring 容器中的bean被代理物件所代替,代理物件加入了增強邏輯,

springboot攔截註解方式

WebMvcConfigurerAdapter配置類其實是Spring內部的一種配置方式,採用JavaBean的形式來代替傳統的xml配置檔案形式進行鍼對框架個性化定製,下面我們來看一下該類內的常用方法。 本章目標 繼承WebMvcConfigurerAdapter採用Ja

SpringBoot攔截+註解方式實現防止表單重複提交

表單重複提交在web應用中是比較常見的問題,重複提交的動作容易造成髒資料,為了避免這重複提交的操作簡便的方便是採用攔截器+註解的方式。 基本的原理: url請求時,用攔截器攔截,生成一個唯一的識別符號(token),在新建頁面中Session儲存toke

Spring MVC攔截配置以及統一登陸實現

攔截器概念 這裡引用百度百科裡面的說法,java裡的攔截器是動態攔截Action呼叫的物件。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重

[轉]spring boot 攔截Spring AOP 方式記錄請求日誌

選擇使用攔截器實現,在實現中遇到兩個個問題: a. POST請求 @RequestBody 傳的引數不知怎麼獲取? b. 返回結果如何獲取? c.攔截器中service 無法注入;(已解決) 不知道有沒有人遇到這種情況,攔截器沒有解決上述問題,後來使用 spring

spring 框架下,如何通過攔截和過濾器讀取request裡的內容

當我們用spring 攔截器實現許可權校驗的時候,往往我們需要從request中獲取一些資料進行校驗,但是當我們在攔截器獲取到資料,getinputStream,那麼在後續的action即:controller中我們獲取不到request,這是為什麼呢?因為java.util

java bean通過註解實現

1、引入需要的jar包 <dependency> <groupId>org.hibernate</groupId> <artifactId&g

通過攔截Interceptor實現Spring MVC中Controller介面訪問資訊的記錄

java web工程專案使用了Spring+Spring MVC+Hibernate的結構,在Controller中的方法都是用於處理前端的訪問資訊,Controller通過呼叫Service進行業務處理後給前端返回ModelAndView物件或者只返回Json格式資料。如

Spring Boot 攔截 請求引數MD5簽名校

攔截器定義 /** * 攔截器 請求引數簽名校驗 * Created by jiyang on 14:47 2017/12/14 */ @Component @Slf4j public class ParameterInterceptor implements Han

Spring MVC通過攔截處理sql注入、跨站XSS攻擊風險(jeecg)

最近一個以前做的政府網站被資訊保安部門掃描了一下,存在一些風險,發了一份安全報告過來。所以開始對這個網站進行安全性升級。其中主要的幾個問題是sql注入風險、跨站xss攻擊和連結注入問題。 首先,什麼是sql注入,度娘一下一大堆,官方語言我就不多說了,說說我自己

Spring MVC攔截+logback日誌+自定義註解】實現使用者鑑權登陸和訪問日誌記錄

摘要說明: 專案中經常這樣的需要  1. 登陸鑑權:比如使用者瀏覽器發出某個請求的時候我們需要判斷這個使用者是否已經登陸,也就是cookie中是否有他的登陸資訊。 2. 訪問日誌記錄:使用者訪問請求的時候我們有必要記錄訪問者的身份資訊以及訪問了哪個url,請求引數是什麼,這

Java自定義註解反射數據

sda new out 格式 是否 本地 imp 使用範圍 數據類型 package com.annotations.ecargo; import java.lang.annotation.ElementType; import java.lang.annotati

淺談spring中AOP以及spring中AOP的註解方式

早就 好的 面向 XML ram ati alt 返回 增強   AOP(Aspect Oriented Programming):AOP的專業術語是"面向切面編程" 什麽是面向切面編程,我的理解就是:在不修改源代碼的情況下增強功能.好了,下面在講述aop註解方式的情況下順

spring AOP解析之註解方式詳解

parser 分享 pro asp mes aop log space spec 命名空間處理器是AopNamespaceHandler,我們可以看到這裏註冊了幾個解析器,第一個我們知道是xml形式的解析,接下來我們看AspectJAutoProxyBeanDefiniti

Spring MVC攔截

res bject src throws 成功 resolv gets app response Spring MVC的interceptor攔截器攔截請求是通過實現HandlerInterceptor接口來完成的。 接來下舉一個實例: 通過攔截器完成一個用戶權限驗證的功能

struts數據之使用xml方式

als bsp 默認 字符串長度 直接 一個 back log mes <field name=""></field> //自動校驗器 <validator type=""></validator> //非自動校驗 其校驗

spring mvc攔截使用

例子 ttr dir 登錄 sem model imp deb author   舉個例子說下吧,單點登錄,直接看代碼:   spring-mvc.xml配置 <mvc:interceptors> <mvc:interceptor

spring boot攔截WebMvcConfigurerAdapter,以及高版本的替換方案

spring boot最近項目采用spring icloud,用的spring boot版本是1.5.x的,spring boot 2.0,Spring 5.0 以後WebMvcConfigurerAdapter會取消掉。以下介紹下大體的內容,希望對大家都有所幫助。 以下WebMvcConfigurer