为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 ...
随机推荐
- 1、布局容器Grid、StackPanel、GroupBox、DockPanel、WrapPanel
Grid——网格布局,其中控件或容器需指定位置 StackPanel——堆叠面板,其中的控件水平布局.竖直布局 DockPanel——停靠面板,内部控件或容器可以放置在上.下.左.右 WrapPane ...
- Nowcoder Typing practice ( Trie 图 )
题目链接 题意 : 给出 n 个串.然后给出一个问询串.问你对于问询串的每一个前缀.需要至少补充多少单词才能使得其后缀包含 n 个串中的其中一个.注意 '-' 字符代表退格 分析 : 多串的匹配问询自 ...
- Nowcoder farm ( 树状数组、二维前缀和、二维偏序 )
题目链接 分析 : 最简单的想法当然就是去模拟 直接对每个施肥料的操作进行模拟.然后计算贡献 但是这显然会超时.这题需要换一个思维 对于一个土地(也就是二维平面上的一个点)的种类是 T' 如果它被操作 ...
- [转载]blktrace分析IO
前言 上篇博客介绍了iostat的一些输出,这篇介绍blktrace这个神器.上一节介绍iostat的时候,我们心心念念希望得到块设备处理io的service time,而不是service time ...
- 兼容pc端和移动端的轮播图插件 swiper.js
swiper.js是一款纯JavaScript打造的滑动特效插件,可以用来实现检点轮播图,tab触摸滑动切换等常用效果.下载地址:https://www.swiper.com.cn/download/ ...
- Linux如何永久打开端口
由于防火墙导致同局域网无法通过IP访问,Linux有多种防火墙,需要查看当前使用的防火墙(开机自启),再进行配置 以下是 iptables 和 firewall 防火墙的相关配置,切忌将自己配置的防 ...
- 客户端框架-MVC
MVC Model-View-Controller MVC是比较直观的架构模式,用户操作->View(负责接收用户的输入操作)->Controller(业务逻辑处理)->Model( ...
- 为什么要使用 Go 语言,Go 语言的优势在哪里?
1.Go有什么优势 可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了. 静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的 ...
- java 多线程相关概念总结
前言 本篇文章介绍一些多线程的相关的深入概念.理解后对于线程的安全性会有更深的理解. 先说一个格言,摘自Java核心技术:如果向一个变量写入值,而这个变量接下来可能会被另一个线程读取:或者一个变量读值 ...
- centos7 php5.5 mongodb安装
1.下载最新php MongoDB扩展源码 https://pecl.php.net/package/mongodb 最新的1.6不支持PHP5.5,得用老版本,1.5.5 wget https:// ...