1. 程式人生 > >springmvc中修改request的引數以及實現去空格功能

springmvc中修改request的引數以及實現去空格功能

          最近發現不能修改request的引數內容,假如想要在request的paramMap裡面預設注入modifier內容,採用下面這種方法可以實現向request中修改引數,具體分析如下:
       (1)繼承HttpServletRequestWrapper,全名javax.servlet.http.HttpServletRequestWrapper看來也是一個擴充套件的通用介面,也就是會對request做一次包裝,此時我們要如何重寫?比如我們要重寫getParameter方法和getParameterValues方法,其他方法儲存和原來一樣,我們在子類中,自己定義一個map用來放物件,結合request本身的引數,加上外部其他自定義的引數,做成一個新的引數表。
package com.cx.web;

public class ParameterRequestWrapper extends HttpServletRequestWrapper {

    private Map<String, String[]> params = new HashMap<String, String[]>();

    @SuppressWarnings("unchecked")
    public ParameterRequestWrapper(HttpServletRequest request) {
        // 將request交給父類,以便於呼叫對應方法的時候,將其輸出,其實父親類的實現方式和第一種new的方式類似
        super(request);
        //將引數表,賦予給當前的Map以便於持有request中的引數
        this.params.putAll(request.getParameterMap());
        this.modifyParameterValues();
    }

    //過載一個構造方法
    public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
        this(request);
        addAllParameters(extendParams);//這裡將擴充套件引數寫入引數表
    }

    public void modifyParameterValues() {//將parameter的值去除空格後重寫回去
        Set<String> set = params.keySet();
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            String key = (String) it.next();
            String[] values = params.get(key);
            for (int i = 0; i < values.length; i++) {
                values[i] = values[i].trim();
            }
            params.put(key, values);
        }

    }

    @Override
    public Enumeration<String> getParameterNames() {
        return new Vector<String>(params.keySet()).elements();
    }
    @Override
    public String getParameter(String name) {//重寫getParameter,代表引數從當前類中的map獲取
        String[] values = params.get(name);
        if (values == null || values.length == 0) {
            return null;
        }
        return values[0];
    }

    public String[] getParameterValues(String name) {//同上
        return params.get(name);
    }


    public void addAllParameters(Map<String, Object> otherParams) {//增加多個引數
        for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
            addParameter(entry.getKey(), entry.getValue());
        }
    }


    public void addParameter(String name, Object value) {//增加引數
        if (value != null) {
            if (value instanceof String[]) {
                params.put(name, (String[]) value);
            } else if (value instanceof String) {
                params.put(name, new String[]{(String) value});
            } else {
                params.put(name, new String[]{String.valueOf(value)});
            }
        }
    }
}
        (2)接下來我們說下new出來的request如何使用,以及讓業務層使用到,方法如下:

寫一個過濾器,在filter這個地方new了這個自己定義的request後,接下來request就是new出來的,這個filter一定要在springmvc之前處理,如下所示:

ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest)request);
requestWrapper.addParameter("fff" , "我靠");
filterChain.doFilter(requestWrapper, servletResponse);
具體的方法如下:
package com.cx.web;
public class CommonFilter implements Filter {

    public CommonFilter() {
    }

    public void destroy() {
    }


    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest hr = (HttpServletRequest) request;

        long start = System.currentTimeMillis();

        String url = hr.getServletPath().trim();

        ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest) request);

        chain.doFilter(requestWrapper, response);

        long end = System.currentTimeMillis();

        System.out.println("============================連線:" + url + ",響應時間:" + (end - start));
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

}
     (3)在web.xml中新增轉化器
<!--去引數的左右空格,也可以用springMVC攔截器實現-->
    <filter>
        <filter-name>commonFilter</filter-name>
        <filter-class>com.cx.web.CommonFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>commonFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

相關推薦

springmvc修改request引數以及實現空格功能

          最近發現不能修改request的引數內容,假如想要在request的paramMap裡面預設注入modifier內容,採用下面這種方法可以實現向request中修改引數,具體分析如下:        (1)繼承HttpServletRequestWrap

SpringMVC獲取request對象的幾種方式

hello ext spring pub strong framework () frame -c 1.最簡單的方式(註解法) @Autowiredprivate HttpServletRequest request; 2.最麻煩的方法 a. 在web.xml中

Android小知識-剖析RetrofitServiceMethod相關引數以及建立過程

本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,包括年底前會更新kotlin由淺入深系列教程,目前計劃在微信公眾號進行首發,如果大家想獲取最新教程,請關注微信公眾號,謝謝! 在上一節《Android小知識-剖析Retrofit中的網路請求介面》介紹了在Retrofit中通過動態代理獲取網

SpringMVCPojo作為引數的應用

首先在頁面新增一個表單. <form action="springmvc/testPojo" method="post"> <input type="text" name="username" /> <br>

SpringMVCpost請求引數註解@requestBody使用問題

  一、httpClient傳送Post 原文https://www.cnblogs.com/Vdiao/p/5339487.html 1 public static String httpPostWithJSON(String url) throws Exception { 2

SpringMVC重定向傳引數實現

https://blog.csdn.net/u011851478/article/details/51872977 在spring的一個controller中要把引數傳到頁面,只要配置檢視解析器,把引數新增到Model中,在頁面用el表示式就可以取到。但是,這樣使用的是forward方式,瀏覽器

檢視jvm的各種引數以及預設值

1 標準引數 標準引數(-),所有的JVM實現都必須實現這些引數的功能,而且向後相容;  通過命令 java即可檢視  如下 where options include: -d32 use a 32-bit data model if

關於在Spring過濾器修改request的引數值遇到的問題(三)

繼上一遍為背景 問題描述: 成功解密了reqeust中的引數後,在控制層Controller中獲取到的引數,是沒有解密的引數。例如:在過濾器中修改 引數名為username 的引數值432895328195783915781(一串加密的密文) 為 xiaomin(解密後的

關於在Spring過濾器修改request的引數值遇到的問題(二)

背景 見上一篇Blog關於在Spring過濾器中修改request的引數值遇到的問題(一) 問題描述 Spring框架,使用過濾器解密request中的引數(修改Request中的值),並傳遞到下一個過濾器 錯誤詳情 第一次的修改方式是這樣的(RSAUtil是封

關於在Spring過濾器修改request的引數值遇到的問題(一)

關於在Spring過濾器中修改request的引數值遇到的問題 背景 專案上要對前臺傳輸到後臺的資料進行加密(二級等保什麼的),於是想到前臺使用JS進行RSA加密,後臺解密。於是在Spring中新增過濾器,來解密request中傳過來的引數值。 問題描述 前臺登入表

android studio修改快捷鍵以及實用的開發快捷鍵,方便技巧

直接上圖,看了就明白: 1.開啟設定---->keymap 2.選擇哪個型別的快捷鍵,本人是eclipse過來的,還是沿用eclipse; 3.這裡是搜尋功能的地方,比如我要看程式碼格式化,就在這輸入“reformat code”,就會跳到具體的設定; 4.你只知道

PrepareStatement sql語句in多個引數實現

下邊是今天探索PrepareStatement預編譯where條件為in的sql語句的過程,在mysql環境中只有第四種方法實現了,Oracle中可能第三種也可以不過沒有測試,如果有需要可以直接跳轉。 1.通過拼接字串設定引數× 今天在實現一個數據庫批量更新

AndroidXposed框架篇---修改系統位置資訊實現自身隱藏功能

一、前言前文已經介紹了Xposed框架的基本使用規則,本文主要來介紹一個實際案例就是如何通過這個框架來修改系統的地理位置資訊來實現隱藏功能,在如今社交工具的發展特別是微信,他有一個實時位置共享功能,那麼

SpringMVC使用@RequestBody,@ResponseBody註解實現Java物件和XML/JSON資料自動轉換(上)

Spring3.1開始使用新的HandlerMapping 和 HandlerAdapter 來支援@Contoller 和@RequestMapping註解處理:處理器對映RequestMappingHandlerMapping和處理器介面卡RequestMappingH

AndroidXposed框架篇-修改系統位置資訊實現自身隱藏功能

本文轉載自Android中Xposed框架篇—修改系統位置資訊實現自身隱藏功能 前文已經介紹了Xposed框架的基本使用規則,本文主要來介紹一個實際案例,就是如何通過這個框架來修改系統的地理位置資訊來實現隱藏功能。在如今社交工具的發展特別快,微信有一個實時位置

openstack 啟動winserver映象,需要在計算節點nova.conf修改預設引數block_device_allocate_retries 的引數修改為180 秒

用winserver images 映象 建立虛擬機器時,總是報錯,一開始懷疑是映象做的有問題 後臺檢視報錯日誌" 2018-05-03 15:33:40.801 30313 ERROR nova.compute.manager [instance: e083334c-1655-40ee-8

Java長度可變引數實現 其實質是陣列

本文通過一個例子來說明 java中長度可變引數的實現,其實質相當於傳入的引數是一個數組: 在以上的例子中先定義類StringVarargTest再定義一個方法f(),其接收的引數型別是Strin

SpringMVC的路徑引數和URL引數

1、SpringMVC中的路徑引數就是指在路徑中新增引數,用於實現偽靜態是很好的。 2、路徑引數實現方式(一個Controller方法) @RequestMapping(value="/page/{name}/{age}",method=RequestM

獲取並修改request引數

導讀:創作本文目的是給使用jersey使用者修改request引數做一定參考的。filter 獲值後,修改引數後,介面接受資料為空。出現的原因是jersey框架內的安全機制造成的。可以自己瀏覽 jersey的API文件。 分享我的工作經歷: requ

如何檢視jvm的各種引數以及預設值

1 標準引數 標準引數(-),所有的JVM實現都必須實現這些引數的功能,而且向後相容; 通過命令 java即可檢視 如下 where options include: -d32 use a 32-bit data model