https://my.oschina.net/jayhu/blog/653725
public interface MessageConverterHandler<T, K> { /** * 用于在httpMessageConverter read(..)方法完成之后调用 * <p> * 1.可以对converter映射出的Object进行处理 * </p> */ public Object readAfter( T obj, K type ); }
2.自定义注解NeedXss 该注解用于需要xss过滤的字段 @Target( ElementType.FIELD ) @Retention( RetentionPolicy.RUNTIME ) @Documented public @interface NeedXss { }
//默认会过滤所有请求路径,只会过滤String类型的字段,需要其他类型过滤的请自行完善 public class XssMappingJacksonHttpMessageConverter extends MappingJacksonHttpMessageConverter implements MessageConverterHandler<Object, Type> { /** * 不需要xss过滤的路径 */ protected static List<String> urls; static { urls = new ArrayList<String>(); // for example urls.add("/xxx/xxxxx"); } //重写该方法,我们只需要加上Object tempObj = this.process( obj, type, inputMessage ); //并返回tempObj,process方法里面我们过滤白名单和进行xss处理 @Override public Object read( Type type, Class<?> contextClass, HttpInputMessage inputMessage ) throws IOException, HttpMessageNotReadableException { JavaType javaType = getJavaType( type, contextClass ); Object obj = readJavaType( javaType, inputMessage ); Object tempObj = this.process( obj, type, inputMessage ); return tempObj; } //这个就是父类的readJavaType方法,由于父类该方法是private的,所以我们copy一个用 private Object readJavaType( JavaType javaType, HttpInputMessage inputMessage ) { try { return super.getObjectMapper().readValue( inputMessage.getBody(), javaType ); } catch ( IOException ex ) { throw new HttpMessageNotReadableException( "Could not read JSON: " + ex.getMessage(), ex ); } } protected Object process( Object obj, Type type, HttpInputMessage inputMessage ) { if ( this.isNeedProcess( inputMessage ) ) { return this.readAfter( obj, type ); } else { return obj; } } //根据白名单,判断当前请求路径是否需要xss过滤 protected boolean isNeedProcess( HttpInputMessage inputMessage ) { String url = ""; try { //经过debug发现inputMessage类型为ServletServerHttpRequest,所以进行下类型转换 ServletServerHttpRequest request = ( ServletServerHttpRequest ) inputMessage; url = request.getURI().getPath(); //根据白名单做下匹配,当然也可以实现正则什么的,代码就不贴了 } catch ( Exception e ) { logger.error( "BACK_ERROR," + this.getClass().getCanonicalName() + ",XSS处理-url处理失败,url=" + url + ",ERROR=", e ); return true; } return true; } //最重要的一步,进行xss过滤 @Override public Object readAfter( Object obj, Type type ) { try { //type实际上就是我们需要convert的model,我们通过反射来完成根据NeedXss注解对String //的字段进行xss过滤 Class clazz = Class.forName( JSON.toJSONString( type ).replace( "\"", "" ) ); if ( clazz == null ) { return obj; } Field[] fields = clazz.getDeclaredFields(); if ( fields != null && fields.length > 0 ) { // string类型字段名称列表 List<String> strList = new ArrayList<String>( fields.length ); // 1. 将需要xss处理的string类型的字段放入strlist for ( int i = 0; i < fields.length; i++ ) { // 1.1该属性是否有NeedXss.class注解 NeedXss needXss = fields[ i ].getAnnotation( NeedXss.class ); // 1.2如果该没有NeedXss.class注解,则不处理该属性 if ( needXss == null || !( needXss instanceof NeedXss ) ) { continue; } String mod = Modifier.toString( fields[ i ].getModifiers() ); if ( mod.indexOf( "static" ) != -1 ) continue; // 得到属性的类名 String className = fields[ i ].getType().getSimpleName(); // 得到属性字段名 if ( className.equalsIgnoreCase( "String" ) ) { strList.add( fields[ i ].getName() ); } } // 2.将strlist中的字段进行xss处理 if ( strList.size() > 0 ) { Object temp = JSON.toJavaObject( ( JSON ) JSON.toJSON( obj ), clazz ); for ( int i = 0; i < strList.size(); i++ ) { Method set = clazz.getMethod( "set" + strList.get( i ).substring( 0, 1 ).toUpperCase() + strList.get( i ).substring( 1 ), String.class ); Method get = clazz.getMethod( "get" + strList.get( i ).substring( 0, 1 ).toUpperCase() + strList.get( i ).substring( 1 ) ); Object tempObj = get.invoke( temp ); if ( tempObj == null ) { break; } String content = tempObj.toString(); set.invoke( temp, StringUtils.cleanXss( content ) ); } return temp; } } } catch ( Exception e ) { logger.error( "BACK_ERROR," + this.getClass().getCanonicalName() + ",XSS处理失败,obj=" + JSON.toJSONString( obj ) + ",javaType=" + JSON.toJSONString( type ) + ",ERROR=", e ); return obj; } return obj; }
4.配置使用自定义的XssMappingJacksonHttpMessageConverter 在SpringMVC的配置文件里面加上下面的配置 <mvc:annotation-driven > <mvc:message-converters register-defaults="true"> <!-- 将StringHttpMessageConverter的默认编码设为UTF-8. --> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8" /> </bean> <bean class="com.zhubajie.seller.common.converter.XssMappingJacksonHttpMessageConverter"> <property name="prettyPrint" value="false" /> </bean> </mvc:message-converters> </mvc:annotation-driven>
相关推荐
配置防止XSS攻击的方法尝试,其中包含可以对sql注入的方法解决。
本文介绍且记录如何解决在SpringMVC 中遇到415 Unsupported Media Type 的问题,并且顺便介绍Spring MVC的HTTP请求信息转换器HttpMessageConverter
springmvc跨域处理,和过滤器方式跨域处理的主要代码,整体系统基于springboot框架搭建
Spring-MVC处理XSS、SQL注入攻击的方法总结
SpringMVC DispatcherServlet重写、自定义拦截器拦截器源码
\应用SpringMVC与Hibernate进行WEB开发
idea+maven+springmvc 做的登录过滤器 请求拦截器 适合初学者使用,也可以直接应用与工程项目当中
防sql注入和xss攻击, springmv拦截器,可自由调整需要拦截的字符
使用spring+springmvc框架 ...使用了urlrewrite filter进行地址重写,实现伪静态页面 使用了sitemesh对网页进行布局和修饰 使用了loginFilter对访问进行登录过滤 使用了CheckCodeServlet生成验证码图片
springMVC使用注解方式进行页面跳转
应用SpringMVC与Hibernate进行WEB开发.pdf
springmvc是常用的一种框架,学习springmvc非常重要,故需要良好教程资料
主要介绍了springmvc+shiro自定义过滤器的实现方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
SpringMVC表单标签进行数据绑定(图书管理)DemoSpringMVC表单标签进行数据绑定(图书管理)Demo
SpringMVC笔记内容:第一天(SpringMVC的概述、SpringMVC与Struts2优势分析、重要组件、运行原理、SpringMVC环境搭建、@RequestMapping注解详解、字符编码过滤器、传参形式(基本数据类型或String、对象类型、对象....
springmvc 笔记
springmvc基础 包含代码+知识点+详细解释 1. 什么是springmvc? 2. springmvc框架原理 前端控制器、处理器映射器、处理器适配器、视图解析器 3. springmvc入门程序 目的:对前端控制器、处理器映射器、处理器...
异常处理(自定义异常处理,注解配置,xml配置,错误信息提示的修改和自定义提示信息)和 springMVC拦截器,拦截过滤请求
SpringMVC笔记.pdf
传智 springmvc mybatis 燕青 笔记 教案 springmvc部分