林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

一、Filter

1、过滤器的概念

Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题

2、过滤器的作用描述

  • 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
  • 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
  • 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
  • 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。

3、特点

Servlet
过滤器是在Java
Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改,它在Servlet被调用之前检查Request对象,
修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response
Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件,具有以下特点:

  • Servlet过滤器可能检查和修改ServletRequest和ServletResponse对象
  • 可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL时,才会触发该过滤器工作
  • 多个Servlet过滤器可以被串联起来,形成管道效应,协同修改请求和响应对象
  • 所有支持Java Servlet规范2.3的Servlet容器,都支持Servlet过滤器

4、接口

所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。该接口定义了以下3个方法:

  • init(FilterConfig)    
    这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后就会调用这个方法。在这个方法中可以通过
    FilterConfig来读取web.xml文件中Servlet过滤器的初始化参数。
  • doFilter(ServletRequest,
    ServletResponse, FilterChain) 
    这是完成实际的过滤操作的方法,当客户请求访问与过滤器关联的URL时,Servlet容器先调用该方法。FilterChain参数用来访问后续的过滤
    器的doFilter()方法。
  • destroy() Servlet容器在销毁过滤器实例前调用该方法,在这个方法中,可以释放过滤器占用的资源。

5、Filter过程


使用户可以改变一个request和修改一个response. Filter
不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开
servlet时处理response.换种说法,filter其实是一个”servletchaining”(servlet 链).一个filter
包括:

  • 在servlet被调用之前截获;
  • 在servlet被调用之前检查servletrequest;
  • 根据需要修改request头和request数据;
  • 根据需要修改response头和response数据;
  • 在servlet被调用之后截获.


能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用.几个实用的filter
包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLTfilter等.

6、Filter建立步骤

建立一个过滤器涉及下列五个步骤:
        1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilter方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。

2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息
(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参
数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。
      
3)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参
数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP
页面被激活。
       4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
       5)禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。

过滤器需要在web.xml文件中进行配置

  1. <!-- 配置Filter -->
  2. <filter>
  3. <filter-name>LogFilter</filter-name>
  4. <filter-class>com.mucfc.LogFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7. <filter-name>LogFilter</filter-name>
  8. <url-pattern>/*</url-pattern><!-- 表示处理根目录下的所有请求 -->
  9. </filter-mapping>

或者直接用注解:

  1. @WebFilter(filterName="log",urlPatterns={"/*"})
  2. public class LogFilter implements Filter {
  3. .................................
  4. }

7、映射的配置
(1) 映射到一个或多个jsp

  1. <filter-mapping>
  2. <filter-name>FilterName</filter-name>
  3. <url-pattern>/path/FileName.jsp</url-pattern>
  4. </filter-mapping>

(2) 映射到一个或多个servlet

  1. <filter-mapping>
  2. <filter-name>FilterName</filter-name>
  3. <servlet-name>ServletName1</servlet-name>
  4. </filter-mapping>
  5. <filter-mapping>
  6. <filter-name>FilterName</filter-name>
  7. <servlet-name>ServletName2</servlet-name>
  8. </filter-mapping>

(3) 映射到任意的url

  1. <filter-mapping>
  2. <filter-name>FilterName</filter-name>
  3. <url-pattern>/*</url-pattern>
  4. </filter-mapping>

二、Filter简单示例

本例子工程免费下载

下面我们要通过Filter来输出一个Hello World,先建立一个web工程。

然后添加一个Filter如下:

  1. package com.mucfc;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.annotation.WebFilter;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import javax.servlet.http.HttpSession;
  14. @WebFilter(filterName="log",urlPatterns={"/*"})
  15. public class LogFilter implements Filter {
  16. private FilterConfig filterConfig;
  17. @Override
  18. public void destroy() {
  19. filterConfig=null;
  20. }
  21. @Override
  22. public void doFilter(ServletRequest arg0, ServletResponse arg1,
  23. FilterChain arg2) throws IOException, ServletException {
  24. //获取ServletContext对象,用于记录日志
  25. ServletContext servletContext=filterConfig.getServletContext();
  26. long before=System.currentTimeMillis();
  27. System.out.println("开始过滤");
  28. HttpServletRequest httpServletRequest=(HttpServletRequest)arg0;
  29. //输出信息
  30. System.out.println("Filter已经截获到用户的请求地址"+httpServletRequest.getServletPath());
  31. //Filter 只是链式处理,请求依然放行到目的地址
  32. arg2.doFilter(arg0, arg1);
  33. //输出到服务器响应执行后处理
  34. long after=System.currentTimeMillis();
  35. System.out.println("过滤 结束");
  36. System.out.println("请求被定位到"+httpServletRequest.getRequestURI()+"  所花时间为"+(after-before));
  37. }
  38. @Override
  39. public void init(FilterConfig arg0) throws ServletException {
  40. filterConfig=arg0;
  41. }
  42. }

这里是直接使用注解的方式来配置Filter,也可以在web.xml中配置

然后就是另一个Servlet

  1. package com.mucfc;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. @WebServlet(name="HelloServlet" ,urlPatterns="/HelloServlet")
  10. //采用WebServlet注解,不用再到web.xml中配置
  11. public class HelloServlet extends HttpServlet {
  12. private static final long serialVersionUID = 1L;
  13. public HelloServlet() {
  14. super();
  15. }
  16. protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. request.setCharacterEncoding("gb2312");
  18. response.setCharacterEncoding("gb2312");
  19. PrintWriter out=response.getWriter();
  20. out.println("你好!hello World  ");
  21. out.close();
  22. }
  23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24. }
  25. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. }
  27. }

这里也是基于注解实现Servlet。这样子可以省去在web.xml中大量的代码,速度更加的快!

  1. @WebServlet(name="HelloServlet" ,urlPatterns="/HelloServlet")

相当于以下

  1. <!-- 配置servlet -->
  2. <servlet>
  3. <servlet-name>HelloServlet</servlet-name>
  4. <servlet-class>com.mucfc.HelloServlet</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>HelloServlet</servlet-name>
  8. <url-pattern>/HelloServlet</url-pattern>
  9. </servlet-mapping>

然后就是运行了:浏览器输入:http://localhost:8080/ServletLearningChapter2_1/HelloServlet

控制台输出:

页面输出:

三、四种过滤器比较

1、request过滤器

这种过滤器的工作方式比较简单,大家也经常遇到,如下所示:以下是web.xml文件配置方式:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源</servlet-name>
  8. </filter-mapping>

下面我们更改一下web.xml文件的配置,如下方式:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源1</servlet-name>
  8. </filter-mapping>
  9. <filter-mapping>
  10. <filter-name>myFilter</filter>
  11. <servlet-name> 目标资源2</servlet-name>
  12. </filter-mapping>


就是说此过滤器对目标资源一和目标资源二都进行过滤,然后当目标资源一被访问的时候我们将请求转发给目标资源二,那么这个时候过滤器是怎么工作的呢?如下
图所示:我们可以看到,当我们访问目标资源一时过滤器截取了请求,然后再转发给目标资源一,然后再转发给目标资源二,从图中我们可以看到过滤器没有截取转
发到目标资源二的请求,但是我们已经在web.xml文件中配置了该过滤器对目标资源二的过滤,为什么又没有起到过滤作用呢?

答案就在于,目标资源一是客户端直接访问,而目标资源二是被转发过来的,这时过滤器就不能过滤目标资源二。如果你直接访问目标资源二,你会发现该过滤器起到了作用?

我们上面的web.xml文件配置与以下方式等价:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源1</servlet-name>
  8. <dispatcher>REQUEST</dispatcher>
  9. </filter-mapping>
  10. <filter-mapping>
  11. <filter-name>myFilter</filter>
  12. <servlet-name> 目标资源2</servlet-name>
  13. <dispatcher>REQUEST</dispatcher>
  14. </filter-mapping>

这种方式的配置,说明只有直接访问该目标资源时该过滤器才会起作用,对转发到该目标资源的请求将忽略不处理。

那如果我想对转发到目标资源二的请求进行过滤,那怎么办呢?答案见,下一种过滤器,forward过滤器。

2、forward过滤器

我们将web.xml文件的配置修改如下:

  1. <filter>
  2.   <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源1</servlet-name>
  8. <dispatcher>REQUEST</dispatcher>
  9. </filter-mapping>
  10. <filter-mapping>
  11. <filter-name>myFilter</filter>
  12. <servlet-name> 目标资源2</servlet-name>
  13. <dispatcher>FORWARD</dispatcher>
  14. </filter-mapping>

我们看对目标资源二过滤的配置方式,这时过滤方式为forward,也就是说对转发到目标资源二的请求过滤,如果直接访问目标资源二,过滤器将不起作用。

3、include过滤器

理解了forward过滤器之后,include过滤器就不难理解了。以下方式:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源1</servlet-name>
  8. <dispatcher>REQUEST</dispatcher>
  9. </filter-mapping>
  10. <filter-mapping>
  11. <filter-name>myFilter</filter>
  12. <servlet-name> 目标资源2</servlet-name>
  13. <dispatcher>INCLUDE</dispatcher>
  14. </filter-mapping>

此表示对包含了目标资源二的请求过滤,如果直接访问目标资源二,则此过滤器将不起作用。

在JSP页面中的动作:指令包含,这时此过滤器不工作。

4、error过滤器

当我们访问一个web目标资源时,如果服务器没有找到该目标资源,那么服务器就会给出一个404错误代码。如果我们给404错误代码定义一个页面,那么当404错误发生时就会调用该页面,请看以下web.xml文件的配置:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> /error.jsp</servlet-name>
  8. <dispatcher>ERROR</dispatcher>
  9. </filter-mapping>
  10. <error-page>
  11. <error-code>404</error-code>
  12. <location>/error.jsp</location>
  13. </error-page>

当我们访问一个不存在的文件时,就会访问error.jsp,但是配置了过滤器对错误页面进行过滤,所以过滤器先接受到请求,然后再转发给error.jsp。

如果我们访问一个已经存在的页面,会不会调用error.jsp呢?如果这个页面中有response.sendError(404,"出错了!");那么该错误页面仍然会被调用,过滤器也会工作。

 
 
 

四、Filter使用范例--登陆验证

现在很多网页都要你用账号登录后才能浏览相关的内容。这里我实现通过登录账号,然后浏览相应的网页。

1、新建一个web工程,最终目录 如下:

2、登陆界面JSP:

  1. <%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <title>登录</title>
  6. </head>
  7. <body>
  8. <form action="http://localhost:8080/ServletLearningChapter2_2/Main.jsp" method="POST">
  9. 用户:<input type="text" name="username" /><br/>
  10. 密码:<input type="password" name="password" /><br/>
  11. <input type="submit" value="登录" />
  12. </form>
  13. </body>
  14. </html>

3、登录成功后进行主界面:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@page import="java.util.*"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <% String name=request.getParameter("username"); %>
  12. 欢迎用户:
  13. <%=name %>
  14. 您已经登录成功,可以尽情浏览本网站
  15. </body>
  16. </html>

4、一般如果不加过滤器的话,我们是可以直接通过http://localhost:8080/ServletLearningChapter2_2/Main.jsp

来访问到Main.jsp的。如下:

但是实际我们是想要得用户登录后才能访问,所以要增加如下的过滤 器

5、过滤器

  1. package com.mucfc;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import javax.servlet.http.HttpSession;
  12. /**
  13. *
  14. * 权限过滤器
  15. *
  16. * */
  17. public class AuthorityFilter implements Filter {
  18. private FilterConfig config;
  19. @Override
  20. public void destroy() {
  21. this.config=null;
  22. }
  23. @Override
  24. public void doFilter(ServletRequest request, ServletResponse response,
  25. FilterChain chain) throws IOException, ServletException {
  26. //获取Filter配置参数
  27. String encoding=config.getInitParameter("encoding");
  28. String loginPage=config.getInitParameter("loginPage");
  29. String afterLogin=config.getInitParameter("afterLogin");
  30. //设置request编码
  31. request.setCharacterEncoding(encoding);
  32. HttpServletRequest requ=(HttpServletRequest) request;
  33. HttpSession session=requ.getSession();
  34. //获取客户请求页面
  35. String requestPath=requ.getServletPath();
  36. String name=requ.getParameter("username");
  37. if(name==""||name==null){
  38. System.out.println("权限拦截器的消息:"+"终止");
  39. HttpServletResponse resq=(HttpServletResponse)response;
  40. resq.sendRedirect(requ.getContextPath()+loginPage);
  41. }else{
  42. System.out.println("权限拦截器的消息:"+"放行");
  43. request.setCharacterEncoding("UTF-8");
  44. chain.doFilter(request, response);
  45. }
  46. }
  47. @Override
  48. public void init(FilterConfig config) throws ServletException {
  49. this.config=config;
  50. }
  51. }

6、然后在web.xml中来配置过滤器(这里也可以直接 用注解的方式 来配置,具体看上面的例子)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <welcome-file-list>
  7. <welcome-file>Login.html</welcome-file>
  8. <welcome-file>Login.htm</welcome-file>
  9. <welcome-file>Login.jsp</welcome-file>
  10. </welcome-file-list>
  11. <!-- 权限拦截器 -->
  12. <filter>
  13. <filter-name>AuthorityFilter</filter-name>
  14. <filter-class>com.mucfc.AuthorityFilter</filter-class>
  15. <init-param>
  16. <param-name>encoding</param-name>
  17. <param-value>GBK</param-value>
  18. </init-param>
  19. <init-param>
  20. <param-name>loginPage</param-name>
  21. <param-value>/Login.jsp</param-value>
  22. </init-param>
  23. <init-param>
  24. <param-name>afterLogin</param-name>
  25. <param-value>/Main.jsp</param-value>
  26. </init-param>
  27. </filter>
  28. <filter-mapping>
  29. <filter-name>AuthorityFilter</filter-name>
  30. <url-pattern>/Main.jsp</url-pattern>
  31. </filter-mapping>
  32. </web-app>

7、下面就是直接启动了,输入http://localhost:8080/ServletLearningChapter2_2/

然后什么都不输入,直接点击登录,发现又跳转到Login.jsp

浏览器中直接输入http://localhost:8080/ServletLearningChapter2_2/Main.jsp,它又会自动跳转到Login.jsp

然后输入一个用户名和密码,就可以正确跳转到Main.jsp(这里没做用户名和密码的判断,只做了一个用户判断)

再来看看控制台的输出结果

从控制台的输出结果我们可以知道是正确 的!

servlet之过滤器(转载)的更多相关文章

  1. 面试之servlet、过滤器、监听器

    servlet.过滤器.监听器servlet是Java中WEB请求和响应的容器servlet的运行需要在类似tomcat容器中,一个 Web 应用对应一个 Context 容器,也就是 Servlet ...

  2. Servlet的过滤器Filter

    Servlet 编写过滤器 Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Serv ...

  3. javaWeb中servlet开发——过滤器

    servlet开发--过滤器(filter) servlet有三种,分为简单servlet.过滤器servlet.监听servlet 简单servlet是作为一种程序所必须的开发结构保存的,继承htt ...

  4. 动手学servlet(六) 过滤器和监听器

     过滤器(Filter) 过滤器是在客户端和请求资源之间,起一个过滤的作用,举个例子,比如我们要请求admin文件夹下的index.jsp这个页面,那么我们可以用一个过滤器,判断登录用户是不是管理员 ...

  5. java servlet之过滤器1(解决jsp之间POST方式数据传递乱码)

    首先,看看没有解决乱码的效果,新建两个jsp页面(a.jsp跳转到b.jsp). <form action="b.jsp" method="post"&g ...

  6. Servlet之过滤器

    Servlet的介绍: Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig Filter 程序是一个实 ...

  7. 个人笔记--Servlet之过滤器实现权限拦截

    一.编写一个Java类实现javax.servlet.Filter接口 package cn.edu.sxu.filter; import java.io.IOException; import ja ...

  8. Servlet Filter 过滤器

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

  9. Servlet 笔记-过滤器

    Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet.Servlet 过滤 ...

随机推荐

  1. IOS设计模式学习(6)生成器

    1 前言 有时候,构建某些对象有多种不同方式.如果这些逻辑包含在构建这些对象的类中的单一方法中,构建的逻辑会非常荒唐(例如,针对各种构建需求的一大片嵌套if-else或者switch-case语句). ...

  2. Spring MVC 笔记 —— Spring MVC 文件上传

    文件上传 配置MultipartResolver <bean id="multipartResolver" class="org.springframework.w ...

  3. ASP.NET Zero--11.一个例子(4)商品分类管理-数据检验

    虽然已经可以添加商品分类,但还需进行优化,比如:用户是否输入.输入字符串是否有格式限制等等. 打开添加分类按钮,名称不输入任何字符,直接保存,会发现列表添加一条空记录.在实际项目中,这是不允许出现的事 ...

  4. HostingEnvironment RegisterObject和QueueBackgroundWorkItem

    其实网上关于HostingEnvironment 的RegisterObject和QueueBackgroundWorkItem文章已经很多了,典型是的 QueueBackgroundWorkItem ...

  5. Sql Server 日期格式化

    select CONVERT(date,myDtae,23),ID from myFirstTable; http://www.cnblogs.com/hantianwei/archive/2009/ ...

  6. Idea高级用法

    一.快速打开Action: Ctrl+Shift+A 列表中会列出所有的action,对应于idea的各种操作,例如: 输入backgroud,可以为编辑器设置背景 输入restclient,可以打开 ...

  7. Runloop与autoreleasePool联系

    autoreleasePool自动释放池,ARC模式下,苹果会自动进行内存管理,不需要我们手动去管理内存.这对于苹果开发者来说,省去了很多事情,不用再每天为了内存管理浪费掉宝贵的开发时间.大家都知道, ...

  8. 【LeetCode】31. Next Permutation

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  9. Linux Ubuntu 虛擬機系統自定義桌面分辨率且重啓後保持不變

    我用 VMware Workstation 12 Pro 安裝的 Ubuntu MATE Desktop Environment 1.12.1,發現安裝後沒有需要的分辨率,於是安裝 VMware To ...

  10. bootstrap IE8 相互兼容

    针对 IE8 仍然需要额外引入 Respond.js 文件(由于仍然利用了浏览器对媒体查询(media query)的支持,因此还需要做处理) <html lang="zh-cn&qu ...