spring修改/添加cookie、header、请求参数(mvc/boot)

本文介绍了一个自定义的HTTP请求参数拦截器,该拦截器能够修改HTTP请求头、参数及Cookie等信息,并详细展示了其实现原理及其在Spring Boot项目中的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过滤器

import com.fqfin.test.core.utils.CookieUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;

/**
 * <br/>
 * Author:Logan  Date:2019/9/23 0023 19:13
 */
public class ModifyParametersFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // 修改cookie
        ModifyHttpServletRequestWrapper mParametersWrapper = new ModifyHttpServletRequestWrapper(request);

        mParametersWrapper.addParameter("", "");
        mParametersWrapper.putCookie("", "");
        mParametersWrapper.addHeader("", "");

        // finish
        filterChain.doFilter(mParametersWrapper, response);
    }

    private class ModifyHttpServletRequestWrapper extends HttpServletRequestWrapper {

        private Map<String, String> mapCookies;
        //将request对象中的参数修改后,放在这个集合里,随后项目取的所有Parameter都是从这个集合中取数
        private Map<String, String[]> params;
        private Map<String, String> headerMap;

        ModifyHttpServletRequestWrapper(HttpServletRequest request) {
            super(request);

            this.mapCookies = new HashMap<>();
            this.params = new HashMap<>();
            this.headerMap = new HashMap<>();
        }

        public void addHeader(String name, String value) {
            headerMap.put(name, value);
        }

        @Override
        public String getHeader(String name) {
            System.out.println("getHeader >>> " + name);
            if (name.equals("fqKey")) {
                return "test_oooo";
            }
            String headerValue = super.getHeader(name);
            if (headerMap.containsKey(name)) {
                headerValue = headerMap.get(name);
            }
            return headerValue;
        }

        /**
         * get the Header names
         */
        @Override
        public Enumeration<String> getHeaderNames() {
            List<String> names = Collections.list(super.getHeaderNames());
            for (String name : headerMap.keySet()) {
                names.add(name);
            }
            return Collections.enumeration(names);
        }

        @Override
        public Enumeration<String> getHeaders(String name) {
            System.out.println("getHeaders >>> " + name);
            if (name.equals("fqKey")) {
                ArrayList list = new ArrayList();
                list.add("test_ooo");
                return Collections.enumeration(list);
            }
            List<String> values = Collections.list(super.getHeaders(name));
            if (headerMap.containsKey(name)) {
                values = Arrays.asList(headerMap.get(name));
            }
            return Collections.enumeration(values);
        }

        @Override
        public String getParameter(String name) {
            System.out.println("getParameter >>> " + name);
            String[] strings = params.get(name);
            return strings != null ? strings[0] : null;
        }

        @Override
        public Map<String, String[]> getParameterMap() {
            System.out.println("getParameterMap >>> ");
            return params;
        }

        @Override
        public String[] getParameterValues(String name) {
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            if (requestAttributes != null) {
                HttpServletRequest requestTmp = ((ServletRequestAttributes) requestAttributes).getRequest();
                CookieUtils.getCookieValue(requestTmp, "");
            }
            System.out.println("getParameterValues >>> " + name);
            return params.get(name);
        }

        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)});
                }
            }
        }

        void putCookie(String name, String value) {
            this.mapCookies.put(name, value);
        }

        @Override
        public Cookie[] getCookies() {
            HttpServletRequest request = (HttpServletRequest) getRequest();
            Cookie[] cookies = request.getCookies();
            if (mapCookies == null || mapCookies.isEmpty()) {
                return cookies;
            }
            if (cookies == null || cookies.length == 0) {
                List<Cookie> cookieList = new LinkedList<>();
                for (Map.Entry<String, String> entry : mapCookies.entrySet()) {
                    String key = entry.getKey();
                    if (key != null && !"".equals(key)) {
                        cookieList.add(new Cookie(key, entry.getValue()));
                    }
                }
                if (cookieList.isEmpty()) {
                    return cookies;
                }
                return cookieList.toArray(new Cookie[cookieList.size()]);
            } else {
                List<Cookie> cookieList = new ArrayList<>(Arrays.asList(cookies));
                for (Map.Entry<String, String> entry : mapCookies.entrySet()) {
                    String key = entry.getKey();
                    if (key != null && !"".equals(key)) {
                        for (int i = 0; i < cookieList.size(); i++) {
                            if (cookieList.get(i).getName().equals(key)) {
                                cookieList.remove(i);
                            }
                        }
                        cookieList.add(new Cookie(key, entry.getValue()));
                    }
                }
                return cookieList.toArray(new Cookie[cookieList.size()]);
            }
        }

    }
}

web.xml配置,如果是boot,直接在类上面加@WebFilter注解

<filter>
        <filter-name>ModifyParametersFilter</filter-name>
        <filter-class>com.xxx.test.core.framework.filter.ModifyParametersFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ModifyParametersFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <!-- 直接从客户端过来的请求以及通过forward过来的请求都要经过该过滤器 -->
        <!--<dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>-->
    </filter-mapping>

controller

@PostMapping("/test00")
    @ResponseBody
    public WebResult test00(@RequestHeader(value = "fqKey", required = true) String fqKey,
                            @RequestParam(value = "test01", required = false) String test01,
                            @RequestParam(value = "test02", required = false) String test02) {
        WebResult webResult = new WebResult();
        System.out.println("test00方法 >>>");
        System.out.println("fqKey >>> " + fqKey);
        System.out.println("test01 >>> " + test01);
        System.out.println("test02 >>> " + test02);
        System.out.println("");
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
        webResult.setData(IPUtil.getRemoteIP(request));
        return webResult;
    }

controller里面会调用以下方法,在对应的方法里面进行改造即可

1、getHeaders

2、getParameterValues

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值