您的位置:首页 > 其它

WS服务用户访问控制拦截器

2013-01-06 15:39 148 查看
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.util.Arrays;
import java.util.Map;
import java.util.Properties;

import org.apache.cxf.binding.soap.interceptor.SoapHeaderInterceptor;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.transport.Conduit;
import org.apache.cxf.ws.addressing.EndpointReferenceType;
import org.springframework.core.io.Resource;

import com.huawei.support.framework.utils.StreamUtil;
import com.huawei.support.framework.utils.StringUtil;

public class AuthorizationInterceptor extends SoapHeaderInterceptor
{
private Properties props;

/**
* 配置路径
*/
private Resource configLocation;

/**
* @param 对configLocation进行赋值
*/
public void setConfigLocation(Resource aConfigLocation)
{
this.configLocation = aConfigLocation;
}

private Properties getProps()
{
if (null == props)
{
props = new Properties();
InputStream is = null;
try
{
is = configLocation.getInputStream();
props.load(is);
}
catch (IOException e)
{
props = null;
}
finally
{
StreamUtil.close(is);
}
}
return props;
}

@Override
public void handleMessage(Message aMsg) throws Fault
{
final AuthorizationPolicy policy = aMsg.get(AuthorizationPolicy.class);
if (null == policy)
{
sendErrorResponse(aMsg, HttpURLConnection.HTTP_UNAUTHORIZED);
return;
}
String userName = policy.getUserName();
String passwrod = policy.getPassword();

if (StringUtil.isNullOrEmpty(passwrod))
{
sendErrorResponse(aMsg, HttpURLConnection.HTTP_UNAUTHORIZED);
return;
}

if (!passwrod.equalsIgnoreCase(this.getProps().getProperty(userName)))
{
sendErrorResponse(aMsg, HttpURLConnection.HTTP_UNAUTHORIZED);
return;
}
super.handleMessage(aMsg);
}

private void sendErrorResponse(Message message, int responseCode)
{
Message outMessage = getOutMessage(message);
outMessage.put(Message.RESPONSE_CODE, responseCode);

// Set the response headers
Map responseHeaders = (Map) message.get(Message.PROTOCOL_HEADERS);

if (responseHeaders != null)
{
responseHeaders.put("WWW-Authenticate",
Arrays.asList(new String[] { "Basic realm=realm" }));

responseHeaders.put("Content-Length",
Arrays.asList(new String[] { "0" }));
}

message.getInterceptorChain().abort();
try
{
getConduit(message).prepare(outMessage);
close(outMessage);
}
catch (IOException e)
{
e.printStackTrace();
}

}

private Message getOutMessage(Message inMessage)
{
Exchange exchange = inMessage.getExchange();
Message outMessage = exchange.getOutMessage();
if (outMessage == null)
{
Endpoint endpoint = exchange.get(Endpoint.class);
outMessage = endpoint.getBinding().createMessage();
exchange.setOutMessage(outMessage);
}
outMessage.putAll(inMessage);
return outMessage;
}

private Conduit getConduit(Message inMessage) throws IOException
{
Exchange exchange = inMessage.getExchange();
EndpointReferenceType target = exchange.get(EndpointReferenceType.class);
Conduit conduit = exchange.getDestination().getBackChannel(inMessage,
null,
target);
exchange.setConduit(conduit);
return conduit;
}

private void close(Message outMessage) throws IOException
{
OutputStream os = outMessage.getContent(OutputStream.class);
os.flush();
os.close();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐