今天写一个简单的拦截器,以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(拦截器)的更多相关文章

  1. SpringMVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  2. SpringMVC 中的Interceptor 拦截器

    1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors>  <!-- 日志拦截器 -->  <mvc:interceptor> ...

  3. SpringBoot-SpringMvc的Interceptor拦截器配置

    Interceptor拦截器实现对每一个用户请求处理前后的业务处理,比如我们需要对用户请求进行响应时间的记录,需要记录请求从开始到结束所耗的时间,这时我们就需要用到拦截器了 下面我们以记录请求处理时间 ...

  4. Spring中的Interceptor 拦截器 专题

    spring-webmvc-4.3.14.RELEASE.jar org.springframework.web.servlet.DispatcherServlet#doDispatch /** * ...

  5. Spring MVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  6. SpringMvc中Interceptor拦截器用法

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆等. 一. 使用场景 1 ...

  7. SpringMVC中使用Interceptor拦截器顺序

    一.简介 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验 证,或者是来判断用户是否登陆,或者是像1 ...

  8. Vue添加请求拦截器

    一.现象 统一处理错误及配置请求信息 二.解决 1.安装 axios  , 命令: npm install axios --save-dev 2.在根目录的config目录下新建文件 axios.js ...

  9. [代码笔记]VUE路由根据返回状态判断添加响应拦截器

    //返回状态判断(添加响应拦截器) Axios.interceptors.response.use( res => { //对响应数据做些事 if (res.data && !r ...

随机推荐

  1. python 中字符串转 二进制 /ASCII码

  2. idea中JSP页面不能访问静态资源(图片,js,css)

    必须配置SpringMvc对访问静态资源的支持,idea默认就是在main/webapp 下的文件路径,要在web-info同级的resource文件下放置,JSP中 ${pageContext.re ...

  3. css彩色(渐变)文字

    css彩色文字也称渐变文字 在张鑫旭博客首页看到这效果,就自己研究了一下. 实现方法加个背景然后在根据文本剪切,再把文本填充为透明色让之前设置的背景颜色显示出来即可. -webkit-backgrou ...

  4. 前端性能优化 —— reflow(回流/重排)和repaint(重绘)

    简要:整个在浏览器的渲染过程中(页面初始化,用户行为改变界面样式,动画改变界面样式等)reflow(回流)和repaint(重绘) 会大大影响web性能,尤其是手机页面.因此我们在页面设计的时候要尽量 ...

  5. OPTS参数设置

    今天再hive on tez 跑任务的时候 OOM异常 然后找了些 JAVA OPTS设置: AVA_OPTS ,顾名思义,是用来设置JVM相关运行参数的变量. JVM:JAVA_OPTS=" ...

  6. RedisTemplate集合使用说明-opsForList(二)

    1.leftPush(K key, V value) 在变量左边添加元素值. Java代码   redisTemplate.opsForList().leftPush("list" ...

  7. Java中for each与正常for循环效率对比

    循环ArrayList时,普通for循环比foreach循环花费的时间要少一点:循环LinkList时,普通for循环比foreach循环花费的时间要多很多. 当我将循环次数提升到一百万次的时候,循环 ...

  8. Java基础教程免费分享

    这是我自己早前听课时整理的Java全套知识,适用于初学者,也可以适用于中级进阶的人,你们可以下载,我认为是比较系统全面的,可以抵得上市场上90%的学习资料.讨厌那些随便乱写的资料还有拿出来卖钱的人!在 ...

  9. win2003 64位系统IIS配置方法

    IIS7 很简单,在网站对应的应用程序池上右键高级设置,常规里的启用32位应用程序改为true就可以了,IIS6稍微复杂一些, 1,命令行里运行 cscript.exe %SYSTEMDRIVE%\i ...

  10. Linux高级调试与优化——用户态堆

    内存问题是软件世界的住房问题 嵌入式Linux系统中,物理内存资源通常比较紧张,而不同的进程可能不停地分配和释放不同大小的内存,因此需要一套高效的内存管理机制. 内存管理可以分为三个层次,自底向上分别 ...