weixin_41139038 2023-03-15 10:41 采纳率: 50%
浏览 91
已结题

java怎么重定向POST,DELETE和PUT

我现在在为一个api服务实现一个前后处理的程序,其中只需要对少数几个请求做额外处理,其他请求都可以直接重定向到这个api服务即可。目前我使用了一个拦截器去重定向这些请求:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    boolean redirect = false;
    String uri = request.getRequestURI();
   if (shouldRedirect(uri)){
        response.setStatus(Httpservlet response.SC_TEMPORARY_REDIRECT);
        response.sendRedirect("http://localhost:8080"+uri);
        redirect = true;
    }
    return redirect;
}

但是这个程序只能重定向get请求,我要怎么样才能重定向post,delete和put请求呢?

  • 写回答

11条回答 默认 最新

  • 「已注销」 2023-03-15 10:50
    关注

    参考GPT和自己的思路:在 Java 中,使用 HttpURLConnection 类可以重定向 POST、DELETE 和 PUT 请求。以下是一个示例代码,可以在拦截器中使用:

    import java.net.HttpURLConnection;
    import java.net.URL;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    public class RedirectInterceptor extends HandlerInterceptorAdapter {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String uri = request.getRequestURI();
            if (shouldRedirect(uri)) {
                URL url = new URL("http://localhost:8080" + uri);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setInstanceFollowRedirects(false);
                connection.setRequestMethod(request.getMethod());
                connection.setRequestProperty("Content-Type", request.getContentType());
                connection.setRequestProperty("charset", "utf-8");
                connection.setDoOutput(true);
                connection.getOutputStream().write(getRequestBody(request));
                response.setStatus(connection.getResponseCode());
                response.setContentType(connection.getContentType());
                response.setCharacterEncoding("utf-8");
                response.getOutputStream().write(getResponseBody(connection));
                return false;
            }
            return true;
        }
    
        private boolean shouldRedirect(String uri) {
            // TODO: 判断是否需要重定向
        }
    
        private byte[] getRequestBody(HttpServletRequest request) throws IOException {
            // TODO: 获取请求体字节数组
        }
    
        private byte[] getResponseBody(HttpURLConnection connection) throws IOException {
            InputStream in = null;
            ByteArrayOutputStream out = null;
            try {
                in = connection.getInputStream();
                out = new ByteArrayOutputStream();
                byte[] buffer = new byte[4096];
                int length = 0;
                while ((length = in.read(buffer)) != -1) {
                    out.write(buffer, 0, length);
                }
                return out.toByteArray();
            } finally {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            }
        }
    
    }
    

    需要注意的是,这里使用了 setInstanceFollowRedirects(false) 来禁止自动重定向。同时,为了将请求体转发到重定向后的接口,需要先获取请求体字节数组,然后再写入到输出流中。同样地,需要将重定向后的响应体写入到 HttpServletResponse 的输出流中。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 修改了问题 3月15日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 电脑开机过商标后就直接这样,求解各位
  • ¥15 mysql , 用自己创建的本地主机和用户名 登录不上
  • ¥15 关于#web项目#的问题,请各位专家解答!
  • ¥15 vmtools环境不正常
  • ¥15 请问如何在Ubuntu系统中安装使用microsoft R open?
  • ¥15 jupyter notebook
  • ¥30 informer时间序列预测
  • ¥20 SSR引物多态性分析
  • ¥15 大漠插件在Win11易语言注册调用和免注册灵异事件,VS上注册调用完全没问题
  • ¥15 Addressable缓存机制做热更新的问题