最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot如何通過(guò)filter修改Header的值

 更新時(shí)間:2023年07月19日 10:15:05   作者:小石潭記丶  
這篇文章主要介紹了Springboot如何通過(guò)filter修改Header的值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Springboot通過(guò)filter修改Header的值

import org.apache.tomcat.util.http.MimeHeaders;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.*;
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.lang.reflect.Field;
import java.util.*;
/**
 * 攔截器配置
 */
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean modifyParametersFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new ModifyParametersFilter());
        registration.addUrlPatterns("/*");              // 攔截路徑
        registration.setName("modifyParametersFilter"); // 攔截器名稱
        registration.setOrder(1);                       // 順序
        return registration;
    }
    /**
     * 自定義攔截器
     */
    class ModifyParametersFilter extends OncePerRequestFilter {
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            // 修改請(qǐng)求頭
            Map<String, String> map = new HashMap<>();
            modifyHeaders(map, request);
            // 修改cookie
            ModifyHttpServletRequestWrapper requestWrapper = new ModifyHttpServletRequestWrapper(request);
            String token = request.getHeader("token");
            if (token != null && !"".equals(token)) {
                requestWrapper.putCookie("SHIROSESSIONID", token);
            }
            // finish
            filterChain.doFilter(requestWrapper, response);
        }
    }
    /**
     * 修改請(qǐng)求頭信息
     * @param headerses
     * @param request
     */
  private void modifyHeaders(Map<String, String> headerses, HttpServletRequest request {
        if (headerses == null || headerses.isEmpty()) {
            return;
        }
        Class<? extends HttpServletRequest> requestClass = request.getClass();
        try {
            Field request1 = requestClass.getDeclaredField("request");
            request1.setAccessible(true);
            Object o = request1.get(request);
            Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest");
            coyoteRequest.setAccessible(true);
            Object o1 = coyoteRequest.get(o);
            Field headers = o1.getClass().getDeclaredField("headers");
            headers.setAccessible(true);
            MimeHeaders o2 = (MimeHeaders)headers.get(o1);
            for (Map.Entry<String, String> entry : headerses.entrySet()) {
                o2.removeHeader(entry.getKey());
                o2.addValue(entry.getKey()).setString(entry.getValue());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 修改cookie信息
     */
    class ModifyHttpServletRequestWrapper extends HttpServletRequestWrapper {
        private Map<String, String> mapCookies;
        ModifyHttpServletRequestWrapper(HttpServletRequest request) {
            super(request);
            this.mapCookies = new HashMap<>();
        }
        public void putCookie(String name, String value) {
            this.mapCookies.put(name, value);
        }
        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()]);
            }

Springboot獲取請(qǐng)求頭header里面的信息

項(xiàng)目中后端服務(wù)經(jīng)常需要前端傳的請(qǐng)求頭里的信息,給大家分享一下:

1、循環(huán)獲取

/**
? ? ?* 獲取判斷請(qǐng)求頭的參數(shù)
? ? ?* @return
? ? ?*/
? ? public?static?boolean checkHeaderName(){
? ? ? ? RequestAttributes ra = RequestContextHolder.getRequestAttributes();
? ? ? ? if(Objects.isNull(ra)){
? ? ? ? ? ? log.info("服務(wù)里RequestAttributes對(duì)象為空");
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? ServletRequestAttributes sra = (ServletRequestAttributes) ra;
? ? ? ? HttpServletRequest request = sra.getRequest();
? ? ? ? Enumeration<String> enumeration = request.getHeaderNames();
? ? ? ? while (enumeration.hasMoreElements()) {
? ? ? ? ? ? String name = enumeration.nextElement();
? ? ? ? ? ? String value = request.getHeader(name);
? ? ? ? ? ? if(name.equals("accept-"+HeaderEnum.language.name()) && value.equals(HeaderEnum.language.head())){
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? ? ? /**
? ? ? ? ? ? ?* 或者其他的業(yè)務(wù)處理
? ? ? ? ? ? ?*/
? ? ? ? }
? ? ? ? return false;
? ? }

2、根據(jù)具體的key獲取

/**
? ? ?*獲取 判斷請(qǐng)求頭的參數(shù)
? ? ?* @return
? ? ?*/
? ? public static?boolean?checkHeader(){
? ? ? ? RequestAttributes ra = RequestContextHolder.getRequestAttributes();
? ? ? ? if(Objects.isNull(ra)){
? ? ? ? ? ? log.info("服務(wù)里RequestAttributes對(duì)象為空");
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? ServletRequestAttributes sra = (ServletRequestAttributes) ra;
? ? ? ? HttpServletRequest request = sra.getRequest();
? ? ? ? String head = request.getHeader("accept-"+HeaderEnum.language.name());
? ? ? ? if(head.equals(HeaderEnum.language.head())){
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? /**
? ? ? ? ?* 或者其他的業(yè)務(wù)處理
? ? ? ? ?*/
? ? ? ? return false;
? ? }

3、修改請(qǐng)求頭信息

只能依靠反射原原理(HttpServletRequest中定義的對(duì)Header的操作全是只讀,沒(méi)有修改)。

假設(shè)的場(chǎng)景是,需要對(duì)請(qǐng)求Header統(tǒng)一添加一個(gè)x-request-id,通過(guò)這個(gè)ID來(lái)從日志中定位每一個(gè)請(qǐng)求。

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.UUID;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.RequestFacade;
import org.apache.tomcat.util.http.MimeHeaders;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
@WebFilter(urlPatterns = "/*")
@Component
@Order(-999)
public class RequestIdGenFilter extends HttpFilter {
?? ?/**
?? ? *?
?? ? */
?? ?private static final long serialVersionUID = 1787347739651657706L;
?? ?@Override
?? ?protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
?? ??? ?try {
?? ??? ??? ?// 從 RequestFacade 中獲取 org.apache.catalina.connector.Request
?? ??? ??? ?Field connectorField = ReflectionUtils.findField(RequestFacade.class, "request", Request.class);
?? ??? ??? ?connectorField.setAccessible(true);
?? ??? ??? ?Request connectorRequest = (Request) connectorField.get(req);
?? ??? ??? ?// 從 org.apache.catalina.connector.Request 中獲取 org.apache.coyote.Request
?? ??? ??? ?Field coyoteField = ReflectionUtils.findField(Request.class, "coyoteRequest", org.apache.coyote.Request.class);
?? ??? ??? ?coyoteField.setAccessible(true);
?? ??? ??? ?org.apache.coyote.Request coyoteRequest = (org.apache.coyote.Request) coyoteField.get(connectorRequest);
?? ??? ??? ?// 從 org.apache.coyote.Request 中獲取 MimeHeaders
?? ??? ??? ?Field mimeHeadersField = ?ReflectionUtils.findField(org.apache.coyote.Request.class, "headers", MimeHeaders.class);
?? ??? ??? ?mimeHeadersField.setAccessible(true);
?? ??? ??? ?MimeHeaders mimeHeaders = ?(MimeHeaders) mimeHeadersField.get(coyoteRequest);
?? ??? ??? ?this.mineHeadersHandle(mimeHeaders);
?? ??? ?} catch (Exception e) {
?? ??? ??? ?throw new RuntimeException(e);
?? ??? ?}
?? ??? ?super.doFilter(req, res, chain);
?? ?}
?? ?protected void mineHeadersHandle (MimeHeaders mimeHeaders) {
?? ??? ?// 添加一個(gè)Header,隨機(jī)生成請(qǐng)求ID
?? ??? ?mimeHeaders.addValue("x-request-id").setString(UUID.randomUUID().toString());;
?? ??? ?// 移除一個(gè)header
?? ??? ?mimeHeaders.removeHeader("User-Agent");
?? ?}
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot在服務(wù)器上的幾種啟動(dòng)方式(小結(jié))

    springboot在服務(wù)器上的幾種啟動(dòng)方式(小結(jié))

    這篇文章主要介紹了springboot在服務(wù)器上的幾種啟動(dòng)方式(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Java使用flyway實(shí)現(xiàn)腳本自動(dòng)化的方法詳解

    Java使用flyway實(shí)現(xiàn)腳本自動(dòng)化的方法詳解

    Flyway是一個(gè)開(kāi)源的數(shù)據(jù)庫(kù)版本控制工具,主要用于管理數(shù)據(jù)庫(kù)的版本和變更,它可以自動(dòng)化地將數(shù)據(jù)庫(kù)遷移到不同的版本,同時(shí)支持多種數(shù)據(jù)庫(kù)類型,本文給大家介紹了如何使用flyway實(shí)現(xiàn)腳本自動(dòng)化,需要的朋友可以參考下
    2023-10-10
  • Springboot?@Async多線程獲取返回值方式

    Springboot?@Async多線程獲取返回值方式

    這篇文章主要介紹了Springboot?@Async多線程獲取返回值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 關(guān)于servlet向mysql添加數(shù)據(jù)時(shí)中文亂碼問(wèn)題的解決

    關(guān)于servlet向mysql添加數(shù)據(jù)時(shí)中文亂碼問(wèn)題的解決

    最近在工作中遇到一個(gè)小問(wèn)題,出現(xiàn)了中文亂碼的問(wèn)題,無(wú)奈只能想辦法解決,下面這篇文章主要給大家介紹了關(guān)于servlet向mysql添加數(shù)據(jù)時(shí)中文亂碼問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • Java中控制多線程執(zhí)行順序的8種方法

    Java中控制多線程執(zhí)行順序的8種方法

    在并發(fā)編程中,控制線程執(zhí)行順序是一個(gè)常見(jiàn)且重要的需求,Java提供了多種機(jī)制來(lái)實(shí)現(xiàn)線程順序控制,本文將全面介紹8種核心方法,涵蓋從基礎(chǔ)到高級(jí)的各種場(chǎng)景需求,需要的朋友可以參考下
    2025-03-03
  • Quarkus中實(shí)現(xiàn)Resteasy的文件上傳下載操作

    Quarkus中實(shí)現(xiàn)Resteasy的文件上傳下載操作

    這篇文章主要為大家介紹了Quarkus中實(shí)現(xiàn)Resteasy的文件上傳下載的操作過(guò)程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • 實(shí)例詳解Spring Boot實(shí)戰(zhàn)之Redis緩存登錄驗(yàn)證碼

    實(shí)例詳解Spring Boot實(shí)戰(zhàn)之Redis緩存登錄驗(yàn)證碼

    本章簡(jiǎn)單介紹redis的配置及使用方法,本文示例代碼在前面代碼的基礎(chǔ)上進(jìn)行修改添加,實(shí)現(xiàn)了使用redis進(jìn)行緩存驗(yàn)證碼,以及校驗(yàn)驗(yàn)證碼的過(guò)程。感興趣的的朋友一起看看吧
    2017-08-08
  • spring源碼下載、編譯、debug的詳細(xì)教程

    spring源碼下載、編譯、debug的詳細(xì)教程

    這篇文章主要介紹了spring源碼下載、編譯、debug的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 使用FastAPI和Redis實(shí)現(xiàn)實(shí)時(shí)通知方式(SSE)

    使用FastAPI和Redis實(shí)現(xiàn)實(shí)時(shí)通知方式(SSE)

    本文介紹了如何使用FastAPI和Redis實(shí)現(xiàn)Server-SentEvents(SSE)來(lái)推送實(shí)時(shí)通知,Server-SentEvents是一種單向數(shù)據(jù)流技術(shù),適用于實(shí)時(shí)數(shù)據(jù)推送場(chǎng)景,FastAPI和Redis的結(jié)合可以高效地實(shí)現(xiàn)這一功能,并通過(guò)心跳機(jī)制管理連接
    2026-01-01
  • 詳細(xì)講述Java中的對(duì)象轉(zhuǎn)型

    詳細(xì)講述Java中的對(duì)象轉(zhuǎn)型

    在本篇文章里我們給大家詳細(xì)分享了關(guān)于Java中的對(duì)象轉(zhuǎn)型的知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2018-10-10

最新評(píng)論

靖西县| 喀什市| 定兴县| 虎林市| 绥棱县| 锦州市| 盈江县| 剑阁县| 阿克苏市| 孙吴县| 华亭县| 南召县| 迁西县| 调兵山市| 清丰县| 会昌县| 商南县| 彭山县| 年辖:市辖区| 阿克陶县| 山阳县| 眉山市| 监利县| 公主岭市| 和龙市| 灵台县| 舞钢市| 本溪| 乾安县| 安丘市| 白沙| 泾川县| 女性| 襄垣县| 宜良县| 马关县| 中卫市| 宜兰县| 丰宁| 彩票| 隆回县|