springboot 项目前后端接口,防止xss攻击以及跨域问题解决

1、启动类添加注解

@ServletComponentScan

2、cors的拦截类

  1. package com.longfor.hrssc.api.config;
  2.  
  3. import com.longfor.hrssc.common.util.ResultUtils;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.PropertySource;
  6. import org.springframework.stereotype.Component;
  7.  
  8. import javax.servlet.*;
  9. import javax.servlet.annotation.WebFilter;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.io.IOException;
  13. import java.util.Arrays;
  14. import java.util.HashSet;
  15. import java.util.Set;
  16.  
  17. @Component
  18. @PropertySource("classpath:application-dev.yml")
  19. @WebFilter(urlPatterns = "/*", filterName = "CorsFilter")
  20. public class CorsFilter implements Filter {
  21.  
  22. @Value("${bpm.fiter.domain}")
  23. private String allowDomains;
  24.  
  25. @Override
  26. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
  27. HttpServletResponse response = (HttpServletResponse) res;
  28. HttpServletRequest reqs = (HttpServletRequest) req;
  29.  
  30. // 设置允许多个域名请求
  31. //String[] allowDomains = {"http://www.xxxx.xin","http://xxxx:8080","http://localhost:8080"};
  32. String[] allowDomain = allowDomains.split(",");
  33. Set allowOrigins = new HashSet(Arrays.asList(allowDomain));
  34. String curOrigin = reqs.getHeader("Origin");
  35. /*if("null".equalsIgnoreCase(curOrigin)){
  36. curOrigin = "http://xxxxxx:8888";
  37. }*/
  38. if(allowOrigins.contains(curOrigin) || null == curOrigin){
  39. //设置允许跨域的配置
  40. // 这里填写你允许进行跨域的主机ip(正式上线时可以动态配置具体允许的域名和IP)
  41. response.setHeader("Access-Control-Allow-Origin", curOrigin);
  42. response.setHeader("Access-Control-Allow-Credentials", "true");
  43. //response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
  44.  
  45. response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH");
  46.  
  47. response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, token");
  48. chain.doFilter(reqs, response);
  49.  
  50. }else{
  51. throw new IOException(ResultUtils.doFilter().toString());
  52. }
  53.  
  54. }
  55.  
  56. @Override
  57. public void init(FilterConfig filterConfig) {}
  58.  
  59. @Override
  60. public void destroy() {}
  61. }

3、xss相关类

  1. XssFilter
  1. package com.longfor.hrssc.api.config;
  2. import javax.servlet.*;
  3. import javax.servlet.annotation.WebFilter;
  4. import javax.servlet.http.HttpServletRequest;
  5. import java.io.IOException;
  6.  
  7. /** * XSS过滤器 * @author Jozz */
  8. @WebFilter(filterName="xssFilter",urlPatterns="/*")
  9. public class XssFilter implements Filter {
  10. @Override
  11. public void init(FilterConfig filterConfig) throws ServletException {
  12.  
  13. }
  14.  
  15. @Override
  16. public void doFilter(ServletRequest servletRequest,
  17. ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  18. HttpServletRequest request = (HttpServletRequest)servletRequest; String path = request.getServletPath();
  19. //由于我的@WebFilter注解配置的是urlPatterns="/*"(过滤所有请求),所以这里对不需要过滤的静态资源url,作忽略处理(大家可以依照具体需求配置)
  20. String[] exclusionsUrls = {".js",".gif",".jpg",".png",".css",".ico"};
  21. for (String str : exclusionsUrls) {
  22. if (path.contains(str)) {
  23. filterChain.doFilter(servletRequest,servletResponse);
  24. return;
  25. }
  26. }
  27.  
  28. filterChain.doFilter(new XssHttpServletRequestWrapper(request),servletResponse);
  29. }
  30. @Override public void destroy() {
  31.  
  32. }
  33. }
  1. XssHttpServletRequestWrapper
  1. package com.longfor.hrssc.api.config;
  2.  
  3. /**
  4. * Created by 裴帅楠 on 2019/7/10.
  5. */
  6. import com.alibaba.fastjson.JSON;
  7. import org.apache.commons.lang3.StringEscapeUtils;
  8. import org.apache.commons.lang3.StringUtils;
  9. //import org.apache.commons.text.StringEscapeUtils;
  10. import javax.servlet.ReadListener;
  11. import javax.servlet.ServletInputStream;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletRequestWrapper;
  14. import java.io.*; import java.nio.charset.Charset;
  15. import java.util.ArrayList;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.regex.Matcher;
  20. import java.util.regex.Pattern;
  21.  
  22. /** * ServletRequest包装类,对request做XSS过滤处理
  23. * @author Jozz
  24. *
  25. * */
  26.  
  27. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  28. public XssHttpServletRequestWrapper(HttpServletRequest request) {
  29. super(request);
  30. }
  31. @Override
  32. public String getHeader(String name) {
  33. return StringEscapeUtils.escapeHtml4(super.getHeader(name));
  34. }
  35.  
  36. @Override
  37. public String getQueryString() {
  38. return StringEscapeUtils.escapeHtml4(super.getQueryString());
  39. }
  40.  
  41. @Override public String getParameter(String name) {
  42. return StringEscapeUtils.escapeHtml4(super.getParameter(name));
  43. }
  44.  
  45. @Override
  46. public String[] getParameterValues(String name) {
  47. String[] values = super.getParameterValues(name);
  48. if(values != null) {
  49. int length = values.length;
  50. String[] escapseValues = new String[length];
  51. for(int i = 0; i < length; i++){
  52. escapseValues[i] = StringEscapeUtils.escapeHtml4(values[i]);
  53. }
  54. return escapseValues;
  55. }
  56. return values;
  57. }
  58.  
  59. @Override
  60. public ServletInputStream getInputStream() throws IOException {
  61. String str=getRequestBody(super.getInputStream());
  62. Map<String,Object> map= JSON.parseObject(str,Map.class);
  63. Map<String,Object> resultMap=new HashMap<>(map.size());
  64. for(String key:map.keySet()){
  65. Object val=map.get(key);
  66. if(null != val){
  67. stripXss(val.toString());
  68. }
  69.  
  70. if(map.get(key) instanceof String){
  71. resultMap.put(key,StringEscapeUtils.escapeHtml4(val.toString()));
  72. }else{
  73. resultMap.put(key,val);
  74. }
  75. }
  76. str=JSON.toJSONString(resultMap);
  77.  
  78. final ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes());
  79. return new ServletInputStream() {
  80. @Override
  81. public int read() throws IOException {
  82. return bais.read();
  83. }
  84.  
  85. @Override
  86. public boolean isFinished() {
  87. return false;
  88. }
  89.  
  90. @Override
  91. public boolean isReady() {
  92. return false;
  93. }
  94.  
  95. @Override
  96. public void setReadListener(ReadListener listener) {
  97.  
  98. }
  99. };
  100. }
  101.  
  102. private String getRequestBody(InputStream stream) {
  103. String line = "";
  104. StringBuilder body = new StringBuilder();
  105. int counter = 0;
  106. // 读取POST提交的数据内容
  107. BufferedReader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF-8")));
  108. try {
  109. while ((line = reader.readLine()) != null) {
  110. body.append(line); counter++;
  111. }
  112. } catch (IOException e) {
  113. e.printStackTrace();
  114. } return body.toString();
  115. }
  116.  
  117. private static List<Pattern> patterns = null;
  118.  
  119. public static String stripXss(String value) {
  120. if(StringUtils.isNotBlank(value)) {
  121. Matcher matcher = null;
  122. for(Pattern pattern : getPatterns()) {
  123. matcher = pattern.matcher(value);
  124. // 匹配
  125. if(matcher.find()) {
  126. // 删除相关字符串
  127. value = matcher.replaceAll("");
  128. }
  129. }
  130. value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
  131. }
  132. /* if (LOG.isDebugEnabled()) {
  133. LOG.debug("strip value: " + value); return value;
  134. }*/
  135. return value;
  136. }
  137.  
  138. private static List<Object[]> getXssPatternList() {
  139. List<Object[]> ret = new ArrayList<Object[]>();
  140. ret.add(new Object[]{"<(no)?script[^>]*>.*?</(no)?script>", Pattern.CASE_INSENSITIVE});
  141. ret.add(new Object[]{"eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
  142. ret.add(new Object[]{"expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
  143. ret.add(new Object[]{"(javascript:|vbscript:|view-source:)*", Pattern.CASE_INSENSITIVE});
  144. ret.add(new Object[]{"<(\"[^\"]*\"|\'[^\']*\'|[^\'\">])*>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
  145. ret.add(new Object[]{"(window\\.location|window\\.|\\.location|document\\.cookie|document\\.|alert\\(.*?\\)|window\\.open\\()*", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
  146. ret.add(new Object[]{"<+\\s*\\w*\\s*(oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondragstart|ondrop|onerror=|onerroupdate|onfilterchange|onfinish|onfocus|onfocusin|onfocusout|onhelp|onkeydown|onkeypress|onkeyup|onlayoutcomplete|onload|onlosecapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmousout|onmouseover|onmouseup|onmousewheel|onmove|onmoveend|onmovestart|onabort|onactivate|onafterprint|onafterupdate|onbefore|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditocus|onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onblur|onbounce|oncellchange|onchange|onclick|oncontextmenu|onpaste|onpropertychange|onreadystatechange|onreset|onresize|onresizend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onselect|onselectionchange|onselectstart|onstart|onstop|onsubmit|onunload)+\\s*=+", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL});
  147. return ret;
  148. }
  149. private static List<Pattern> getPatterns() {
  150. if (patterns == null) {
  151. List<Pattern> list = new ArrayList<Pattern>();
  152. String regex = null;
  153. Integer flag = null;
  154. int arrLength = 0;
  155. for(Object[] arr : getXssPatternList()) {
  156. arrLength = arr.length; for(int i = 0; i < arrLength; i++) {
  157. regex = (String)arr[0]; flag = (Integer)arr[1]; list.add(Pattern.compile(regex, flag));
  158. }
  159. }
  160. patterns = list;
  161. }
  162. return patterns;
  163. }
  164.  
  165. }

4、yml中配置

  1. #bpm域名过滤
  2. bpm:
  3. fiter:
  4. domain: http://xxx.sit,https://xxxxx.net:8089,http://xxxxx.sit:8088,http://xxxxx:8888,https://xxxxx:8443

5、返回

  1. /**
  2. * 跨域白名单
  3. * @return
  4. */
  5. public static ResultUtils doFilter() {
  6. return new ResultUtils(Constants.doFilterCode, Constants.doFilterException, null);
  7. }

6、自定义code

  1. public static final int doFilterCode = 403;
  2. public static final String doFilterException = "请申请IP白名单";
  1.  

springboot自定义CORS&XSS拦截器的更多相关文章

  1. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  2. SpringBoot从零单排 ------ 拦截器的使用

    在项目开发中我们常常需要对请求进行验证,如登录校验.权限验证.防止重复提交等等,通过拦截器来过滤请求.自定义一个拦截器需要实现HandlerInterceptor接口.代码如下: import org ...

  3. springboot(五)过滤器和拦截器

    前言 过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查.日志记录等.二者有一定的相似之处,不同的地方在于: Filter是servlet规范,只能用在Web程序中,而拦截器是Sprin ...

  4. SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆

    在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...

  5. springBoot 2.X-自定义拦截器

    package com.cx.springboot.myInter; import javax.servlet.http.HttpServletRequest; import javax.servle ...

  6. 玩转SpringBoot之整合Mybatis拦截器对数据库水平分表

    利用Mybatis拦截器对数据库水平分表 需求描述 当数据量比较多时,放在一个表中的时候会影响查询效率:或者数据的时效性只是当月有效的时候:这时我们就会涉及到数据库的分表操作了.当然,你也可以使用比较 ...

  7. SpringBoot开发案例之拦截器注入Bean

    前言 由于业务需要,需要在拦截器中操作Redis缓存,按照 controller,service层配置发现无法注入,一直报空指针异常. 解决方案 @Configuration public class ...

  8. 如何在SpringBoot项目中使用拦截器

    相比springmvc,springboot中拦截器不需要在xml中配置,只需定义拦截器类 implements HandlerInterceptor 和拦截器拦截路径的配置类extends WebM ...

  9. springboot中配置了拦截器后,拦截器无效的解决方案之一

    springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...

随机推荐

  1. MUNIT:Multimodal Unsupervised Image-to-Image Translation - 1 - 论文学习,不成对数据

    摘要:无监督图像转换是计算机视觉领域中一个重要而又具有挑战性的问题.给定源域中的一幅图像,目标是学习目标域中对应图像的条件分布,而不需要看到任何对应图像对的例子.虽然这种条件分布本质上是多模态的,但现 ...

  2. Windows 10提示你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问

    Windows 10提示你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问 1.首先按window+R键打开运行.如下图 2.在运行中输入“gpedit.msc”来启动本地组策略编 ...

  3. (原)x264代码中的码流控制学习

    (本文主要是自己的学习笔记,如果有误,请留言,一起讨论和更正.)这里采用x264的代码进行走读的方式,来学习qp在码流控制中过程. 在ABR模式下,当我们设置一个bitrate的平均码率以后,x264 ...

  4. JZ落选跟我们有什么关系

    今天中午睡前刷了一下微博,看到JZ派落选了,底下一大堆冷嘲热讽的. 比如,养了一堆白眼狼,给了XG一堆利好政策,却这样FZ. 这种心态像极了多子女家庭的生活. 多子女家庭里,总有几个是性格比较乖巧,也 ...

  5. ThinkPHP 中入口文件中的APP_DEBUG为TRUE时不报错,改为FALSE时报错

    今天好不容易将一个新闻网做好了(ThinkPHP框架做的),但是,当我将入口文件中定义调试模式设为FALSE,即define('APP_DEBUG',False),然后再刷新网站的时候,就提示报错,报 ...

  6. CentOS 7上重新编译安装nginx

    CentOS 7的源所提供的nginx几乎不包含任何扩展模块:为了能够使用一些扩展模块,我们需要从源代码重新编译安装nginx. 目前最新版的源代码是1.6.1.下载解压后先不要急着configure ...

  7. Python的网页解析库-PyQuery

    PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...

  8. [Linux]Linux下samba创建共享文件

    1. 安装samba服务 yum install -y samba 2. 创建需要共享的目录 在目录/home/xxxx/share xxx为用户名 mkdir share 修改该目录权限(上层文件夹 ...

  9. electron+vue实现菜单栏

    公司开发的产品都是用c++写的,而且还都是几个人,老板想搞下创新,就是看看能否通过其它的方式来实现前后端分离.然后我就了解到了electron这个东西,之前学安卓的时候看到过flutter,不经意间看 ...

  10. 浏览器解析js和type判断数据类型

    ### 浏览器解析: - 1.当浏览器(内核.引擎)解析和渲染js的时候,会给js提供一个运行的环境,这个环境叫做“全局作用域(后端global / 客服端window scope)” - 2.代码自 ...