web service访问控制和过滤器(axis)

使用axis的Handler进行访问控制

axis为Web服务的访问控制提供了相关的配置描述符,并且提供了一个访问控制的简单Handler(关于Handler的详细介绍见" J2EE Web服务开发系列之六: 使用Handler来增强Web服务的功能")。默认情况下,你只要在配置描述符中添加用户,然后在Web服务器的部署描述符中自动允许的角色即可。

首先在axis的配置文件users.lst(位于WEB-INF目录下)中添加一个用户,如"axisuser pass",表示用户名为axisuser,密码为pass。然后把案例的Web服务重新部署,在server-config.wsdd中添加例程7所示的部署代码。


例程7 重新部署PersonalTaxService

  <service name="PersonalTaxService2" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
    <parameter name="className" value="com.hellking.study.webservice.PersonalTaxService"/>
      <parameter name="allowedRoles" value="axisuser"/>
    <requestFlow>
    <handler name="authen"
 type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
    </requestFlow>
  </service>
  


在这个部署描述符中,指定PersonalTaxService2服务只能被axisuser访问,要想使访问控制生效,还必须把SimpleAuthenticationHandler添加到请求Handler链中。

你只要修改AuthClient代码的服务端点URL和访问用户名、密码,就可以测试新的Web服务了,如例程8所示。


例程8 HandlerAuthClient

public class HandlerAuthClient
{
。。。 
String endpointURL = "http://localhost:8080/axis/services/PersonalTaxService2?wsdl";
      。。。
   call.getMessageContext().setUsername("axisuser");//axis中的用户名。
   call.getMessageContext().setPassword("pass");//密码
。。。
 


执行HandlerAuthClient,能够顺利访问Web服务;如果修改用户名或者密码,那么就不能访问,这说明Axis的Handler对Web服务的访问权限进行了有效的控制。

使用Servlet过滤器(Filter)进行访问控制 Axis的Web服务端本质上是以Servlet方式在运行,所有我们完全可以在Web应用上部署一个Servlet过滤器,通过此过滤器来达到访问控制的效果。

Web应用中的过滤器截取从客户端进来的请求,然后进行一系列处理,最后把请求发送到目标Servlet。过滤器的工作原理如下图所示。


图1 过滤器工作原理
 

过滤器可以说是外部进入Web服务器的第一道关,它能决定请求是否继续向前转发,也能对请求中的信息进行处理。如果过滤器用于对Web服务进行访问控制,那么它能根据客户端信息决定目标的服务是否能调用成功。

将要开发的过滤器将根据客户端IP地址进行过滤,如果客户端的IP地址在限制范围中,那么就不能访问目标的Web服务。过滤器部分代码如下。


例程9 用过滤器限制Web服务的访问权限

package com.hellking.study.webservice;

import javax.servlet.FilterChain;
。。。
public class WebServicesFilter implements Filter
{
     //没有权限访问的IP地址
    static final String[] deniedIPList=new String[]{
                       "123.201",
                       "192.168",
                       "25.46",
                       "124.0.0.1"
                    };   
     public boolean isIPDenied(String ipAddr)
     {
         …
     }
   
    //过滤处理的方法
    public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)
        throws IOException,ServletException
    {
         HttpServletRequest hreq = (HttpServletRequest)req;
         HttpServletResponse hres = (HttpServletResponse)res;
         //HttpSession session = hreq.getSession();
         String clientIp=req.getRemoteAddr();
         System.out.println("开始过滤。。。");
         if(isIPDenied(clientIp))
         {
              //验证不成功,让用户登录。
             throw new ServletException("无权限访问此Web服务!");
          }       
         else
             {
                 //验证成功,继续处理
               chain.doFilter(req,res);            

             }     
            
    }   
    …
}
 


WebServicesFilter 过滤器限制了deniedIPList中指定的所有客户端。编写了过滤器后,需要在Web应用的部署描述符中指定使用此过滤器,并且把过滤器映射到目标URL上。当然,你也可以开发其它过滤器进行访问控制,比如Web服务客户端登录时,把登录信息保存在HTTP会话中,当客户端访问受限的资源时,读取HTTP会话中客户端信息以决定客户端是否有权限访问目标资源。

除了编写Servlet过滤器实现类外,还需要在web.xml中对它进行配置,并且把过滤器映射到要过滤的目标URI上。以下是过滤器的部署描述符。


例程10 部署过滤器

    <filter>
        <filter-name>WebServicesFilter</filter-name>
        <filter-class>com.hellking.study.webservice.WebServicesFilter</filter-class>
    </filter>   
    <filter-mapping>
        <filter-name>WebServicesFilter</filter-name>
        <url-pattern>/services/*</url-pattern>
    </filter-mapping>
    


url-pattern指定了过滤器要过滤的范围。"/services/*"表示以"/services"开始的URL将全部被过滤,这正是AxisServlet默认的URL。通过上面的配置,只要客户端调用axis Web服务,就会被WebServicesFilter过滤器过滤。如果客户端IP地址在过滤器的deniedIPList中,那么就不能访问目标服务。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值