0 0

Servlet中如何获取response的statusCode30

HttpURLConnection.getResponseCode()可以获取,但需要new一个URL对象并重新发送请求,有性能损失。有没其他的获取statusCode的方法。
我在Oracle官网论坛上看见别人的讨论:可以通过apache的工具类org.apache.catalina.valves.RequestDumperValve来获取,但自己未找到其源码。另外也有人说对Reponse对象封装来跟踪statuCode,说的比较模糊,实现不便。
各位大牛们有什么好的办法?若实在要用HttpURLConnection.getResponseCode()那有没办法避免请求被过滤器拦截(我想是不可能地)。先说声谢谢! 全部分奉上!

问题补充:
xiaolongfeixiang 写道

Servlet获取谁传来的reponse的StatusCode ??

情况是这样的,一个Servlet主入口负责处理分发过来的HttpServletRequest请求和HttpServletRsponse响应(在配置文件中定义好的),在HttpServletResponse.setStatusCode()和设置响应报文后,在跳出该方法。我想获取该方法执行完后再来获取Response的statusCode,这是Response只是一个HttpServeltResponse接口。



问题补充:
lzj0470 写道
你是怎么提交请求的?
用的是JAVA的URL还是其他开源工具访问URL

Java的URL

问题补充:
myali88 写道
网上搜索的,你试试:
1.先实现一个对Response的包装器:
public class StatusExposingServletResponse extends HttpServletResponseWrapper {

    private int httpStatus;

    public StatusExposingServletResponse(HttpServletResponse response) {
        super(response);
    }

    @Override
    public void sendError(int sc) throws IOException {
        httpStatus = sc;
        super.sendError(sc);
    }

    @Override
    public void sendError(int sc, String msg) throws IOException {
        httpStatus = sc;
        super.sendError(sc, msg);
    }


    @Override
    public void setStatus(int sc) {
        httpStatus = sc;
        super.setStatus(sc);
    }

    public int getStatus() {
        return httpStatus;
    }

}

2.然后实现一个Filter来替换原始的HttpServletResponse,这样你就可以在Filter里面取到statusCode了
public class StatusReportingFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        StatusExposingServletResponse response = new StatusExposingServletResponse((HttpServletResponse)res);
        chain.doFilter(req, response);
        int status = response.getStatus();
        // report
    }

    public void init(FilterConfig config) throws ServletException {
        //empty
    }

    public void destroy() {
        // empty
    }

}

一语解千愁!
2010年5月06日 23:49

5个答案 按时间排序 按投票排序

0 0

采纳的答案

网上搜索的,你试试:
1.先实现一个对Response的包装器:

public class StatusExposingServletResponse extends HttpServletResponseWrapper {

    private int httpStatus;

    public StatusExposingServletResponse(HttpServletResponse response) {
        super(response);
    }

    @Override
    public void sendError(int sc) throws IOException {
        httpStatus = sc;
        super.sendError(sc);
    }

    @Override
    public void sendError(int sc, String msg) throws IOException {
        httpStatus = sc;
        super.sendError(sc, msg);
    }


    @Override
    public void setStatus(int sc) {
        httpStatus = sc;
        super.setStatus(sc);
    }

    public int getStatus() {
        return httpStatus;
    }

}

2.然后实现一个Filter来替换原始的HttpServletResponse,这样你就可以在Filter里面取到statusCode了
public class StatusReportingFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        StatusExposingServletResponse response = new StatusExposingServletResponse((HttpServletResponse)res);
        chain.doFilter(req, response);
        int status = response.getStatus();
        // report
    }

    public void init(FilterConfig config) throws ServletException {
        //empty
    }

    public void destroy() {
        // empty
    }

}

2010年5月07日 15:21
0 0

StatusCode 似乎 Servelt API中,无论是 Filter Wrapper Reponse,都没有提供 get的方法。

2010年5月07日 10:22
0 0

两个专门的设置方法:
1,public void sendError(int code, String message)
sendError方法发送一个状态代码(通常是404)沿一个短消息自动内部的格式化HTML文档,发送到客户端。
2,public void sendRedirect(String url)
sendRedirect方法生成一个302响应沿一个Location头给予了新的文档的URL。

因为状态行中的http servion由server指定,而message直接与status code相关,所以要做的事情就是指定status code。通过HttpServletResponse.setStatus设定status code。如果server还返回了documents,一定要先设置status code,再call PrintWriter来返回doc。
理论上来说,应该按照status codes,http headers,docs的顺序call相关的方法产生相应的东东。但是buffer的概念所以,产生的顺序可以变化。因为,servlet可buffer http headers(用setHeader),所以http headers可以在任何顺序产生,servlet buffer它,然后一次性send,其他则不行。
Servlet2.1里PrintWriter不能buffer,所以当开始使用PrintWriter来output时,就不能再设置header了。Servlet2.2中PrintWriter的输出允许buffer。

2010年5月07日 09:11
0 0


Servlet获取谁传来的reponse的StatusCode ??



2010年5月07日 07:44
0 0

你是怎么提交请求的?
用的是JAVA的URL还是其他开源工具访问URL

2010年5月07日 00:29

相关推荐

Global site tag (gtag.js) - Google Analytics