在过滤器中修改HttpServletRequest 的cookies的sessionid

本文介绍如何在SpringBoot项目中使用自定义过滤器修改HTTP请求中的Cookies。通过创建SessionFilter类,可以在请求到达应用前修改Cookies中的SessionID。此外,文章还展示了如何在Application启动类中注册过滤器。
1.先写一个过滤器类,在过滤器中获得原有的request中的cookies,再new一个ModifyParametersWrapper对象,调用putHeader()去修改cookies中的sessionId   

public class SessionFilter extends Filter {
    public static final String SESSION = "SESSION";

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        ModifyParametersWrapper mParametersWrapper = new ModifyParametersWrapper(request);
        String sessionId = request.getHeader(SESSION);
        Cookie[] reqCookies = request.getCookies();
        StringBuilder cookies = new StringBuilder("");
        if (StringUtils.isNotBlank(sessionId)) {
            for (int i = 0; i < reqCookies.length; i++) {
                cookies.append(reqCookies[i].getName() + "=");
                if ("SESSION".equals(reqCookies[i].getName())) {
                    reqCookies[i].setValue(sessionId);
                    cookies.append(sessionId + ";");
                } else {
                    cookies.append(reqCookies[i].getValue() + ";");
                }
            }
            mParametersWrapper.putHeader("cookies", cookies.toString());
        }
        filterChain.doFilter(mParametersWrapper, response);
    }


    /**
     * 继承HttpServletRequestWrapper,创建装饰类,以达到修改HttpServletRequest参数的目的
     */
    private class ModifyParametersWrapper extends HttpServletRequestWrapper {
        private final Map<String, String> customHeaders;

        ModifyParametersWrapper(HttpServletRequest request) {
            super(request);
            this.customHeaders = new HashMap<>();
        }

        void putHeader(String name, String value) {
            this.customHeaders.put(name, value);
        }

        public String getHeader(String name) {
            String headerValue = customHeaders.get(name);
            if (headerValue != null) {
                return headerValue;
            }
            return ((HttpServletRequest) getRequest()).getHeader(name);
        }

        public Enumeration<String> getHeaderNames() {
            Set<String> set = new HashSet<>(customHeaders.keySet());
            Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
            while (e.hasMoreElements()) {
                String n = e.nextElement();
                set.add(n);
            }
            return Collections.enumeration(set);
        }
    }
}

 

2.过滤器要在项目的Application.java启动类中注入过滤器Bean(在SpringBoot项目中写过滤器还可以通过在过滤器类名上加入@Order注解设置优先级,再写一个Config类,将下面代码放入其中)

@Bean
public FilterRegistrationBean sessionFilter() {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    SessionFilter sessionFilter = new SessionFilter();
    filterRegistrationBean.setFilter(sessionFilter);
    List<String> urls = new ArrayList<>();
    urls.add("/*");//设置拦截路径
    filterRegistrationBean.setUrlPatterns(urls);//配置过滤规则
    filterRegistrationBean.setOrder(Integer.MIN_VALUE);
    return filterRegistrationBean;
}

另:想要修改request中的参数还可以通过类反射机制。参见https://blog.csdn.net/u010698072/article/details/79973830

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值