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

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();
    }
    
}

 

转载于:https://www.cnblogs.com/onlywujun/archive/2013/01/06/2847800.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值