当前位置: 代码网 > it编程>编程语言>Java > 利用过滤器修改response中的返回值

利用过滤器修改response中的返回值

2024年12月13日 Java 我要评论
过滤器修改response的返回值1. 继承httpservletresponsewrapper重新覆盖response对象,用来获取response中的返回值package com.example.

过滤器修改response的返回值

1. 继承httpservletresponsewrapper

重新覆盖response对象,用来获取response中的返回值

package com.example.demo.wrapper;

import javax.servlet.servletoutputstream;
import javax.servlet.writelistener;
import javax.servlet.http.httpservletresponse;
import javax.servlet.http.httpservletresponsewrapper;
import java.io.*;

public class responsewrapper extends httpservletresponsewrapper {
    private bytearrayoutputstream buffer = null;
    private servletoutputstream out = null;
    private printwriter writer = null;

    public responsewrapper(httpservletresponse resp) throws ioexception {
        super(resp);
        buffer = new bytearrayoutputstream();// 真正存储数据的流
        out = new wapperedoutputstream(buffer);
        writer = new printwriter(new outputstreamwriter(buffer));
    }

    @override
    public servletoutputstream getoutputstream() throws ioexception {
        return out;
    }

    @override
    public printwriter getwriter() throws unsupportedencodingexception {
        return writer;
    }

    @override
    public void flushbuffer() throws ioexception {
        if (out != null) {
            out.flush();
        }
        if (writer != null) {
            writer.flush();
        }
    }

    @override
    public void reset() {
        buffer.reset();
    }

    public byte[] getresponsedata() throws ioexception {
        flushbuffer();
        return buffer.tobytearray();
    }

    public string getcontent() throws ioexception {
        flushbuffer();
        return buffer.tostring();
    }


    private class wapperedoutputstream extends servletoutputstream {
        private bytearrayoutputstream bos = null;

        public wapperedoutputstream(bytearrayoutputstream stream) throws ioexception {
            bos = stream;
        }

        @override
        public void write(int b) throws ioexception {
            bos.write(b);
        }

        @override
        public void write(byte[] b) throws ioexception {
            bos.write(b, 0, b.length);
        }

        @override
        public void write(byte[] b, int off, int len) throws ioexception {
            bos.write(b, off, len);
        }

        @override
        public boolean isready() {
            return false;
        }

        @override
        public void setwritelistener(writelistener writelistener) {

        }
    }
}

2、创建过滤器

修改response中的内容,返回

package com.example.demo.filter;

import com.example.demo.wrapper.responsewrapper;
import org.apache.commons.lang.stringutils;
import org.springframework.http.mediatype;
import org.springframework.stereotype.component;

import javax.servlet.*;
import javax.servlet.http.httpservletresponse;
import java.io.ioexception;
import java.io.outputstream;
import java.io.printwriter;

@component
public class responsefilter implements filter {
    @override
    public void init(filterconfig filterconfig) throws servletexception {

    }

    @override
    public void destroy() {

    }

    @override
    public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {

        responsewrapper responsewrapper = new responsewrapper((httpservletresponse) servletresponse);
        filterchain.dofilter(servletrequest, responsewrapper);
        string contenttype = responsewrapper.getcontenttype();
        byte[] content = responsewrapper.getresponsedata();
        string str="";
        if (stringutils.isnotblank(contenttype) && (contenttype.contains(mediatype.application_json_value) || contenttype.contains(mediatype.text_html_value))) {
           str = new string(content);
            str=str+"xiaoming";
            system.out.println("filter:"+str);
            httpservletresponse response=(httpservletresponse)servletresponse;
            writeresponse(response,200,str);
        }
    }
    public static void writeresponse(httpservletresponse response, int status, string json) {
        try {
            response.reset();//很重要
            response.setheader("access-control-allow-origin", "*");
            response.setheader("access-control-allow-methods", "*");
            response.setcontenttype("application/json;charset=utf-8");
            response.setstatus(status);
            response.getwriter().write(json);
        } catch (ioexception e) {
            e.printstacktrace();
        }
    }
}

3、配置过滤器

package com.example.demo.config;

import com.example.demo.filter.responsefilter;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.springbootconfiguration;
import org.springframework.boot.web.servlet.filterregistrationbean;
import org.springframework.context.annotation.bean;

import java.util.arraylist;
import java.util.list;

@springbootconfiguration
public class filterconfig {
    @autowired
   private responsefilter  responsefilter;
    @bean
    public filterregistrationbean getfilterconfig(){
        filterregistrationbean filterregistrationbean=new filterregistrationbean();
        filterregistrationbean.setfilter(responsefilter);
        list<string> filterlist=new arraylist<>();
        filterlist.add("/*");
        filterregistrationbean.seturlpatterns(filterlist);
        return filterregistrationbean;
    }


}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

  • 基于Maven pom文件使用分析

    基于Maven pom文件使用分析

    projectmaven 是一个强大的构建和依赖管理工具,pom.xml 文件是 maven 项目的核心配置文件,用于定义项目的构建、依赖关系、插件、目标等。它... [阅读全文]
  • Java8 CompletableFuture异步编程解读

    Java8 CompletableFuture异步编程解读

    completablefuturede介绍java 8 引入了 completablefuture 类,这是 java 异步编程的一个重要进展。completa... [阅读全文]
  • java集合超详细(最新推荐)

    1 - 概述所有的集合类和集合接口都在java.util包下。在内存中申请一块空间用来存储数据,在java中集合就是替换掉定长的数组的一种引用数据类型。2 - 集合与数组的区别长度…

    2024年12月14日 编程语言
  • Mybatis中SQL的执行过程详解

    Mybatis中SQL的执行过程详解

    mybatis 框架sql执行过程数据库操作映射方式mybatis支持两种方式进行数据库操作映射:映射文件:通过xml文件来定义sql语句和映射关系注解方式:通... [阅读全文]
  • IDEA性能优化方法解决卡顿问题

    IDEA性能优化方法解决卡顿问题

    前言我们在使用 intellij idea的时候有时候会觉得卡顿,那么如何在不升级电脑配置的情况下让 intellij idea的性能更好呢?我们可以通过去修改... [阅读全文]
  • java 抽象类示例详解

    一、抽象类概述:我们知道,类用来模拟现实事物。一个类可以模拟一类事物,而某个类的一个实例化对象可以模拟某个属于该类的具体的事物。类中描绘了该类所有对象共同的特性,当一个类中给出的信…

    2024年12月14日 编程语言

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com