`

spring mvc 加签验签方案

 
阅读更多

一、请求格式要求:

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 4

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...

    RSA sha-256加密解密,加签验签工具类

    5. **验签操作**:`verifySignature()`方法会检查给定的签名是否与使用公钥重新计算的哈希值匹配。它首先用公钥解密签名,得到原始的SHA-256哈希,然后对比这个哈希值是否与原始数据计算出的哈希相同。 在实际应用...

    Spring MVC jar包

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...

    最全最经典spring-mvc教程

    Spring MVC 是一款强大的Java Web开发框架,用于构建高效、可维护和模块化的Web应用程序。它作为Spring框架的一部分,提供了一种优雅的方式来处理HTTP请求和响应,使得开发者可以专注于业务逻辑而不是底层实现。在这...

    Spring MVC 4.2.3

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够有效地分离业务逻辑、数据处理和用户界面。在"Spring MVC 4.2.3"版本中,我们看到了一系列的...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    此外,Spring MVC还能够与其他Spring模块(如Spring Security、Spring WebSocket等)无缝集成,提供完整的解决方案。 总之,“Spring MVC - A Tutorial”这份指南会详细讲解Spring MVC的各个核心组件和使用技巧,...

    spring mvc 4.0

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构。在Spring MVC 4.0版本中,它引入了许多改进和新特性,以提升开发效率和应用程序的性能。 1. **依赖注入**:Spring ...

    Spring MVC 教程快速入门 深入分析

    Spring MVC是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,使用了IoC容器,支持RESTful风格的应用程序开发。Spring MVC通过分离模型(Model)、视图(View)和控制器(Controller)来简化Web开发...

    Mastering Spring MVC 4(2015.09)源码

    Spring MVC 是一个强大的Java Web开发框架,它是Spring框架的一部分,专为构建高度可扩展和模块化的Web应用程序而设计。在2015年的版本中,Spring MVC 4已经相当成熟,提供了许多特性来简化开发流程并提高开发效率。...

    Spring MVC + Mybatis+Spring实现的个人博客系统

    总的来说,这个个人博客系统结合了Spring MVC的Web开发优势、Mybatis的数据库操作便利性以及Spring的全面企业级特性,提供了一个完整的后端解决方案。对于学习和理解SSM(Spring、SpringMVC、Mybatis)框架集成开发...

    spring mvc框架依赖全面jar

    Spring MVC 是一个基于 Java 的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。在本压缩包中包含了一系列与Spring MVC相关的jar文件,这些文件是构建和运行Spring MVC项目所...

    Spring MVC所需jar包

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一个重要模块,主要用于构建 Web 应用程序的后端控制层。这个框架提供了模型-视图-控制器(MVC)设计模式的实现,简化了Java Web应用的开发...

    spring mvc demo加用户模块的

    这个“spring mvc demo加用户模块的”项目应该是一个包含用户管理功能的Spring MVC示例,旨在帮助开发者快速理解和实践Spring MVC的基本用法。 首先,Spring MVC的核心组件包括DispatcherServlet、Controller、...

    Spring MVC使用Demo

    Spring MVC是Spring框架的一个核心模块,专用于构建Web应用程序。这个"Spring MVC使用Demo"提供了实践操作,帮助开发者深入理解Spring MVC的开发环境配置、注解的使用以及工作原理。 首先,Spring MVC的设计模式...

    基本的spring mvc + spring security实现的登录(无数据库)

    在本项目中,我们主要探讨的是如何利用Spring MVC和Spring Security框架构建一个基本的无数据库登录系统。Spring MVC是Spring框架的一部分,用于处理Web应用程序的请求-响应模型,而Spring Security则是一个强大的...

    spring MVC .docx

    Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。Spring MVC的设计目标是提供一个清晰的组件化架构,使得开发者可以独立地开发和测试控制器、...

    spring mvc mybatis 整合源码,带数据库脚本,带详细注释

    Spring MVC 和 MyBatis 是两个在Java Web 开发中广泛使用的框架。Spring MVC 作为Spring框架的一部分,负责处理HTTP请求并转发到相应的业务逻辑,而MyBatis则是一个轻量级的持久层框架,用于简化数据库操作。整合这...

    开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp

    标题中的"开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp"表明这是一个关于Spring MVC框架的开发教程,其中包含了源代码供学习者参考。Spring MVC是Spring框架的一个核心组件...

Global site tag (gtag.js) - Google Analytics