一、请求格式要求:
1.GET 请求
URL示例:http://xxxxxxxx/api/test.do?a=1&b=2&c=3&d=4
content-type: | |
签名 | key值与a=1&b=2&c=3&d=4 进行一定处理后加密得到 |
2.POST请求
URL示例:http://xxxxxxxx/api/test.do
content-type: | application/json |
requestBody: | {a:1,b:'2',c:'3',d:'4'} |
签名 | key值与与{a:1,b:'2',c:'3',d:'4'} 进行一定处理后加密得到 |
二、签名参数:
通过第一步中得到签名值后,以参数名 “signature”添加到RequestHead中。
四、验签方案:
(1) 增加一个Filter,对POST请求从inputstream中获取json参数,放到ThreadLocal中,并替换掉原来的HttpServlertRequest,因为inputStream只能读一次,如果不替换,会导致spring将参数转换为JSON时没有数据可读。(对GET请求可以不作处理)
(2) 增加一个spring mvc 拦截器,从RequestHead中取出签名,与ThreadLocal中的参数进行验证。(GET请求直接从URL中取参数)
Filter代码如下:
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { MyHttpServletRequestWrapperwrap = null; if (request instanceof HttpServletRequest) { HttpServletRequest httpServletRequest = (HttpServletRequest) request; if ("POST".equals(httpServletRequest.getMethod().toUpperCase()) && httpServletRequest.getContentType().contains("application/json")) { wrap = new MyHttpServletRequestWrapper(httpServletRequest); //request = wrap; TokenBag.setParam(wrap.getJsonPararms()); } } if(null != wrap){ chain.doFilter(wrap, response); }else{ chain.doFilter(request, response); } }
MyHttpServletRequestWrapper:用来替换原来的request对象
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper { private String jsonPararms; public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException{ super(request); ServletInputStream stream = this.getRequest().getInputStream(); jsonPararms = IOUtils.toString(stream, "UTF-8"); } @Override public ServletInputStream getInputStream() { byte[] buffer = null; try { buffer = jsonPararms.toString().getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } final ByteArrayInputStream bais = new ByteArrayInputStream(buffer); ServletInputStream newStream = new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } }; return newStream; } public String getJsonPararms() { return jsonPararms; } public void setJsonPararms(String jsonPararms) { this.jsonPararms = jsonPararms; } }
mvc拦截器:
public class SignatureInterceptor extends HandlerInterceptorAdapter{ private Logger logger = Logger.getLogger(SignatureInterceptor.class); private TokenService tokenService; /** * This implementation always returns {@code true}. */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if(logger.isDebugEnabled()){ logger.debug("check http request signature start..."); } HandlerMethod hm = (HandlerMethod)handler; //通过方法上的注解来标识哪些请求需要验签 Signature s = hm.getMethodAnnotation(Signature.class); if(null == s){ return true; } String signature = request.getHeader("signature"); if(StringUtils.isEmpty(signature)){ logger.error("signature is empty,check signature failed..."); response.setStatus(401); return false; } if("GET".equals(request.getMethod())){ String param = request.getQueryString(); if(checkSignature(signature,param,response)){ //验签通过 return super.preHandle(request,response,handler); }else{ response.setStatus(401); return false; } }else if("POST".equals(request.getMethod())){ //TokenBag就是一个ThreadLocal String param = TokenBag.getParam(); TokenBag.clean(); if(StringUtils.isEmpty(param)){ logger.error("param is empty,check signature failed..."); response.setStatus(401); return false; } if(checkSignature(signature,param,response)){ //验签通过 return super.preHandle(request,response,handler); }else{ response.setStatus(401); return false; } }else{ logger.error("signature only support POST and GET"); return false; } }
验签方法要与加签方法一致,可以通过app和服务端使用相同的key值加密,最好是使用每个用户惟一的、动态的key值(比如token)来做。
相关推荐
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...
5. **验签操作**:`verifySignature()`方法会检查给定的签名是否与使用公钥重新计算的哈希值匹配。它首先用公钥解密签名,得到原始的SHA-256哈希,然后对比这个哈希值是否与原始数据计算出的哈希相同。 在实际应用...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...
Spring MVC 是一款强大的Java Web开发框架,用于构建高效、可维护和模块化的Web应用程序。它作为Spring框架的一部分,提供了一种优雅的方式来处理HTTP请求和响应,使得开发者可以专注于业务逻辑而不是底层实现。在这...
Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够有效地分离业务逻辑、数据处理和用户界面。在"Spring MVC 4.2.3"版本中,我们看到了一系列的...
此外,Spring MVC还能够与其他Spring模块(如Spring Security、Spring WebSocket等)无缝集成,提供完整的解决方案。 总之,“Spring MVC - A Tutorial”这份指南会详细讲解Spring MVC的各个核心组件和使用技巧,...
Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构。在Spring MVC 4.0版本中,它引入了许多改进和新特性,以提升开发效率和应用程序的性能。 1. **依赖注入**:Spring ...
Spring MVC是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,使用了IoC容器,支持RESTful风格的应用程序开发。Spring MVC通过分离模型(Model)、视图(View)和控制器(Controller)来简化Web开发...
Spring MVC 是一个强大的Java Web开发框架,它是Spring框架的一部分,专为构建高度可扩展和模块化的Web应用程序而设计。在2015年的版本中,Spring MVC 4已经相当成熟,提供了许多特性来简化开发流程并提高开发效率。...
总的来说,这个个人博客系统结合了Spring MVC的Web开发优势、Mybatis的数据库操作便利性以及Spring的全面企业级特性,提供了一个完整的后端解决方案。对于学习和理解SSM(Spring、SpringMVC、Mybatis)框架集成开发...
Spring MVC 是一个基于 Java 的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。在本压缩包中包含了一系列与Spring MVC相关的jar文件,这些文件是构建和运行Spring MVC项目所...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一个重要模块,主要用于构建 Web 应用程序的后端控制层。这个框架提供了模型-视图-控制器(MVC)设计模式的实现,简化了Java Web应用的开发...
这个“spring mvc demo加用户模块的”项目应该是一个包含用户管理功能的Spring MVC示例,旨在帮助开发者快速理解和实践Spring MVC的基本用法。 首先,Spring MVC的核心组件包括DispatcherServlet、Controller、...
Spring MVC是Spring框架的一个核心模块,专用于构建Web应用程序。这个"Spring MVC使用Demo"提供了实践操作,帮助开发者深入理解Spring MVC的开发环境配置、注解的使用以及工作原理。 首先,Spring MVC的设计模式...
在本项目中,我们主要探讨的是如何利用Spring MVC和Spring Security框架构建一个基本的无数据库登录系统。Spring MVC是Spring框架的一部分,用于处理Web应用程序的请求-响应模型,而Spring Security则是一个强大的...
Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。Spring MVC的设计目标是提供一个清晰的组件化架构,使得开发者可以独立地开发和测试控制器、...
Spring MVC 和 MyBatis 是两个在Java Web 开发中广泛使用的框架。Spring MVC 作为Spring框架的一部分,负责处理HTTP请求并转发到相应的业务逻辑,而MyBatis则是一个轻量级的持久层框架,用于简化数据库操作。整合这...
标题中的"开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp"表明这是一个关于Spring MVC框架的开发教程,其中包含了源代码供学习者参考。Spring MVC是Spring框架的一个核心组件...