为webService添加Interceptor(拦截器)
今天写一个简单的拦截器,以webService接口为例:
背景:H5的一个项目,只要调用H5webService 接口下面的方法都会触发一个AuthorityInterceptor去验证是否调用类型是H5,session是否失效.
1.需要自己定义一个Interceptor,我定义的Interceptor去验证调用类型moduleType和session:
package com.lcc.h5.ws; import com.lcc.api.dto.session.SessionInfo;
import com.lcc.api.exception.AccessDeniedException;
import com.lcc.api.web.common.ModuleType;
import com.lcc.logger.Logger;
import com.lcc.logger.LoggerFactory;
import com.lcc.service.BaseAuthorityService;
import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.transport.http.AbstractHTTPDestination; import javax.servlet.http.HttpServletRequest; public class AuthorityInterceptor extends AbstractPhaseInterceptor<Message> { private static final Logger LOGGER = LoggerFactory.getLogger(AuthorityInterceptor.class); private BaseAuthorityService authorityService; public AuthorityInterceptor(String phase) {
super(phase);
} public AuthorityInterceptor() {
this("post-stream");
} @Override
public void handleMessage(Message message) throws Fault {
Fault fault = new Fault(new AccessDeniedException("illeagl moduleType access"));
fault.setStatusCode(421); HttpServletRequest httpRequest = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
String sessionId = httpRequest.getHeader("Token");
if (StringUtils.isBlank(sessionId)) {
LOGGER.info("blank session");
throw fault;
}
LOGGER.info("session authority, session id {}", sessionId); String moduleKey = httpRequest.getHeader("moduleType");
if (StringUtils.isEmpty(moduleKey)) {
LOGGER.info("moduleType is empty");
throw fault;
}
ModuleType module = ModuleType.fromKey(moduleKey); SessionInfo sessionInfo = null;
if (ModuleType.H5.equals(module)) {
sessionInfo = authorityService.getSessionInfo(sessionId);
if (sessionInfo == null) {
throw fault;
}
} else {
throw fault;
}
} public void setAuthorityService(BaseAuthorityService authorityService) {
this.authorityService = authorityService;
}
}
上面Interceptor用到的java bean:
public abstract class SessionInfo implements Serializable { private static final long serialVersionUID = 6544973626519192604L; private String key;
// timestamp
private Long createdAt;
// unit: second
private Long expiryTime; public String getKey() {
return key;
} public void setKey(String key) {
this.key = key;
} public Long getCreatedAt() {
return createdAt;
} public void setCreatedAt(Long createdAt) {
this.createdAt = createdAt;
} public Long getExpiryTime() {
return expiryTime;
} public void setExpiryTime(Long expiryTime) {
this.expiryTime = expiryTime;
} @Override
public String toString() {
return new StringBuilder().append("{key: ").append(key).append(", createdAt: ").append(createdAt)
.append(", expiryTime: ").append(expiryTime).append("}").toString();
}
}
=====================
为了防止别人恶意访问接口,我们可以给调用类型加密,内部调用直接传入加密后的String,在后台去转换验证即可.
public enum ModuleType { H5("md5加密码"); private String key; ModuleType(String key) {
this.key = key;
} public String getKey() {
return key;
} }
BaseAuthorityService及其实现类 请参考http://www.cnblogs.com/cc-java/p/6625998.html
2.Interceptor写好了,接下来就看下怎么在xml配置文件里面为webService配置Interceptor
<bean id="authorityInterceptor" class="com.lcc.ws.AuthorityInterceptor" >
<property name="authorityService" ref="authorityService" />
</bean> <bean id="authorityService" class="com.lcc.authority.AuthorityService" >
<property name="sessionTemplate" ref="redisSessionSerializationTemplate" />
</bean> <bean id="h5WebService" class="com.lcc.ws.impl.H5WebService">
</bean>
<jaxrs:server id="h5WebServiceContainer"
address="/h5">
<jaxrs:serviceBeans>
<ref bean="h5WebService" />
</jaxrs:serviceBeans> <jaxrs:providers>
<ref bean="wadlGenerator" />
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider">
<constructor-arg ref="handshakeJacksonMapper" />
</bean>
</jaxrs:providers> <jaxrs:inInterceptors>
<ref bean="fileSizeInterceptor" />
<ref bean="authorityInterceptor" />
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outInterceptor" />
</jaxrs:outInterceptors>
</jaxrs:server>
到这里就已经为h5WebService接口配置好AuthorityInterceptor拦截器了;只要访问这个接口都会先进入拦截器里面去验证session和项目调用的类型;
为webService添加Interceptor(拦截器)的更多相关文章
- SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- SpringMVC 中的Interceptor 拦截器
1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors> <!-- 日志拦截器 --> <mvc:interceptor> ...
- SpringBoot-SpringMvc的Interceptor拦截器配置
Interceptor拦截器实现对每一个用户请求处理前后的业务处理,比如我们需要对用户请求进行响应时间的记录,需要记录请求从开始到结束所耗的时间,这时我们就需要用到拦截器了 下面我们以记录请求处理时间 ...
- Spring中的Interceptor 拦截器 专题
spring-webmvc-4.3.14.RELEASE.jar org.springframework.web.servlet.DispatcherServlet#doDispatch /** * ...
- Spring MVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- SpringMvc中Interceptor拦截器用法
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆等. 一. 使用场景 1 ...
- SpringMVC中使用Interceptor拦截器顺序
一.简介 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验 证,或者是来判断用户是否登陆,或者是像1 ...
- Vue添加请求拦截器
一.现象 统一处理错误及配置请求信息 二.解决 1.安装 axios , 命令: npm install axios --save-dev 2.在根目录的config目录下新建文件 axios.js ...
- [代码笔记]VUE路由根据返回状态判断添加响应拦截器
//返回状态判断(添加响应拦截器) Axios.interceptors.response.use( res => { //对响应数据做些事 if (res.data && !r ...
随机推荐
- MHA配置
1,背景 MHA的目的在于维持MySQL Replication中Master库的高可用性,其最大特点是可以修复多个Slave之间的差异日志,最终使所有Slave保持数据一致,然后从中选择一个充当新的 ...
- cordova打包遇到Connection timedout:
在cordova项目打包时,有时候处在公司内网环境,导致有些文件无法下载报下面的错误: A problem occurred configuring root project 'android'. & ...
- JSP中EL表达式不能使用的问题
在JSP2.0中,增加了EL语言,可以通过EL语言,可以通过EL语言,实现获取数据,进一步将scriptlet 代码从JSP页面中分离出来.EL语言给大家带来了方便,但有时,也会遇到EL表达式不能显示 ...
- EDA cheat sheet
%config InlineBackend.figure_format = 'svg' 在jupyter notebook中使用这个命令绘制更清晰的图像,注意百分号后不能有空格. 1. Univari ...
- Zookeeper入门(七)之Java连接Zookeeper
Java操作Zookeeper很简单,但是前提要把包导对. 关于Zookeeper的Linux环境搭建可以参考我的这篇博客:Linux环境下Zookeeper安装 下面进入正题: 一.导入依赖 < ...
- set集合 ,深浅拷贝
一 之前内容的补充 1.join() 将列表转换成字符串 2.split()将字符串转换成列表 3列表和字典在进行For循环时是不可以删除的(准确的说是删除的不彻底) 删除操作需要先创建一个新的空列 ...
- spring-sevlet简单配置
<<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www ...
- TensorFlow常用操作
初始化数据: # -*- coding: utf-8 -*- import tensorflow as tf a = tf.zeros([3, 4], tf.int32) # [[0 0 0 0] # ...
- ActiveMQ 初学-1:ActiveMQ 创建连接对象
县创建mq的连接工厂对象 ActiveMQConnectionFactory // 1 建立ConnectionFactory 工厂对象,需要填入,需要填入用户名密码, // 用户名 密码 在 ...
- [python]自动计算1-100的平方和
def power(x,n): s=1 while n > 0: n = n-1 s = s * x return sm=0for i in range(1,101) : n=power(i,2 ...