实现思路:

1. 用户登录成功后,服务器端按照一定规则生成一个Token令牌,Token是可变的

2. 将Token作为key,用户信息作为value放到缓存中,设置有效时长(比如30分钟内没有访问就失效)

3. 将Token返回给APP端,APP保存到本地存储中以便请求接口时带上此参数

4. 通过拦截器拦截所有涉及到用户隐私安全等方面的接口,验证请求中的Token参数合法性并检查缓存是否过期

5. 验证通过后,将Token值保存到线程存储中,以便当前线程的操作可以通过Token直接从缓存中索引当前登录的用户信息

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ndh.rest</groupId><artifactId>workitem_service</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>workitem_service</name><url>http://maven.apache.org</url><properties><jersey.version>2.2</jersey.version><spring.version>3.1.1.RELEASE</spring.version><org.glassfish.hk2.version>2.4.0</org.glassfish.hk2.version><asm.version>3.1</asm.version><ehcache.version>2.10.1</ehcache.version><servlet-api.version>3.0.1</servlet-api.version><jaxrs-ri.version>2.4</jaxrs-ri.version><!-- apache common --><commons-lang3.version>3.4</commons-lang3.version><commons-configuration.version>1.8</commons-configuration.version><commons-beanutils.version>1.8.0</commons-beanutils.version><commons-jxpath.version>1.3</commons-jxpath.version><!-- logback --><logback.version>1.0.13</logback.version><logback-ext-spring.version>0.1.4</logback-ext-spring.version></properties><dependencies><!-- Jersey Core --><dependency><groupId>org.glassfish.jersey.containers</groupId><!-- Note if you are using Servlet 3.0 you can drop the "-core" suffix --><artifactId>jersey-container-servlet</artifactId><version>${jersey.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet-api.version}</version></dependency><dependency><groupId>org.glassfish.jersey.bundles</groupId><artifactId>jaxrs-ri</artifactId><version>${jaxrs-ri.version}</version></dependency><!-- Spring Support --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.glassfish.jersey.ext</groupId><artifactId>jersey-spring3</artifactId><version>${jersey.version}</version></dependency><!-- Jackson JSON Support --><dependency><groupId>org.glassfish.jersey.media</groupId><artifactId>jersey-media-json-jackson</artifactId><version>${jersey.version}</version></dependency><!-- org.glassfish.hk2 --><dependency><groupId>org.glassfish.hk2</groupId><artifactId>hk2-core</artifactId><version>${org.glassfish.hk2.version}</version></dependency><dependency><groupId>org.glassfish.hk2</groupId><artifactId>hk2-api</artifactId><version>${org.glassfish.hk2.version}</version></dependency><dependency><groupId>org.glassfish.hk2</groupId><artifactId>hk2-locator</artifactId><version>${org.glassfish.hk2.version}</version></dependency><dependency><groupId>org.glassfish.hk2.external</groupId><artifactId>javax.inject</artifactId><version>${org.glassfish.hk2.version}</version></dependency><dependency><groupId>org.glassfish.hk2</groupId><artifactId>osgi-resource-locator</artifactId><version>${org.glassfish.hk2.version}</version></dependency><!-- asm --><dependency><groupId>asm</groupId><artifactId>asm</artifactId><version>${asm.version}</version></dependency><!-- ehcache --><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>${ehcache.version}</version></dependency><!-- apache toolkit --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>${commons-lang3.version}</version></dependency><dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>${commons-configuration.version}</version></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>${commons-beanutils.version}</version></dependency><dependency><groupId>commons-jxpath</groupId><artifactId>commons-jxpath</artifactId><version>${commons-jxpath.version}</version></dependency><!-- logback --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version></dependency><dependency><groupId>org.logback-extensions</groupId><artifactId>logback-ext-spring</artifactId><version>${logback-ext-spring.version}</version></dependency></dependencies><repositories><repository><id>sourceforge</id><url>https://oss.sonatype.org/content/repositories/snapshots/</url><snapshots><enabled>true</enabled></snapshots></repository></repositories><build><finalName>workitem_service</finalName><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins></build></project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>workitem_service</display-name><!-- Spring自动装载配置 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- Logback配置 --><listener><listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class></listener><context-param><param-name>logbackConfigLocation</param-name><param-value>classpath:logback.xml</param-value></context-param><!-- Jersey自动装载配置 --><servlet><servlet-name>JerseySpringApplication</servlet-name><servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class><init-param><param-name>javax.ws.rs.Application</param-name><param-value>com.ndh.MyApplication</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>JerseySpringApplication</servlet-name><url-pattern>/rest/*</url-pattern></servlet-mapping><!-- 允许跨域配置 --><filter><filter-name>CorsFilter</filter-name><filter-class>org.apache.catalina.filters.CorsFilter</filter-class><init-param><param-name>cors.allowed.origins</param-name><param-value>*</param-value></init-param><init-param><param-name>cors.allowed.methods</param-name><param-value>GET,POST,HEAD,OPTIONS,PUT</param-value></init-param><init-param><param-name>cors.allowed.headers</param-name><param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value></init-param><init-param><param-name>cors.exposed.headers</param-name><param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value></init-param><init-param><param-name>cors.support.credentials</param-name><param-value>true</param-value></init-param><init-param><param-name>cors.preflight.maxage</param-name><param-value>10</param-value></init-param></filter><filter-mapping><filter-name>CorsFilter</filter-name><url-pattern>/rest/*</url-pattern></filter-mapping>
</web-app>

主要代码

package com.ndh.rest;import javax.annotation.PreDestroy;import net.sf.ehcache.Element;
import net.sf.ehcache.CacheManager;import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.ndh.model.LoginUser;
import com.ndh.util.ConfigurationUtil;
import com.ndh.util.Constants;
import com.ndh.util.MD5Util;
import com.ndh.util.ThreadTokenHolder;
import com.ndh.util.TokenProcessor;@Component
public class Memory {@Autowiredprivate CacheManager cacheManager;/*** 关闭缓存管理器*/@PreDestroyprotected void shutdown() {if (cacheManager != null) {cacheManager.shutdown();}}/*** 保存当前登录用户信息* * @param loginUser*/public void saveLoginUser(LoginUser loginUser) {// 生成seed和token值String seed = MD5Util.getMD5Code(loginUser.getUsername());String token = TokenProcessor.INSTANCE.generateToken(seed, true);// 保存token到登录用户中loginUser.setToken(token);// 清空之前的登录信息clearLoginInfoBySeed(seed);// 保存新的token和登录信息String timeout = ConfigurationUtil.getTokenTimeOut();int ttiExpiry = NumberUtils.toInt(timeout);cacheManager.getCache(Constants.TOKEN_CACHE).put(new Element(seed, token, false, ttiExpiry, 0));cacheManager.getCache(Constants.TOKEN_CACHE).put(new Element(token, loginUser, false, ttiExpiry, 0));}/*** 获取当前线程中的用户信息* * @return*/public LoginUser currentLoginUser() {Element element = cacheManager.getCache(Constants.TOKEN_CACHE).get(ThreadTokenHolder.getToken());return element == null ? null : (LoginUser) element.getValue();}/*** 根据token检查用户是否登录* * @param token* @return*/public boolean checkLoginInfo(String token) {Element element = cacheManager.getCache(Constants.TOKEN_CACHE).get(token);return element != null && (LoginUser) element.getValue() != null;}/*** 清空登录信息*/public void clearLoginInfo() {LoginUser loginUser = currentLoginUser();if (loginUser != null) {// 根据登录的用户名生成seed,然后清除登录信息String seed = MD5Util.getMD5Code(loginUser.getUsername());clearLoginInfoBySeed(seed);}}/*** 根据seed清空登录信息* * @param seed*/public void clearLoginInfoBySeed(String seed) {// 根据seed找到对应的tokenElement element = cacheManager.getCache(Constants.TOKEN_CACHE).get(seed);if (element != null) {// 根据token清空之前的登录信息cacheManager.getCache(Constants.TOKEN_CACHE).remove(seed);cacheManager.getCache(Constants.TOKEN_CACHE).remove(element.getValue());}}
}

测试效果如下

参考资料:
http://www.nextinstruction.com/rest-with-jersey2-spring3-and-jackson.html
http://www.cnphp6.com/archives/127182
http://blog.csdn.net/xiao__gui/article/details/46803193

Spring3.1.1+Jersey2.2+ehcache实现WebApp与服务器接口交互获取令牌及校验过程相关推荐

  1. 分布式缓存之Ehcache与terracotta - Terracotta服务器概念篇

    1.介绍 Terracotta服务器为Terracotta产品提供分布式数据平台.Terracotta服务器集群被称为Terracotta服务器阵列(TSA).Terracotta服务器阵列可以从单个 ...

  2. webAPP优化方案总结

    为什么80%的码农都做不了架构师?>>>    一 前言 在公司做过项目都知道,一款产品性能的优化非常重要,同时也是体现个人技术能力. 之前一直做算法,随后在公司做平台软件及后台,一 ...

  3. 使用Spring3+Quartz实现定时任务

    在本文中,我们使用Spring3+Quartz实现定时任务.spring中定义了一些接口来支持Quartz,可以使你的业务逻辑类和Quartz解耦. 这个例子中使用了如下maven的依赖项: < ...

  4. springboot2.3.4集成EhCache缓存框架完整代码

    代码部分 pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...

  5. C#开发移动应用系列(2.使用WebView搭建WebApp应用)

    C#开发移动应用系列(2.使用WebView搭建WebApp应用) 原文:C#开发移动应用系列(2.使用WebView搭建WebApp应用) 前言 上篇文章地址:C#开发移动应用系列(1.环境搭建) ...

  6. 【MyBatis框架】查询缓存-二级缓存-整合ehcache

    mybatis整合ehcache ehcache是一个分布式缓存框架. 1.分布缓存 我们系统为了提高系统并发,性能.一般对系统进行分布式部署(集群部署方式) 如图 不使用分布缓存,缓存的数据在各各服 ...

  7. 【JavsScript】webapp的优化整理

    单页or多页 webapp 现状 优劣之分 网络传输优化 综述 fake页-首屏加速 降低请求数 降低请求量 缓存Ajax/localstorage DOM操作优化 综述 关于页面渲染 减少使用定位属 ...

  8. 滴滴 webapp 5.0 Vue 2.0 重构经验分享

    项目背景 滴滴的 webapp 是运行在微信.支付宝.手 Q 以及其它第三方渠道的打车软件.借着产品层面的功能和视觉升级,我们用 Vue 2.0 对它进行了一次技术重构. 技术栈 MVVM框架: Vu ...

  9. springboot:缓存不止redis,学会使用本地缓存ehcache

    0. 引言 随着redis的普及,更多的同学对redis分布式缓存更加熟悉,但在一些实际场景中,其实并不需要用到redis,使用更加简单的本地缓存即可实现我们的缓存需求. 今天,我们一起来看看本地缓存 ...

最新文章

  1. 开源中国git关联xcode操作步骤
  2. 国产岚图入局高端智能电动车,对标特斯拉,放话一年内量产
  3. 【转载】Zend Studio 10正式版注册破解
  4. 神策数据受邀出席,携手亚马逊云科技共建智能家居新航海时代
  5. 牛津临床和实验室调查手册 Oxford Handbook of Clinical and Laboratory Investigation
  6. 洛谷 P3243 【[HNOI2015]菜肴制作】
  7. mysql 命令行怎么格式化_dbForge Data Compare for MySQL入门教程:通过命令行格式化代码...
  8. 关于linux内核中使用的时钟
  9. IT项目管理之系统验收
  10. 笔记二:云上传与调用获取openid
  11. SpringBoot高级篇-属性配置
  12. Cramer`s Rule 克莱姆法则(克拉默法则)
  13. 10分钟带你读完人工智能的三生三世
  14. 4010. Problem E:11的倍数
  15. 赴日java常问问题_赴日软件工程师java笔试题
  16. Rasa NLU 实践
  17. 设计模式【2.2】-- 工厂模式怎么演变成抽象工厂模式?
  18. 移动开发大作业————随手记(主界面和编辑界面)
  19. 计算机毕业设计_基于SSM的医院预约挂号系统设计与实现
  20. Grafana 定制化修改 汉化Grafana

热门文章

  1. C++ 各种数据类型转换总结(不断更新中.....)
  2. windows 启动exe程序前注入dll(c++)
  3. Linux eBPF:bcc 用法和原理初探之 kprobes 注入
  4. 《深入浅出DPDK》读书笔记(五):同步互斥机制
  5. NETCONF YANG语言文件语法格式
  6. java 固定值_这些频繁调用函数是否可以在dblquad中返回固定值?
  7. scrapy异步写入mysql_scrapy之异步写入数据库
  8. android 静态编译链接,Android NDK:使用预编译的静态库链接
  9. springboot链接数据库的bug
  10. 一个强大的粘性标签库