一、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. 实例讲解基于 React+Redux 的前端开发流程

    原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...

  2. linux(五)之vi编译器

    前面介绍了linux的常用命令和对文本的操作,接下来我将对大家领略一下vi编译器的强大功能.希望大家觉得写的还不错的话可以点个“推荐”哦! 一.vim/vi编译器简介 Vim/Vi是一个功能强大的全屏 ...

  3. 安装myeclipse后,打开时弹出:“该站点安全证书的吊销证书不可用”,怎样解决?

    1.当弹出"该站点安全证书的吊销信息不可用.是否继续?"的对话框时,点击"查看证书",切换到"详细信息"TAB页,找到其"CRL分 ...

  4. 蓝桥杯 0/1背包问题 (java)

      今天第一次接触了0/1背包问题,总结一下,方便以后修改.不对的地方还请大家不啬赐教! 上一个蓝桥杯的例题: 数据规模和约定 代码: import java.util.Scanner; public ...

  5. 关于React Native的那些坑

    好久没写博客了,特地把之前接触React Native时遇到的坑总结一下. 初始化一个React Native项目时,可能会遇到以下这些坑: 1.项目版本号与安卓模拟器中安装的 compileSdkV ...

  6. Cookie实现--用户上次访问时间

    用户上次访问时间  

  7. vue ajax获取数据的时候,如何保证传递参数的安全或者说如何保护api的安全

    https://segmentfault.com/q/1010000005618139 vue ajax获取数据的时候,如何保证传递参数的安全或者说如何保护api的安全 点击提交,发送请求.但是api ...

  8. linux利用sendmail发送邮件的方法

    Linux利用sendmail发送邮件, 方法1 安装sendmail即可使用, mail -s "test" user@sohu.com bin/mail会默认使用本地sendm ...

  9. Android 问题

    1.Cannot refer to a non-final variable 解决方法 内部类如果要引用外部类的变量,则该变量必须为final,这是规定 2.error: No resource id ...

  10. IIS命令行管理工具使用

    AppCmd.exe工具所在目录 C:\windows\sytstem32\inetsrv\目录下 一条命令批量添加应用程序 c:\Windows\System32\inetsrv>for /d ...