首页 > 其他分享 >cxf中自定义拦截器限制IP

cxf中自定义拦截器限制IP

时间:2022-12-02 11:37:23浏览次数:29  
标签:拦截器 自定义 IP org Fault cxf IP地址 apache import


import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;

/**
* IP地址拦截器
* 可在filter.xml文件中配置允许和拒绝访问的IP地址
* @author Sunshine
*
*/
public class IpAddressInInterceptor extends AbstractPhaseInterceptor<Message> {

public IpAddressInInterceptor() {
super(Phase.RECEIVE);
}

public void handleMessage(Message message) throws Fault {
HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
// 通过一个IpAddressConfig对象,从XML文件中读取预先设置的允许和拒绝的IP地址,这些值也可以来自数据库
IpAddressConfig config = IpAddressConfig.getInstance(); // 获取config实例
List<String> allowedList = config.getAllowedList(); // 允许访问的IP地址
List<String> deniedList = config.getDeniedList(); // 拒绝访问的IP地址
String ipAddress = request.getRemoteAddr(); // 取客户端IP地址
// 先处理拒绝访问的地址
for (String deniedIpAddress : deniedList) {
if (deniedIpAddress.equals(ipAddress)) {
throw new Fault(new IllegalAccessException("IP address " + ipAddress + " is denied"));
}
}
// 如果允许访问的集合非空,继续处理,否则认为全部IP地址均合法
if (allowedList.size() > 0) {
boolean contains = false;
for (String allowedIpAddress : allowedList) {
if (allowedIpAddress.equals(ipAddress)) {
contains = true;
break;
}
}
if (!contains) {
throw new Fault(new IllegalAccessException("IP address " + ipAddress + " is not allowed"));
}
}
}

}



IP地址允许和阻止列表来自一个自定义的filter.xml文件,这个值也可以来自数据库。当显式抛出Fault异常的时候,这个请求即被阻止,否则放行。


在applicationContext-cxf.xml中要相应的定义这个IP地址拦截器,使之生效。


<!-- IP地址输入拦截器 -->
<bean id="ipAddressInInterceptor"
class="com.yourcompany.ws.interceptor.IpAddressInInterceptor" />

<!-- 用户名和密码输入拦截器 -->
<bean id="wss4jInInterceptor"
class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<property name="properties">
<map>
<entry key="action" value="UsernameToken Timestamp" />
<entry key="passwordType" value="PasswordDigest" />
<entry key="passwordCallbackRef"
value-ref="digestPasswordCallback" />
</map>
</property>
</bean>

<!-- 密码回调 -->
<bean id="digestPasswordCallback"
class="com.yourcompany.ws.handler.DigestPasswordCallback" />

<!-- 全局Bus(输入拦截器) -->
<cxf:bus>
<cxf:inInterceptors>
<ref bean="ipAddressInInterceptor" />
<ref bean="wss4jInInterceptor" />
</cxf:inInterceptors>
</cxf:bus>

<!-- WebService服务 -->
<jaxws:endpoint id="helloWorldServiceEP" address="/HelloWorldService">
<jaxws:implementor ref="helloWorldService" />
</jaxws:endpoint>
<bean id="helloWorldService"
class="com.yourcompany.ws.impl.HelloWorldServiceImpl" />

标签:拦截器,自定义,IP,org,Fault,cxf,IP地址,apache,import
From: https://blog.51cto.com/u_14230175/5906747

相关文章

  • struts2 中的拦截器例子快速进阶
    小结了struts2中拦截器的一个例子,以方便快速进阶的.比如有个很典型的例子,要求在编辑数据或者增加数据前,必须要先判断用户是否登陆.则我们先在src目录下,建一个包strut......
  • android tips:从资源文件中读取文件流显示
    在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: privatevoiddoRaw(){InputStreamis=this.g......
  • CodeIgniter tips:验证码帮助类
    在CI中,做验证类可以这样做,首先给出的是手册中的做法加载辅助函数用下面的代码加载验证码辅助函数:$this->load->helper('captcha');可用的......
  • jquery中的一个小TIPS:鼠标移动到连接时发出声音
    这个TIPS其实很简单的,实现的效果是:当鼠标移动到链接上时,则可以发出声音,其实很简单,代码如下:<p><ahref="#"class="click">Clickherefors......
  • 小tips:设置java 的heap
    在java中,可以设置heap的大小:-Xms<size>设置初始heap的大小-Xmx<size> 设置最大的heap的大小-xss<size>设置threadstack大小如下文,设......
  • javascript中generator快速小结
    1基本例子  function*generatorFunc(){console.log("任务一");yield1;console.log("任务二");yield*generatorSubFunc();console.log("任务三");return......
  • Power App Portal列表自定义筛选器
     因为Portal的列表筛选,只有三种样式,文本框、单选和下拉框,如果要用到其他的筛选那就不能配置它了,所以我们可以使用它的FetchXml的筛选,来达到我们想要的效果,例如做一个日......
  • Eclipse中添加多行注释的快捷键
    选择你要注释的那一行或多行代码,按Ctrl+/即可,取消注释也是选中之后按Ctrl+/即可。此快捷键是//注释而不是/**/注释。Ctrl+Shift+/说明:添加......
  • vue自定义指令实现拖拽元素改变元素的宽度
    //自定义指令directives:{drag:{inserted:function(el){constdragDom=el;dragDom.style.cursor="e-resize";dragD......
  • JavaScript入门③-函数(2)原理{深入}执行上下文
    00、头痛的JS闭包、词法作用域?被JavaScript的闭包、上下文、嵌套函数、this搞得很头痛,这语言设计的,感觉比较混乱,先勉强理解总结一下......