axisservlet.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 828 行 · 第 1/3 页
JAVA
828 行
if (ip == null) {
ip = "localhost";
}
} catch (SocketException e) {
throw AxisFault.makeFault(e);
}
}
String endpointRefernce = "http://" + ip + ":" + port;
if (configContext.getServiceContextPath().startsWith("/")) {
endpointRefernce = endpointRefernce +
configContext.getServiceContextPath() + "/" + serviceName;
} else {
endpointRefernce = endpointRefernce + '/' +
configContext.getServiceContextPath() + "/" + serviceName;
}
EndpointReference endpoint = new EndpointReference(endpointRefernce);
return new EndpointReference[]{endpoint};
}
/**
* init(); start() and stop() wouldn't do anything.
*
* @param axisConf
* @param transprtIn
* @throws AxisFault
*/
public void init(ConfigurationContext axisConf,
TransportInDescription transprtIn) throws AxisFault {
}
public void start() throws AxisFault {
}
public void stop() throws AxisFault {
}
/**
* @param request
* @param response
* @param invocationType : If invocationType=true; then this will be used in SOAP message
* invocation. If invocationType=false; then this will be used in REST message invocation.
* @return MessageContext
* @throws IOException
*/
protected MessageContext createMessageContext(HttpServletRequest request,
HttpServletResponse response,
boolean invocationType) throws IOException {
MessageContext msgContext = configContext.createMessageContext();
String requestURI = request.getRequestURI();
String trsPrefix = request.getRequestURL().toString();
int sepindex = trsPrefix.indexOf(':');
if (sepindex > -1) {
trsPrefix = trsPrefix.substring(0, sepindex);
msgContext.setIncomingTransportName(trsPrefix);
} else {
msgContext.setIncomingTransportName(Constants.TRANSPORT_HTTP);
trsPrefix = Constants.TRANSPORT_HTTP;
}
TransportInDescription transportIn =
axisConfiguration.getTransportIn(msgContext.getIncomingTransportName());
//set the default output description. This will be http
TransportOutDescription transportOut = axisConfiguration.getTransportOut(trsPrefix);
if (transportOut == null) {
// if the req coming via https but we do not have a https sender
transportOut = axisConfiguration.getTransportOut(Constants.TRANSPORT_HTTP);
}
msgContext.setTransportIn(transportIn);
msgContext.setTransportOut(transportOut);
msgContext.setServerSide(true);
if (!invocationType) {
String query = request.getQueryString();
if (query != null) {
requestURI = requestURI + "?" + query;
}
}
msgContext.setTo(new EndpointReference(requestURI));
msgContext.setFrom(new EndpointReference(request.getRemoteAddr()));
msgContext.setProperty(MessageContext.REMOTE_ADDR, request.getRemoteAddr());
msgContext.setProperty(Constants.OUT_TRANSPORT_INFO,
new ServletBasedOutTransportInfo(response));
// set the transport Headers
msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, getTransportHeaders(request));
msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST, request);
msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLETRESPONSE, response);
//setting the RequestResponseTransport object
msgContext.setProperty(RequestResponseTransport.TRANSPORT_CONTROL,
new ServletRequestResponseTransport(response));
return msgContext;
}
/**
* This method assumes, that the created MessageContext will be used in only SOAP invocation.
*
* @param req
* @param resp
* @return MessageContext
* @throws IOException
*/
protected MessageContext createMessageContext(HttpServletRequest req,
HttpServletResponse resp) throws IOException {
return createMessageContext(req, resp, true);
}
/**
* Transport session management.
*
* @param messageContext
* @return SessionContext
*/
public SessionContext getSessionContext(MessageContext messageContext) {
HttpServletRequest req = (HttpServletRequest) messageContext.getProperty(
HTTPConstants.MC_HTTP_SERVLETREQUEST);
SessionContext sessionContext =
(SessionContext) req.getSession(true).getAttribute(
Constants.SESSION_CONTEXT_PROPERTY);
String sessionId = req.getSession().getId();
if (sessionContext == null) {
sessionContext = new SessionContext(null);
sessionContext.setCookieID(sessionId);
req.getSession().setAttribute(Constants.SESSION_CONTEXT_PROPERTY,
sessionContext);
}
messageContext.setSessionContext(sessionContext);
messageContext.setProperty(SESSION_ID, sessionId);
return sessionContext;
}
protected class ServletRequestResponseTransport implements RequestResponseTransport {
private HttpServletResponse response;
private boolean responseWritten = false;
private CountDownLatch responseReadySignal = new CountDownLatch(1);
RequestResponseTransportStatus status = RequestResponseTransportStatus.INITIAL;
AxisFault faultToBeThrownOut = null;
ServletRequestResponseTransport(HttpServletResponse response) {
this.response = response;
}
public void acknowledgeMessage(MessageContext msgContext) throws AxisFault {
log.debug("Acking one-way request");
response.setContentType("text/xml; charset="
+ msgContext
.getProperty(Constants.Configuration.CHARACTER_SET_ENCODING));
response.setStatus(HttpServletResponse.SC_ACCEPTED);
try {
response.flushBuffer();
}
catch (IOException e) {
throw new AxisFault("Error sending acknowledgement", e);
}
signalResponseReady();
}
public void awaitResponse()
throws InterruptedException, AxisFault {
log.debug("Blocking servlet thread -- awaiting response");
status = RequestResponseTransportStatus.WAITING;
responseReadySignal.await();
if (faultToBeThrownOut != null) {
throw faultToBeThrownOut;
}
}
public void signalResponseReady() {
log.debug("Signalling response available");
status = RequestResponseTransportStatus.SIGNALLED;
responseReadySignal.countDown();
}
public RequestResponseTransportStatus getStatus() {
return status;
}
public void signalFaultReady(AxisFault fault) {
faultToBeThrownOut = fault;
signalResponseReady();
}
public boolean isResponseWritten() {
return responseWritten;
}
public void setResponseWritten(boolean responseWritten) {
this.responseWritten = responseWritten;
}
}
private void setResponseState(MessageContext messageContext, HttpServletResponse response) {
String state = (String) messageContext.getProperty(Constants.HTTP_RESPONSE_STATE);
if (state != null) {
int stateInt = Integer.parseInt(state);
if (stateInt == HttpServletResponse.SC_UNAUTHORIZED) { // Unauthorized
String realm = (String) messageContext.getProperty(Constants.HTTP_BASIC_AUTH_REALM);
response.addHeader("WWW-Authenticate",
"basic realm=\"" + realm + "\"");
}
}
}
/**
* Ues in processing REST related Requests.
* This is the helper Class use in processing of doGet, doPut , doDelete and doPost.
*/
protected class RestRequestProcessor {
private MessageContext messageContext;
private HttpServletRequest request;
private HttpServletResponse response;
public RestRequestProcessor(String httpMethodString,
HttpServletRequest request,
HttpServletResponse response) throws IOException {
this.request = request;
this.response = response;
messageContext = createMessageContext(this.request, this.response, false);
messageContext.setProperty(org.apache.axis2.transport.http.HTTPConstants.HTTP_METHOD,
httpMethodString);
}
public void processXMLRequest() throws IOException, ServletException {
try {
RESTUtil.processXMLRequest(messageContext, request.getInputStream(),
response.getOutputStream(), request.getContentType());
this.checkResponseWritten();
} catch (AxisFault axisFault) {
processFault(axisFault);
}
closeStaxBuilder(messageContext);
}
public void processURLRequest() throws IOException, ServletException {
try {
RESTUtil.processURLRequest(messageContext, response.getOutputStream(),
request.getContentType());
this.checkResponseWritten();
} catch (AxisFault e) {
setResponseState(messageContext, response);
processFault(e);
}
closeStaxBuilder(messageContext);
}
private void checkResponseWritten() {
if (!TransportUtils.isResponseWritten(messageContext)) {
response.setStatus(HttpServletResponse.SC_ACCEPTED);
}
}
private void processFault(AxisFault e) throws ServletException, IOException {
log.debug(e);
if (messageContext != null) {
processAxisFault(messageContext, response, response.getOutputStream(), e);
} else {
throw new ServletException(e);
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?