Это кодирует его, как это должно, Вы могли, вероятно, UrlDecode это для возвращения его с пробелами, но это не "искажается", это просто правильно кодируется.
я не уверен, что Вы пишете, но преобразовать его назад в asp.net, это - Сервер. UrlDecode (путь). Вы также смогли использовать LocalPath, а не AbsolutePath, если это - Приложение Windows.
Во-первых, вам нужно сохранить код состояния в доступном месте. Лучше всего обернуть ответ своей реализацией и оставить его там:
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;
}
}
Чтобы использовать эту оболочку, вам нужно добавить фильтр сервлета, где вы можете создавать отчеты:
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
}
}
Напишите HttpServletResponseWrapper и переопределите все методы setStatus (), sendError () и sendRedirect (), чтобы все регистрировать. Напишите фильтр, который заменяет вашу оболочку объектом ответа при каждом запросе.
One thing missing from David's answer above is that you should also override the other form of sendError:
@Override
public void sendError(int sc, String msg) throws IOException {
httpStatus = sc;
super.sendError(sc, msg);
}