一、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. Java反射-中级知识掌握

    PS:本文就Java反射常用的中级知识做下汇总和分析/cnxieyang@163.com/xieyang@e6yun.com

  2. 栈的存储结构的实现(C/C++实现)

    存档 #include "iostream.h" #include <stdlib.h> #define max 20 typedef char elemtype; # ...

  3. [Codeforces 696D] Legen...

    题目大意: 给出一些匹配串,要造一个长度不超过L的字符串,每个匹配串有自己的价值,匹配串每次出现在字符串里都会贡献一次价值...要求可能得到的最大价值. 匹配串总长不超200,L<=10^14, ...

  4. HDU1159-Common Subsequence-LCS

    上次写题解写到一半,写的比较具体,没写完,忘记存草稿了...导致现在没心情了. Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    ...

  5. Eclipse集成Tomcat的步骤,我已测试N次都是成功的

    本文转自:https://www.cnblogs.com/weixing/p/3229983.html#undefined 使用Eclipse开发B/S结构Web应用时,必须使用Web应用服务器,常见 ...

  6. surging 微服务框架使用系列之surging介绍

    首先,感谢surging的作者fanliang11为.net开源做出的贡献 其次, surging 的git地址:https://github.com/dotnetcore/surging surgi ...

  7. spring cloud-zuul的Filter详解

    在前面我们使用zuul搭建了网关http://blog.csdn.net/liuchuanhong1/article/details/59056278 关于网关的作用,这里就不再次赘述了,我们今天的重 ...

  8. spring定时任务执行两次 项目重复初始化 项目启动两次

    tomcat/config/server.xml中Host标签Context节点的问题 项目里quartz定时器总是被执行2次,通过打印发现原来项目被加载了两次,所以项目下的Listener被重复加载 ...

  9. 随手小代码——《Python编程 从入门到实践》项目1:外星人入侵

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  10. APIs

    应用程序接口(application programe interfaces)