免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2092 | 回复: 0
打印 上一主题 下一主题

一个简单的拦截器代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-29 14:04 |只看该作者 |倒序浏览
拦截器
  1. package com.sfexpress.pmp.setting;

  2. import com.google.common.collect.ImmutableMap;
  3. import com.google.common.collect.Maps;
  4. import com.sfexpress.pmp.dao.UserDao;
  5. import com.sfexpress.pmp.model.user.User;

  6. import org.glassfish.grizzly.http.server.Session;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.security.core.Authentication;
  9. import org.springframework.security.core.context.SecurityContext;
  10. import org.springframework.security.core.context.SecurityContextHolder;
  11. import org.springframework.stereotype.Component;
  12. import org.springframework.web.context.request.RequestContextHolder;
  13. import org.springframework.web.context.request.ServletRequestAttributes;

  14. import javax.servlet.*;
  15. import javax.servlet.http.Cookie;
  16. import javax.servlet.http.HttpServletRequest;
  17. import javax.servlet.http.HttpServletRequestWrapper;
  18. import javax.servlet.http.HttpServletResponse;
  19. import javax.servlet.http.HttpSession;

  20. import java.io.*;
  21. import java.util.Map;
  22. import java.util.regex.Pattern;

  23. @Component
  24. public class XSSRequestFilter implements Filter {
  25.      
  26.     @Autowired
  27.     private UserDao userDao;
  28.      
  29.     @Override
  30.     public void init(FilterConfig config) throws ServletException {
  31.     }

  32.     @Override
  33.     public void destroy() {
  34.     }

  35.     @Override
  36.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  37.         HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  38.         HttpServletResponse httpServletResponse = (HttpServletResponse) response;
  39.          
  40.          
  41.         Cookie[] cookies = httpServletRequest.getCookies();
  42.         HttpSession session = httpServletRequest.getSession();
  43.         addUserToSession(session);
  44.         //User user = (User)session.getAttribute("user");
  45.         String url = httpServletRequest.getServletPath();
  46.         Map<String,String> map = Maps.newHashMap();//用于存登录的时候请求地址
  47.         map.put("a", "/resources/login.htm");
  48.         map.put("b", "/favicon.ico");
  49.         map.put("c", "/j_spring_security_check");
  50.         boolean flag=true;
  51.         if(map.containsValue(url)){//包含登录
  52.             flag=false;
  53.         }
  54.         if(null != cookies){
  55.             for(Cookie c :cookies ){
  56.                 //当前端cookies里有jsessionid,并且前端cookies的jsessionid跟服务端的sessionId不一致,说明是有退出,登录的时候除外
  57.                 if(flag && null != c.getValue() &&"JSESSIONID".equals(c.getName()) && !c.getValue().equals(session.getId())){
  58.                     //httpServletResponse.sendRedirect("http://asura.st.sf-express.com/");
  59.                     httpServletResponse.setStatus(406);
  60.                     return;
  61.                 }
  62.             }
  63.         }
  64.         /*
  65.         if(httpServletRequest.getSession(false)==null || session.getId()==null){
  66.             System.out.println("session已过期");
  67.         }*/
  68.          
  69.          
  70.         if (decodeHash(httpServletRequest, httpServletResponse)) return;

  71.         if (request.getContentType() != null && request.getContentType().contains("multipart/form-data")) {
  72.             chain.doFilter(httpServletRequest, response);
  73.         } else {
  74.             if ((httpServletRequest).getMethod().equalsIgnoreCase("POST") || (httpServletRequest).getMethod().equalsIgnoreCase("PUT")) {
  75.                 httpServletRequest = new XSSRequestWrapper(httpServletRequest);
  76.             }
  77.             chain.doFilter(httpServletRequest, response);
  78.         }
  79.     }

  80.      
  81.     public void addUserToSession(HttpSession session){
  82.          
  83.          
  84.     }
  85.      
  86.     private boolean decodeHash(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
  87.         String requestURI = httpServletRequest.getRequestURI();
  88.         if (requestURI.contains("%23")) {
  89.             String replacedURL = requestURI.replace("%23", "#");
  90.             httpServletResponse.sendRedirect(replacedURL);
  91.             return true;
  92.         }
  93.         return false;
  94.     }

  95.     private static class XSSRequestWrapper extends HttpServletRequestWrapper {
  96.         private HttpServletRequest request;

  97.         private static Map<Pattern, String> FILTER_MAPPING = Maps.newLinkedHashMap(new ImmutableMap.Builder<Pattern, String>()
  98.                /*.put(Pattern.compile("&"), "&amp;")
  99.                 .put(Pattern.compile("<"), "&lt;")
  100.                 .put(Pattern.compile(">"), "&gt;")*/
  101.                 .put(Pattern.compile("&"), "&")
  102.                 .put(Pattern.compile("<"), "〈")
  103.                 .put(Pattern.compile(">"), "〉")
  104.                 .put(Pattern.compile("&amp;"), "&")
  105.                 .put(Pattern.compile("&lt;"), "〈")
  106.                 .put(Pattern.compile("&gt;"), "〉")
  107.                 .build());

  108.         public XSSRequestWrapper(HttpServletRequest request) throws IOException {
  109.             super(request);
  110.             this.request = request;
  111.         }

  112.         @Override
  113.         public ServletInputStream getInputStream() throws IOException {
  114.             XSSServletInputStream xssServletInputStream = new XSSServletInputStream();
  115.             ServletInputStream inputStream = request.getInputStream();

  116.             ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
  117.             try {
  118.                 int ch;
  119.                 while ((ch = inputStream.read()) != -1) {
  120.                     byteStream.write(ch);
  121.                 }
  122.             } finally {
  123.                 inputStream.close();
  124.             }
  125.             xssServletInputStream.stream = new ByteArrayInputStream(filterRequestBody(new String(byteStream.toByteArray(),"utf-8")).getBytes("utf-8"));
  126.             return xssServletInputStream;
  127.         }

  128.         @Override
  129.         public BufferedReader getReader() throws IOException {
  130.             return new BufferedReader(new InputStreamReader(getInputStream(), request.getCharacterEncoding()));
  131.         }

  132.         private String filterRequestBody(String requestBody){
  133.             String filterResult = readUnicodeStr2(requestBody);
  134.             for (Map.Entry<Pattern, String> patternStringEntry : FILTER_MAPPING.entrySet()) {
  135.                 Pattern pattern = patternStringEntry.getKey();
  136.                 filterResult = pattern.matcher(filterResult).replaceAll(patternStringEntry.getValue());
  137.             }
  138.             return filterResult;
  139.         }

  140.         private class XSSServletInputStream extends ServletInputStream {
  141.             private InputStream stream;

  142.             @Override
  143.             public int read() throws IOException {
  144.                 return stream.read();
  145.             }
  146.         }

  147.         public static String readUnicodeStr2(String unicodeStr) {
  148.             StringBuilder buf = new StringBuilder();

  149.             for (int i = 0; i < unicodeStr.length(); i++) {
  150.                 char char1 = unicodeStr.charAt(i);
  151.                 if (char1 == '\\' && isUnicode(unicodeStr, i)) {
  152.                     char char2 = unicodeStr.charAt(i-1);
  153.                     if(char2 == '\\'){
  154.                         buf.append(char1);
  155.                         continue;
  156.                     }
  157.                     String cStr = unicodeStr.substring(i + 2, i + 6);
  158.                     int cInt = Integer.parseInt(cStr,16);
  159.                     buf.append((char) cInt);
  160.                     // 跨过当前unicode码,因为还有i++,所以这里i加5,而不是6
  161.                     i = i + 5;
  162.                 } else {
  163.                     buf.append(char1);
  164.                 }
  165.             }
  166.             return buf.toString();
  167.         }

  168.         // 判断以index从i开始的串,是不是unicode码
  169.         private static boolean isUnicode(String unicodeStr, int i) {
  170.             int len = unicodeStr.length();
  171.             int remain = len - i;
  172.             // unicode码,反斜杠后还有5个字符 uxxxx
  173.             if (remain < 5)
  174.                 return false;

  175.             char flag2 = unicodeStr.charAt(i + 1);
  176.             if (flag2 != 'u')
  177.                 return false;
  178.             String nextFour = unicodeStr.substring(i + 2, i + 6);
  179.             return isHexStr(nextFour);
  180.         }

  181.         /** hex str 1-9 a-f A-F */
  182.         private static boolean isHexStr(String str) {
  183.             for (int i = 0; i < str.length(); i++) {
  184.                 char ch = str.charAt(i);
  185.                 boolean isHex = (ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'f' || ch >= 'A' && ch <= 'F');
  186.                 if (!isHex)
  187.                     return false;
  188.             }
  189.             return true;
  190.         }
  191.     }

  192. }
复制代码
  1. <filter>
  2.     <filter-name>XSSFilter</filter-name>
  3.     <filter-class>com.sfexpress.pmp.setting.XSSRequestFilter</filter-class>
  4. </filter>

  5. <filter-mapping>
  6.     <filter-name>XSSFilter</filter-name>
  7.     <url-pattern>/*</url-pattern>
  8. </filter-mapping>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP