Java中getresponse_java-如何从ServletFilter中的ServletResponse中获取HTTP状态代码?

如果您使用的是旧容器,那么使用实际状态代码(以防在使用包装器设置后发生更改的情况下)的David Rabinowitz的替代解决方案是:

public class StatusExposingServletResponse extends HttpServletResponseWrapper {

public StatusExposingServletResponse(HttpServletResponse response) {

super(response);

}

@Override

public void sendError(int sc) throws IOException {

super.sendError(sc);

}

@Override

public void sendError(int sc, String msg) throws IOException {

super.sendError(sc, msg);

}

@Override

public void setStatus(int sc) {

super.setStatus(sc);

}

public int getStatus() {

try {

ServletResponse object = super.getResponse();

// call the private method 'getResponse'

Method method1 = object.getClass().getMethod("getResponse");

Object servletResponse = method1.invoke(object, new Object[] {});

// call the parents private method 'getResponse'

Method method2 = servletResponse.getClass().getMethod("getResponse");

Object parentResponse = method2.invoke(servletResponse, new Object[] {});

// call the parents private method 'getResponse'

Method method3 = parentResponse.getClass().getMethod("getStatus");

int httpStatus = (Integer) method3.invoke(parentResponse, new Object[] {});

return httpStatus;

}

catch (Exception e) {

e.printStackTrace();

return HttpServletResponse.SC_ACCEPTED;

}

}

public String getMessage() {

try {

ServletResponse object = super.getResponse();

// call the private method 'getResponse'

Method method1 = object.getClass().getMethod("getResponse");

Object servletResponse = method1.invoke(object, new Object[] {});

// call the parents private method 'getResponse'

Method method2 = servletResponse.getClass().getMethod("getResponse");

Object parentResponse = method2.invoke(servletResponse, new Object[] {});

// call the parents private method 'getResponse'

Method method3 = parentResponse.getClass().getMethod("getReason");

String httpStatusMessage = (String) method3.invoke(parentResponse, new Object[] {});

if (httpStatusMessage == null) {

int status = getStatus();

java.lang.reflect.Field[] fields = HttpServletResponse.class.getFields();

for (java.lang.reflect.Field field : fields) {

if (status == field.getInt(servletResponse)) {

httpStatusMessage = field.getName();

httpStatusMessage = httpStatusMessage.replace("SC_", "");

if (!"OK".equals(httpStatusMessage)) {

httpStatusMessage = httpStatusMessage.toLowerCase();

httpStatusMessage = httpStatusMessage.replace("_", " ");

httpStatusMessage = capitalizeFirstLetters(httpStatusMessage);

}

break;

}

}

}

return httpStatusMessage;

}

catch (Exception e) {

e.printStackTrace();

return "";

}

}

private static String capitalizeFirstLetters(String s) {

for (int i = 0; i < s.length(); i++) {

if (i == 0) {

// Capitalize the first letter of the string.

s = String.format("%s%s", Character.toUpperCase(s.charAt(0)), s.substring(1));

}

if (!Character.isLetterOrDigit(s.charAt(i))) {

if (i + 1 < s.length()) {

s = String.format("%s%s%s", s.subSequence(0, i + 1),

Character.toUpperCase(s.charAt(i + 1)),

s.substring(i + 2));

}

}

}

return s;

}

@Override

public String toString() {

return this.getMessage() + " " + this.getStatus();

}

}

警告:使用偷偷摸摸的反思和自省来获取私有数据值时,会对类层次结构进行许多假设。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值