一、Filter简介

  Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,
Servlet, 静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等
一些高级功能。
  Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter
技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,Filter接口源代码:

  1. public abstract interface Filter{
  2. public abstract void init(FilterConfig paramFilterConfig) throws ServletException;
  3. public abstract void doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain
  4. paramFilterChain) throws IOException, ServletException;
  5. public abstract void destroy();
  6. }

二、Filter是如何实现拦截的?(Filter的工作原理)

  Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,
都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:
    调用目标资源之前,让一段代码执行。
    是否调用目标资源(即是否让用户访问web资源)。
    调用目标资源之后,让一段代码执行。
  web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个
doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,
否则web资源不会被访问。

三、Filter开发流程

3.1、Filter开发步骤
Filter开发分为2步:
 * 编写java类实现Filter接口,并实现其doFilter方法。
 * 在web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

过滤器范例:

  1. import java.io.IOException;
  2. import javax.servlet.Filter;
  3. import javax.servlet.FilterChain;
  4. import javax.servlet.FilterConfig;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletRequest;
  7. import javax.servlet.ServletResponse;
  8. /**
  9. * @author yangcq
  10. * @description 过滤器Filter的工作原理
  11. */
  12. public class FilterTest implements Filter{
  13. public void destroy() {
  14. System.out.println("----Filter销毁----");
  15. }
  16. public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {
  17. // 对request、response进行一些预处理
  18. request.setCharacterEncoding("UTF-8");
  19. response.setCharacterEncoding("UTF-8");
  20. response.setContentType("text/html;charset=UTF-8");
  21. System.out.println("----调用service之前执行一段代码----");
  22. filterChain.doFilter(request, response); // 执行目标资源,放行
  23. System.out.println("----调用service之后执行一段代码----");
  24. }
  25. public void init(FilterConfig arg0) throws ServletException {
  26. System.out.println("----Filter初始化----");
  27. }
  28. }

在web. xml中配置过滤器:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="3.0"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7. <display-name></display-name>
  8. <welcome-file-list>
  9. <welcome-file>index.jsp</welcome-file>
  10. </welcome-file-list>
  11. <!--配置过滤器-->
  12. <filter>
  13. <filter-name>FilterTest</filter-name>
  14. <filter-class>com.yangcq.filter.FilterTest</filter-class>
  15. </filter>
  16. <!--映射过滤器-->
  17. <filter-mapping>
  18. <filter-name>FilterTest</filter-name>
  19. <!--“/*”表示拦截所有的请求 -->
  20. <url-pattern>/*</url-pattern>
  21. </filter-mapping>
  22. </web-app>

3.2、Filter链
  在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,
决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter
方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,
如果没有,则调用目标资源。

四,Spring框架下,过滤器的配置
    如果项目中使用了Spring框架,那么,很多过滤器都不用自己来写了,Spring为我们写好了一些常用的过滤器。下面我们就以字符编码的
过滤器CharacterEncodingFilter为例,来看一下Spring框架下,如果配置过滤器。

  1. <filter>
  2. <filter-name>encodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>forceEncoding</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>encodingFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>

很简单吧,这样几行配置代码,就完成了从全局控制字符编码的功能。接下来,我们看一下CharacterEncodingFilter这个过滤器的关键代码,感受
一下,大师的风采,如果我们写过滤器的话,可以以此为范例。

  1. package org.springframework.web.filter;
  2. import java.io.IOException;
  3. import javax.servlet.FilterChain;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.springframework.util.ClassUtils;
  8. public class CharacterEncodingFilter extends OncePerRequestFilter{
  9. private static final boolean responseSetCharacterEncodingAvailable = ClassUtils.hasMethod(
  10. class$javax$servlet$http$HttpServletResponse, "setCharacterEncoding", new Class[] { String.class });
  11. // 需要设置的编码方式,为了支持可配置,Spring把编码方式设置成了一个变量
  12. private String encoding;
  13. // 是否强制使用统一编码,也是为了支持可配置
  14. private boolean forceEncoding;
  15. // 构造器,在这里,Spring把forceEncoding的值默认设置成了false
  16. public CharacterEncodingFilter(){
  17. this.forceEncoding = false;
  18. }
  19. // encoding/forceEncoding的setter方法
  20. public void setEncoding(String encoding){
  21. this.encoding = encoding;
  22. }
  23. public void setForceEncoding(boolean forceEncoding){
  24. this.forceEncoding = forceEncoding;
  25. }
  26. // Spring通过GenericFilterBean抽象类,对Filter接口进行了整合,
  27. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
  28. throws ServletException, IOException{
  29. if ((this.encoding != null) && (((this.forceEncoding) || (request.getCharacterEncoding() == null)))) {
  30. request.setCharacterEncoding(this.encoding);
  31. if ((this.forceEncoding) && (responseSetCharacterEncodingAvailable)) {
  32. response.setCharacterEncoding(this.encoding);
  33. }
  34. }
  35. filterChain.doFilter(request, response);
  36. }
  37. }

GenericFilterBean类:
public abstract class GenericFilterBean implements Filter, BeanNameAware, ServletContextAware, InitializingBean, DisposableBean

还没有过瘾,那就再看一个项目中使用过的一个过滤器:InvilidCharacterFilter(防止脚本攻击的过滤器)

  1. import java.io.IOException;
  2. import java.util.Enumeration;
  3. import javax.servlet.FilterChain;
  4. import javax.servlet.RequestDispatcher;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.apache.commons.lang.StringUtils;
  9. import org.springframework.web.filter.CharacterEncodingFilter;
  10. /*
  11. * InvalidCharacterFilter:过滤request请求中的非法字符,防止脚本攻击
  12. * InvalidCharacterFilter继承了Spring框架的CharacterEncodingFilter过滤器,当然,我们也可以自己实现这样一个过滤器
  13. */
  14. public class InvalidCharacterFilter extends CharacterEncodingFilter{
  15. // 需要过滤的非法字符
  16. private static String[] invalidCharacter = new String[]{
  17. "script","select","insert","document","window","function",
  18. "delete","update","prompt","alert","create","alter",
  19. "drop","iframe","link","where","replace","function","onabort",
  20. "onactivate","onafterprint","onafterupdate","onbeforeactivate",
  21. "onbeforecopy","onbeforecut","onbeforedeactivateonfocus",
  22. "onkeydown","onkeypress","onkeyup","onload",
  23. "expression","applet","layer","ilayeditfocus","onbeforepaste",
  24. "onbeforeprint","onbeforeunload","onbeforeupdate",
  25. "onblur","onbounce","oncellchange","oncontextmenu",
  26. "oncontrolselect","oncopy","oncut","ondataavailable",
  27. "ondatasetchanged","ondatasetcomplete","ondeactivate",
  28. "ondrag","ondrop","onerror","onfilterchange","onfinish","onhelp",
  29. "onlayoutcomplete","onlosecapture","onmouse","ote",
  30. "onpropertychange","onreadystatechange","onreset","onresize",
  31. "onresizeend","onresizestart","onrow","onscroll",
  32. "onselect","onstaronsubmit","onunload","IMgsrc","infarction"
  33. };
  34. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
  35. throws ServletException, IOException{
  36. String parameterName = null;
  37. String parameterValue = null;
  38. // 获取请求的参数
  39. @SuppressWarnings("unchecked")
  40. Enumeration<String> allParameter = request.getParameterNames();
  41. while(allParameter.hasMoreElements()){
  42. parameterName = allParameter.nextElement();
  43. parameterValue = request.getParameter(parameterName);
  44. if(null != parameterValue){
  45. for(String str : invalidCharacter){
  46. if (StringUtils.containsIgnoreCase(parameterValue, str)){
  47. request.setAttribute("errorMessage", "非法字符:" + str);
  48. RequestDispatcher requestDispatcher = request.getRequestDispatcher("/error.jsp");
  49. requestDispatcher.forward(request, response);
  50. return;
  51. }
  52. }
  53. }
  54. }
  55. super.doFilterInternal(request, response, filterChain);
  56. }
  57. }

接下来需要在web.xml中进行配置:

  1. <filter>
  2. <filter-name>InvalidCharacterFilter</filter-name>
  3. <filter-class>com.yangcq.filter.InvalidCharacterFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>InvalidCharacterFilter</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

如果我们不使用Spring的CharacterEncodingFilter类,可以自己来写。

  1. import java.io.IOException;
  2. import java.util.Enumeration;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.RequestDispatcher;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import org.apache.commons.lang.StringUtils;
  11. /**
  12. * SelfDefineInvalidCharacterFilter:过滤request请求中的非法字符,防止脚本攻击
  13. */
  14. public class SelfDefineInvalidCharacterFilter implements Filter{
  15. public void destroy() {
  16. }
  17. public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
  18. String parameterName = null;
  19. String parameterValue = null;
  20. // 获取请求的参数
  21. @SuppressWarnings("unchecked")
  22. Enumeration<String> allParameter = request.getParameterNames();
  23. while(allParameter.hasMoreElements()){
  24. parameterName = allParameter.nextElement();
  25. parameterValue = request.getParameter(parameterName);
  26. if(null != parameterValue){
  27. for(String str : invalidCharacter){
  28. if (StringUtils.containsIgnoreCase(parameterValue, str)){
  29. request.setAttribute("errorMessage", "非法字符:" + str);
  30. RequestDispatcher requestDispatcher = request.getRequestDispatcher("/error.jsp");
  31. requestDispatcher.forward(request, response);
  32. return;
  33. }
  34. }
  35. }
  36. }
  37. filterChain.doFilter(request, response); // 执行目标资源,放行
  38. }
  39. public void init(FilterConfig filterConfig) throws ServletException {
  40. }
  41. // 需要过滤的非法字符
  42. private static String[] invalidCharacter = new String[]{
  43. "script","select","insert","document","window","function",
  44. "delete","update","prompt","alert","create","alter",
  45. "drop","iframe","link","where","replace","function","onabort",
  46. "onactivate","onafterprint","onafterupdate","onbeforeactivate",
  47. "onbeforecopy","onbeforecut","onbeforedeactivateonfocus",
  48. "onkeydown","onkeypress","onkeyup","onload",
  49. "expression","applet","layer","ilayeditfocus","onbeforepaste",
  50. "onbeforeprint","onbeforeunload","onbeforeupdate",
  51. "onblur","onbounce","oncellchange","oncontextmenu",
  52. "oncontrolselect","oncopy","oncut","ondataavailable",
  53. "ondatasetchanged","ondatasetcomplete","ondeactivate",
  54. "ondrag","ondrop","onerror","onfilterchange","onfinish","onhelp",
  55. "onlayoutcomplete","onlosecapture","onmouse","ote",
  56. "onpropertychange","onreadystatechange","onreset","onresize",
  57. "onresizeend","onresizestart","onrow","onscroll",
  58. "onselect","onstaronsubmit","onunload","IMgsrc","infarction"
  59. };
  60. }

接下来需要在web.xml中进行配置:

  1. <filter>
  2. <filter-name>SelfDefineInvalidCharacterFilter</filter-name>
  3. <filter-class>com.yangcq.filter.SelfDefineInvalidCharacterFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>SelfDefineInvalidCharacterFilter</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

五、Filter的生命周期

5.1、Filter的创建
  Filter的创建和销毁由web服务器负责。 web应用程序启动时,web服务器将创建Filter的实例对象,并调用其init方法,完成对象的初始化
功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前
filter配置信息的FilterConfig对象。

5.2、Filter的销毁
  web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

5.3、FilterConfig接口
  用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了
filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
  String getFilterName():得到filter的名称。
  String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
  Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  public ServletContext getServletContext():返回Servlet上下文对象的引用。

示例:利用FilterConfig得到filter配置信息

  1. package com.yangcq.filter;
  2. import java.io.IOException;
  3. import java.util.Enumeration;
  4. import javax.servlet.Filter;
  5. import javax.servlet.FilterChain;
  6. import javax.servlet.FilterConfig;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. public class FilterTest implements Filter {
  11. /* 过滤器初始化
  12. * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
  13. */
  14. @Override
  15. public void init(FilterConfig filterConfig) throws ServletException {
  16. System.out.println("----过滤器初始化----");
  17. /**
  18. *  <filter>
  19. <filter-name>FilterTest</filter-name>
  20. <filter-class>com.yangcq.filter.FilterTest</filter-class>
  21. <!--配置FilterTest过滤器的初始化参数-->
  22. <init-param>
  23. <description>FilterTest</description>
  24. <param-name>name</param-name>
  25. <param-value>gacl</param-value>
  26. </init-param>
  27. <init-param>
  28. <description>配置FilterTest过滤器的初始化参数</description>
  29. <param-name>like</param-name>
  30. <param-value>java</param-value>
  31. </init-param>
  32. </filter>
  33. <filter-mapping>
  34. <filter-name>FilterDemo02</filter-name>
  35. <!--“/*”表示拦截所有的请求 -->
  36. <url-pattern>/*</url-pattern>
  37. </filter-mapping>
  38. */
  39. //得到过滤器的名字
  40. String filterName = filterConfig.getFilterName();
  41. //得到在web.xml文件中配置的初始化参数
  42. String initParam1 = filterConfig.getInitParameter("name");
  43. String initParam2 = filterConfig.getInitParameter("like");
  44. //返回过滤器的所有初始化参数的名字的枚举集合。
  45. Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
  46. System.out.println(filterName);
  47. System.out.println(initParam1);
  48. System.out.println(initParam2);
  49. while (initParameterNames.hasMoreElements()) {
  50. String paramName = (String) initParameterNames.nextElement();
  51. System.out.println(paramName);
  52. }
  53. }
  54. @Override
  55. public void doFilter(ServletRequest request, ServletResponse response,
  56. FilterChain chain) throws IOException, ServletException {
  57. System.out.println("FilterDemo02执行前!!!");
  58. chain.doFilter(request, response);  //让目标资源执行,放行
  59. System.out.println("FilterDemo02执行后!!!");
  60. }
  61. @Override
  62. public void destroy() {
  63. System.out.println("----过滤器销毁----");
  64. }
  65. }

六、Filter的部署时的一些参数的含义

Filter的部署分为两个步骤:
  1、注册Filter
  2、映射Filter

6.1、注册Filter
  开发好Filter之后,需要在web.xml文件中进行注册,这样才能够被web服务器调用。在web.xml文件中注册Filter范例:

  1. <filter>
  2. <description>过滤器名称</description>
  3. <filter-name>自定义的名字</filter-name>
  4. <filter-class>com.yangcq.filter.FilterTest</filter-class>
  5. <!--配置FilterTest过滤器的初始化参数-->
  6. <init-param>
  7. <description>配置过滤器的初始化参数</description>
  8. <param-name>name</param-name>
  9. <param-value>gacl</param-value>
  10. </init-param>
  11. <init-param>
  12. <description>配置FilterTest过滤器的初始化参数</description>
  13. <param-name>like</param-name>
  14. <param-value>java</param-value>
  15. </init-param>
  16. </filter>

<description>用于添加描述信息,该元素的内容可为空,<description>可以不配置。
  <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
  <filter-class>元素用于指定过滤器的完整的限定类名。
  <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,
可以使用FilterConfig接口对象来访问初始化参数。如果过滤器不需要指定初始化参数,那么<init-param>元素可以不配置。

6.2、映射Filter
  在web.xml文件中注册了Filter之后,还要在web.xml文件中映射Filter
<!--映射过滤器-->
  <filter-mapping>
      <filter-name>FilterTest</filter-name>
      <!--“/*”表示拦截所有的请求 -->
      <url-pattern>/*</url-pattern>
  </filter-mapping>

<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
  <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
  <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
  <servlet-name>指定过滤器所拦截的Servlet名称。
  <dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。如下:

<filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

 <dispatcher> 子元素可以设置的值及其意义:
    REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问
时,那么该过滤器就不会被调用。
    INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
    FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

java之过滤器Filter的更多相关文章

  1. java Web 过滤器Filter详解

    简介 Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊 ...

  2. java之过滤器Filter (应用场景)

    filter在开发中的常见应用:     * 1.filter可以目标资源执行之前,进行权限检查,检查用户有无权限,如有权限则放行,如没有,则拒绝访问     * 2.filter可以放行之前,对re ...

  3. java中过滤器Filter的使用总结【转载】

    1.看了别人写的,觉得获益匪浅,转载下为以后的使用 java中Filter的使用

  4. Java 中的 Filter 过滤器详解

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

  5. java Servlet中的过滤器Filter

    web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...

  6. Java中的Filter过滤器

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

  7. Java Spring Boot VS .NetCore (二)实现一个过滤器Filter

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  8. Java基础95 过滤器 Filter

    1.filter 过滤器的概述 filter过滤器:是面向切面编程的一种实现策略,在不影响原来的程序流程的前提下,将一些业务逻辑切入流程中,在请求达到目标之前进行处理,一般用于编码过滤.权限过滤... ...

  9. java过滤器Filter笔记

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet, 静 ...

随机推荐

  1. fb27a9aeaf604597826718c467cc9f4f 为什么我老收到这个

    fb27a9aeaf604597826718c467cc9f4f   为什么我老收到这个fb27a9aeaf604597826718c467cc9f4f   为什么我老收到这个fb27a9aeaf60 ...

  2. [51nod1709]复杂度分析

    给出一棵n个点的树(以1号点为根),定义dep[i]为点i到根路径上点的个数.众所周知,树上最近公共祖先问题可以用倍增算法解决.现在我们需要算出这个算法精确的复杂度.我们定义计算点i和点j最近公共组先 ...

  3. 最小生成树—prim算法

    最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...

  4. os系统

    任务延时函数OSTimeDly 功能:调用该函数的任务将自己延时一段时间并执行一次任务调度,一旦规定的延时时间完成或有其它的任务通过调用OSTimeDlyResume()取消了延时,调用OSTimeD ...

  5. Spring框架学习笔记(4)——配置bean more

    1.配置List属性 <!-- 配置List属性 --> <bean id="person4" class="com.broadtext.beans.c ...

  6. CSS3技巧巧妙使用:not(:last-of-type)简化你的css代码

    终于找到了一个好方法,使用:not(:last-of-type)简单方便,再也不要麻烦的单独使用:last-of-type了,不错! 应用场景:平时我们的列表一般都会有分割线,但是最后一个列表没有分割 ...

  7. Spark算子--mapPartitions和mapPartitionsWithIndex

    mapPartitions--Transformation类算子 代码示例 result   mapPartitionsWithIndex--Transformation类算子 代码示例 result ...

  8. Arrays类详解

    数组是数据结构中最简单的一种类型.在平常的使用上也比较多见.今天就来总结一下数组在使用过程中的一些心得 1.java中包装数组的一些基本用法的抽象类  java.util.Arrays.这个类中包含操 ...

  9. 【搬运】Tea算法Java实现工具类

    最近在做数据加密,目标是实现平台app的数据安全性,所以准备使用AES+Base64进行加密,适逢一个特长的json串AES加密不了,于是在谷歌了各种算法,判断是否合用,参见 各种加密算法比较 一文中 ...

  10. vue.js打包后,接口安全问题

    后面有一位朋友回答后台origin判断,但另一个朋友说可以通过代理请求就绕过跨域. 想想也对,代理的话origin就无效了,页面还是可以跑起来. 不知道有没有人想过这个问题,还是我想的方向有误,请各位 ...