【servlet】Filter常见应用

统一全站字符编码的过滤器

  • 通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题

没配置过滤器:

CharseterEncodingFilter.java

  1. package com.hbsi.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12.   
  13. public class CharseterEncodingFilter implements Filter {  
  14.   
  15.     private FilterConfig config = null;  
  16.     private String defaultCharset = "UTF-8";  
  17.     public void destroy() {  
  18.         // TODO Auto-generated method stub  
  19.   
  20.     }  
  21.   
  22.     public void doFilter(ServletRequest request, ServletResponse response,  
  23.             FilterChain chain) throws IOException, ServletException {  
  24.         // TODO Auto-generated method stub  
  25.         String charset = config.getInitParameter("charset");  
  26.         if(charset==null){  
  27.             charset = defaultCharset;  
  28.         }  
  29.         request.setCharacterEncoding(charset);  
  30.           
  31.         //如果是servlet进行相应设置  
  32.         response.setCharacterEncoding("UTF-8");  
  33.         response.setContentType("text/html;charset="+charset);  
  34.           
  35.         chain.doFilter(request, response);  
  36.     }  
  37.   
  38.     public void init(FilterConfig filterConfig) throws ServletException {  
  39.         // TODO Auto-generated method stub  
  40.         this.config = filterConfig;  
  41.     }  
  42.   
  43. }  

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  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_2_5.xsd">  
  7.     <!--    
  8.     <filter>  
  9.         <filter-name>FilterChain</filter-name>  
  10.         <filter-class>com.hbsi.filter.FilterChain</filter-class>  
  11.     </filter>  
  12.     <filter-mapping>  
  13.         <filter-name>FilterChain</filter-name>  
  14.         <url-pattern>*.jsp</url-pattern>  
  15.     </filter-mapping>  
  16.       
  17.     <filter>  
  18.         <filter-name>FilterDemo1</filter-name>  
  19.         <filter-class>com.hbsi.filter.FilterDemo1</filter-class>  
  20.     </filter>  
  21.     <filter-mapping>  
  22.         <filter-name>FilterDemo1</filter-name>  
  23.         <url-pattern>*.html</url-pattern>  
  24.     </filter-mapping>  
  25.       
  26.     <filter>  
  27.         <filter-name>FilterShengZhou</filter-name>  
  28.         <filter-class>com.hbsi.filter.FilterShengZhou</filter-class>  
  29.         <init-param>  
  30.             <param-name>abc</param-name>  
  31.             <param-value>aaaaa</param-value>  
  32.         </init-param>  
  33.     </filter>  
  34.     <filter-mapping>  
  35.         <filter-name>FilterShengZhou</filter-name>  
  36.         <url-pattern>*.jsp</url-pattern>  
  37.     </filter-mapping>  
  38.     -->  
  39.   
  40.     
  41.   <servlet>  
  42.     <description>This is the description of my J2EE component</description>  
  43.     <display-name>This is the display name of my J2EE component</display-name>  
  44.     <servlet-name>LuanMaServlet</servlet-name>  
  45.     <servlet-class>com.hbsi.servlet.LuanMaServlet</servlet-class>  
  46.   </servlet>  
  47.   
  48.   <servlet-mapping>  
  49.     <servlet-name>LuanMaServlet</servlet-name>  
  50.     <url-pattern>/servlet/luanMa.do</url-pattern>  
  51.   </servlet-mapping>  
  52.       
  53.   <welcome-file-list>  
  54.     <welcome-file>index.jsp</welcome-file>  
  55.   </welcome-file-list>  
  56. </web-app>  

LuanMaServlet.java

  1. package com.hbsi.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. public class LuanMaServlet extends HttpServlet {  
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  13.             throws ServletException, IOException {  
  14.   
  15.         String city = request.getParameter("city");  
  16.         response.getWriter().write(city);  
  17.   
  18.     }  
  19.   
  20.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  21.             throws ServletException, IOException {  
  22.   
  23.         doGet(request, response);  
  24.     }  
  25. }  

luanMa.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'luanMa.jsp' starting page</title>  
  13.       
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  18.     <meta http-equiv="description" content="This is my page">  
  19.     <!-- 
  20.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  21.     -->  
  22.   
  23.   </head>  
  24.     
  25.   <body>  
  26.   <form action="servlet/luanMa.do" method="post">  
  27.      城市:<input type="text" name="city"/>  
  28.      <input type="submit" value="提交"/>  
  29.   </form>  
  30.   </body>  
  31. </html>  


配置过滤器:

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3. <span style="white-space:pre">  </span>xmlns="http://java.sun.com/xml/ns/javaee"   
  4. <span style="white-space:pre">  </span>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5. <span style="white-space:pre">  </span>xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6. <span style="white-space:pre">  </span>http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7. <span style="white-space:pre">  </span><!--    
  8. <span style="white-space:pre">  </span><filter>  
  9. <span style="white-space:pre">      </span><filter-name>FilterChain</filter-name>  
  10. <span style="white-space:pre">      </span><filter-class>com.hbsi.filter.FilterChain</filter-class>  
  11. <span style="white-space:pre">  </span></filter>  
  12. <span style="white-space:pre">  </span><filter-mapping>  
  13. <span style="white-space:pre">      </span><filter-name>FilterChain</filter-name>  
  14. <span style="white-space:pre">      </span><url-pattern>*.jsp</url-pattern>  
  15. <span style="white-space:pre">  </span></filter-mapping>  
  16. <span style="white-space:pre">  </span>  
  17. <span style="white-space:pre">  </span><filter>  
  18. <span style="white-space:pre">      </span><filter-name>FilterDemo1</filter-name>  
  19. <span style="white-space:pre">      </span><filter-class>com.hbsi.filter.FilterDemo1</filter-class>  
  20. <span style="white-space:pre">  </span></filter>  
  21. <span style="white-space:pre">  </span><filter-mapping>  
  22. <span style="white-space:pre">      </span><filter-name>FilterDemo1</filter-name>  
  23. <span style="white-space:pre">      </span><url-pattern>*.html</url-pattern>  
  24. <span style="white-space:pre">  </span></filter-mapping>  
  25. <span style="white-space:pre">  </span>  
  26. <span style="white-space:pre">  </span><filter>  
  27. <span style="white-space:pre">      </span><filter-name>FilterShengZhou</filter-name>  
  28. <span style="white-space:pre">      </span><filter-class>com.hbsi.filter.FilterShengZhou</filter-class>  
  29. <span style="white-space:pre">      </span><init-param>  
  30. <span style="white-space:pre">          </span><param-name>abc</param-name>  
  31. <span style="white-space:pre">          </span><param-value>aaaaa</param-value>  
  32. <span style="white-space:pre">      </span></init-param>  
  33. <span style="white-space:pre">  </span></filter>  
  34. <span style="white-space:pre">  </span><filter-mapping>  
  35. <span style="white-space:pre">      </span><filter-name>FilterShengZhou</filter-name>  
  36. <span style="white-space:pre">      </span><url-pattern>*.jsp</url-pattern>  
  37. <span style="white-space:pre">  </span></filter-mapping>  
  38. <span style="white-space:pre">  </span>-->  
  39. <span style="white-space:pre">  </span><filter>  
  40. <span style="white-space:pre">      </span><filter-name>CharseterEncodingFilter</filter-name>  
  41.     <span style="white-space:pre">    </span><filter-class>com.hbsi.filter.CharseterEncodingFilter</filter-class>  
  42.     <span style="white-space:pre">    </span><init-param>  
  43.     <span style="white-space:pre">        </span><param-name>charset</param-name>  
  44.     <span style="white-space:pre">        </span><param-value>UTF-8</param-value>  
  45. <span style="white-space:pre">      </span></init-param>  
  46. <span style="white-space:pre">  </span></filter>  
  47. <span style="white-space:pre">  </span><filter-mapping>  
  48. <span style="white-space:pre">      </span><filter-name>CharseterEncodingFilter</filter-name>  
  49. <span style="white-space:pre">      </span><url-pattern>*.jsp</url-pattern>  
  50. <span style="white-space:pre">  </span></filter-mapping>  
  51. <span style="white-space:pre">  </span><filter-mapping>  
  52. <span style="white-space:pre">      </span><filter-name>CharseterEncodingFilter</filter-name>  
  53. <span style="white-space:pre">      </span><url-pattern>/servlet/*</url-pattern>  
  54. <span style="white-space:pre">  </span></filter-mapping>  
  55.     
  56.   <servlet>  
  57.     <description>This is the description of my J2EE component</description>  
  58.     <display-name>This is the display name of my J2EE component</display-name>  
  59.     <servlet-name>LuanMaServlet</servlet-name>  
  60.     <servlet-class>com.hbsi.servlet.LuanMaServlet</servlet-class>  
  61.   </servlet>  
  62.   
  63.   
  64.   <servlet-mapping>  
  65.     <servlet-name>LuanMaServlet</servlet-name>  
  66.     <url-pattern>/servlet/luanMa.do</url-pattern>  
  67.   </servlet-mapping>  
  68. <span style="white-space:pre">  </span>  
  69.   <welcome-file-list>  
  70.     <welcome-file>index.jsp</welcome-file>  
  71.   </welcome-file-list>  
  72. </web-app>  




禁止浏览器缓存所有动态页面的过滤器

  • 有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:
    • response.setDateHeader("Expires",-1);
    • response.setHeader("Cache-Control","no-cache"); 
    • response.setHeader("Pragma","no-cache"); 
  • 并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。
  • Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面
  • Cache-Control响应头有两个常用值: 
    • no-cache指浏览器不要缓存当前页面。
    • max-age:xxx指浏览器缓存页面xxx秒。

允许缓存:不编写过滤器

NoCacheFilter.java

  1. package com.hbsi.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. public class NoCacheFilter implements Filter {  
  15.   
  16.     public void destroy() {  
  17.         // TODO Auto-generated method stub  
  18.           
  19.     }  
  20.   
  21.     public void doFilter(ServletRequest request, ServletResponse response,  
  22.             FilterChain chain) throws IOException, ServletException {  
  23.         // TODO Auto-generated method stub  
  24.         HttpServletRequest req = (HttpServletRequest) request;  
  25.         HttpServletResponse resp = (HttpServletResponse) response;  
  26.         resp.setDateHeader("expires",-1);  
  27.         resp.setHeader("Cache-Control""no-cache");  
  28.         resp.setHeader("Pragma""no-cache");  
  29.           
  30.         chain.doFilter(req,resp);  
  31.           
  32.     }  
  33.   
  34.     public void init(FilterConfig filterConfig) throws ServletException {  
  35.         // TODO Auto-generated method stub  
  36.           
  37.     }  
  38. }  

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  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_2_5.xsd">  
  7.     <!--    
  8.     <filter>  
  9.         <filter-name>FilterChain</filter-name>  
  10.         <filter-class>com.hbsi.filter.FilterChain</filter-class>  
  11.     </filter>  
  12.     <filter-mapping>  
  13.         <filter-name>FilterChain</filter-name>  
  14.         <url-pattern>*.jsp</url-pattern>  
  15.     </filter-mapping>  
  16.       
  17.     <filter>  
  18.         <filter-name>FilterDemo1</filter-name>  
  19.         <filter-class>com.hbsi.filter.FilterDemo1</filter-class>  
  20.     </filter>  
  21.     <filter-mapping>  
  22.         <filter-name>FilterDemo1</filter-name>  
  23.         <url-pattern>*.html</url-pattern>  
  24.     </filter-mapping>  
  25.       
  26.     <filter>  
  27.         <filter-name>FilterShengZhou</filter-name>  
  28.         <filter-class>com.hbsi.filter.FilterShengZhou</filter-class>  
  29.         <init-param>  
  30.             <param-name>abc</param-name>  
  31.             <param-value>aaaaa</param-value>  
  32.         </init-param>  
  33.     </filter>  
  34.     <filter-mapping>  
  35.         <filter-name>FilterShengZhou</filter-name>  
  36.         <url-pattern>*.jsp</url-pattern>  
  37.     </filter-mapping>  
  38.     -->  
  39.     <filter>  
  40.         <filter-name>CharseterEncodingFilter</filter-name>  
  41.         <filter-class>com.hbsi.filter.CharseterEncodingFilter</filter-class>  
  42.         <init-param>  
  43.             <param-name>charset</param-name>  
  44.             <param-value>UTF-8</param-value>  
  45.         </init-param>  
  46.     </filter>  
  47.     <filter-mapping>  
  48.         <filter-name>CharseterEncodingFilter</filter-name>  
  49.         <url-pattern>*.jsp</url-pattern>  
  50.     </filter-mapping>  
  51.     <filter-mapping>  
  52.         <filter-name>CharseterEncodingFilter</filter-name>  
  53.         <url-pattern>/servlet/*</url-pattern>  
  54.     </filter-mapping>  
  55.       
  56.     
  57.   <servlet>  
  58.     <description>This is the description of my J2EE component</description>  
  59.     <display-name>This is the display name of my J2EE component</display-name>  
  60.     <servlet-name>LuanMaServlet</servlet-name>  
  61.     <servlet-class>com.hbsi.servlet.LuanMaServlet</servlet-class>  
  62.   </servlet>  
  63.   
  64.   <servlet-mapping>  
  65.     <servlet-name>LuanMaServlet</servlet-name>  
  66.     <url-pattern>/servlet/luanMa.do</url-pattern>  
  67.   </servlet-mapping>  
  68.       
  69.   <welcome-file-list>  
  70.     <welcome-file>index.jsp</welcome-file>  
  71.   </welcome-file-list>  
  72. </web-app>  


访问luanMa.jsp



编写过滤器禁止缓存:

NoCacheFilter.java

  1. package com.hbsi.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. public class NoCacheFilter implements Filter {  
  15.   
  16.     public void destroy() {  
  17.         // TODO Auto-generated method stub  
  18.           
  19.     }  
  20.   
  21.     public void doFilter(ServletRequest request, ServletResponse response,  
  22.             FilterChain chain) throws IOException, ServletException {  
  23.         // TODO Auto-generated method stub  
  24.         HttpServletRequest req = (HttpServletRequest) request;  
  25.         HttpServletResponse resp = (HttpServletResponse) response;  
  26.         resp.setDateHeader("expires",-1);  
  27.         resp.setHeader("Cache-Control""no-cache");  
  28.         resp.setHeader("Pragma""no-cache");  
  29.           
  30.         chain.doFilter(req,resp);  
  31.           
  32.     }  
  33.   
  34.     public void init(FilterConfig filterConfig) throws ServletException {  
  35.         // TODO Auto-generated method stub  
  36.           
  37.     }  
  38. }  

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  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_2_5.xsd">  
  7.     <!--    
  8.     <filter>  
  9.         <filter-name>FilterChain</filter-name>  
  10.         <filter-class>com.hbsi.filter.FilterChain</filter-class>  
  11.     </filter>  
  12.     <filter-mapping>  
  13.         <filter-name>FilterChain</filter-name>  
  14.         <url-pattern>*.jsp</url-pattern>  
  15.     </filter-mapping>  
  16.       
  17.     <filter>  
  18.         <filter-name>FilterDemo1</filter-name>  
  19.         <filter-class>com.hbsi.filter.FilterDemo1</filter-class>  
  20.     </filter>  
  21.     <filter-mapping>  
  22.         <filter-name>FilterDemo1</filter-name>  
  23.         <url-pattern>*.html</url-pattern>  
  24.     </filter-mapping>  
  25.       
  26.     <filter>  
  27.         <filter-name>FilterShengZhou</filter-name>  
  28.         <filter-class>com.hbsi.filter.FilterShengZhou</filter-class>  
  29.         <init-param>  
  30.             <param-name>abc</param-name>  
  31.             <param-value>aaaaa</param-value>  
  32.         </init-param>  
  33.     </filter>  
  34.     <filter-mapping>  
  35.         <filter-name>FilterShengZhou</filter-name>  
  36.         <url-pattern>*.jsp</url-pattern>  
  37.     </filter-mapping>  
  38.     -->  
  39.     <filter>  
  40.         <filter-name>CharseterEncodingFilter</filter-name>  
  41.         <filter-class>com.hbsi.filter.CharseterEncodingFilter</filter-class>  
  42.         <init-param>  
  43.             <param-name>charset</param-name>  
  44.             <param-value>UTF-8</param-value>  
  45.         </init-param>  
  46.     </filter>  
  47.     <filter-mapping>  
  48.         <filter-name>CharseterEncodingFilter</filter-name>  
  49.         <url-pattern>*.jsp</url-pattern>  
  50.     </filter-mapping>  
  51.     <filter-mapping>  
  52.         <filter-name>CharseterEncodingFilter</filter-name>  
  53.         <url-pattern>/servlet/*</url-pattern>  
  54.     </filter-mapping>  
  55.       
  56.     <filter>  
  57.         <filter-name>NoCahceFilter</filter-name>  
  58.         <filter-class>com.hbsi.filter.NoCacheFilter</filter-class>  
  59.     </filter>  
  60.     <filter-mapping>  
  61.         <filter-name>NoCahceFilter</filter-name>  
  62.         <url-pattern>*.jsp</url-pattern>  
  63.     </filter-mapping>  
  64.     <filter-mapping>  
  65.         <filter-name>NoCahceFilter</filter-name>  
  66.         <url-pattern>/servlet/*</url-pattern>  
  67.     </filter-mapping>  
  68.     
  69.   <servlet>  
  70.     <description>This is the description of my J2EE component</description>  
  71.     <display-name>This is the display name of my J2EE component</display-name>  
  72.     <servlet-name>LuanMaServlet</servlet-name>  
  73.     <servlet-class>com.hbsi.servlet.LuanMaServlet</servlet-class>  
  74.   </servlet>  
  75.   
  76.   <servlet-mapping>  
  77.     <servlet-name>LuanMaServlet</servlet-name>  
  78.     <url-pattern>/servlet/luanMa.do</url-pattern>  
  79.   </servlet-mapping>  
  80.       
  81.   <welcome-file-list>  
  82.     <welcome-file>index.jsp</welcome-file>  
  83.   </welcome-file-list>  
  84. </web-app>  


控制浏览器缓存页面中的静态资源的过滤器:

  • 场景:有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。

ExpiresFilter.java

  1. package com.hbsi.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13. //控制浏览器可以缓存js,css,jpg。  
  14. public class ExpiresFilter implements Filter {  
  15.   
  16.     private FilterConfig config;  
  17.     public void destroy() {  
  18.         // TODO Auto-generated method stub  
  19.   
  20.     }  
  21.   
  22.     public void doFilter(ServletRequest request, ServletResponse response,  
  23.             FilterChain chain) throws IOException, ServletException {  
  24.         // TODO Auto-generated method stub  
  25.         HttpServletRequest req = (HttpServletRequest) request;  
  26.         HttpServletResponse resp = (HttpServletResponse) response;  
  27.           
  28.         String uri = req.getRequestURI();  
  29.         if(uri.endsWith(".css")){  
  30.             long time = Integer.parseInt(config.getInitParameter("css"))*1000;  
  31.             resp.setDateHeader("expires",System.currentTimeMillis()+time);  
  32.         }else if(uri.endsWith(".js")){  
  33.             long time = Integer.parseInt(config.getInitParameter("js"))*1000;  
  34.             resp.setDateHeader("expires",System.currentTimeMillis()+time);  
  35.         }else if(uri.endsWith(".jpg")){  
  36.             long time = Integer.parseInt(config.getInitParameter("jpg"))*1000;  
  37.             resp.setDateHeader("expires",System.currentTimeMillis()+time);  
  38.         }  
  39.         chain.doFilter(req, resp);  
  40.     }  
  41.   
  42.     public void init(FilterConfig filterConfig) throws ServletException {  
  43.         // TODO Auto-generated method stub  
  44.         this.config = filterConfig;  
  45.     }  
  46.   
  47. }  


web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  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_2_5.xsd">  
  7.     <!--    
  8.     <filter>  
  9.         <filter-name>FilterChain</filter-name>  
  10.         <filter-class>com.hbsi.filter.FilterChain</filter-class>  
  11.     </filter>  
  12.     <filter-mapping>  
  13.         <filter-name>FilterChain</filter-name>  
  14.         <url-pattern>*.jsp</url-pattern>  
  15.     </filter-mapping>  
  16.       
  17.     <filter>  
  18.         <filter-name>FilterDemo1</filter-name>  
  19.         <filter-class>com.hbsi.filter.FilterDemo1</filter-class>  
  20.     </filter>  
  21.     <filter-mapping>  
  22.         <filter-name>FilterDemo1</filter-name>  
  23.         <url-pattern>*.html</url-pattern>  
  24.     </filter-mapping>  
  25.       
  26.     <filter>  
  27.         <filter-name>FilterShengZhou</filter-name>  
  28.         <filter-class>com.hbsi.filter.FilterShengZhou</filter-class>  
  29.         <init-param>  
  30.             <param-name>abc</param-name>  
  31.             <param-value>aaaaa</param-value>  
  32.         </init-param>  
  33.     </filter>  
  34.     <filter-mapping>  
  35.         <filter-name>FilterShengZhou</filter-name>  
  36.         <url-pattern>*.jsp</url-pattern>  
  37.     </filter-mapping>  
  38.     -->  
  39.     <filter>  
  40.         <filter-name>CharseterEncodingFilter</filter-name>  
  41.         <filter-class>com.hbsi.filter.CharseterEncodingFilter</filter-class>  
  42.         <init-param>  
  43.             <param-name>charset</param-name>  
  44.             <param-value>UTF-8</param-value>  
  45.         </init-param>  
  46.     </filter>  
  47.     <filter-mapping>  
  48.         <filter-name>CharseterEncodingFilter</filter-name>  
  49.         <url-pattern>*.jsp</url-pattern>  
  50.     </filter-mapping>  
  51.     <filter-mapping>  
  52.         <filter-name>CharseterEncodingFilter</filter-name>  
  53.         <url-pattern>/servlet/*</url-pattern>  
  54.     </filter-mapping>  
  55.       
  56.     <filter>  
  57.         <filter-name>NoCahceFilter</filter-name>  
  58.         <filter-class>com.hbsi.filter.NoCacheFilter</filter-class>  
  59.     </filter>  
  60.     <filter-mapping>  
  61.         <filter-name>NoCahceFilter</filter-name>  
  62.         <url-pattern>*.jsp</url-pattern>  
  63.     </filter-mapping>  
  64.     <filter-mapping>  
  65.         <filter-name>NoCahceFilter</filter-name>  
  66.         <url-pattern>/servlet/*</url-pattern>  
  67.     </filter-mapping>  
  68.       
  69.     <filter>  
  70.         <filter-name>ExpiresFilter</filter-name>  
  71.         <filter-class>com.hbsi.filter.ExpiresFilter</filter-class>  
  72.         <init-param>  
  73.             <param-name>css</param-name>  
  74.             <param-value>120</param-value>  
  75.         </init-param>  
  76.         <init-param>  
  77.             <param-name>jpg</param-name>  
  78.             <param-value>120</param-value>  
  79.         </init-param>  
  80.         <init-param>  
  81.             <param-name>js</param-name>  
  82.             <param-value>120</param-value>  
  83.         </init-param>   
  84.     </filter>  
  85.     <filter-mapping>  
  86.         <filter-name>ExpiresFilter</filter-name>  
  87.         <url-pattern>*.css</url-pattern>  
  88.     </filter-mapping>  
  89.     <filter-mapping>  
  90.         <filter-name>ExpiresFilter</filter-name>  
  91.         <url-pattern>*.jpg</url-pattern>  
  92.     </filter-mapping>  
  93.     <filter-mapping>  
  94.         <filter-name>ExpiresFilter</filter-name>  
  95.         <url-pattern>*.js</url-pattern>  
  96.     </filter-mapping>  
  97.     
  98.   <servlet>  
  99.     <description>This is the description of my J2EE component</description>  
  100.     <display-name>This is the display name of my J2EE component</display-name>  
  101.     <servlet-name>LuanMaServlet</servlet-name>  
  102.     <servlet-class>com.hbsi.servlet.LuanMaServlet</servlet-class>  
  103.   </servlet>  
  104.   
  105.   <servlet-mapping>  
  106.     <servlet-name>LuanMaServlet</servlet-name>  
  107.     <url-pattern>/servlet/luanMa.do</url-pattern>  
  108.   </servlet-mapping>  
  109.       
  110.   <welcome-file-list>  
  111.     <welcome-file>index.jsp</welcome-file>  
  112.   </welcome-file-list>  
  113. </web-app>  


expiresFilter.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'expiresFilter.jsp' starting page</title>  
  13.       
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  18.     <meta http-equiv="description" content="This is my page">  
  19.     <!-- 
  20.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  21.     -->  
  22.   
  23.   </head>  
  24.     
  25.   <body>  
  26.     <img src="tu.jpg">  
  27.   </body>  
  28. </html>  



实现用户自动登陆的过滤器

  • 在用户登陆成功后,发送一个名称为user的cookie给客户端,cookie的值为用户名和md5加密后的密码。
  • 编写一个AutoLoginFilter,这个filter检查用户是否带有名称为user的cookie来,如果有,则调用dao查询cookie的用户名和密码是否和数据库匹配,匹配则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆。

login.jsp

建表:


DBUtils连接数据库倒包

c3p0_config.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3.   
  4. <c3p0-config>  
  5.     <default-config>  
  6.         <property name="driverClass">com.mysql.jdbc.Driver</property>  
  7.         <property name="jdbcUrl">jdbc:mysql://localhost:3306/filter</property>  
  8.         <property name="user">root</property>  
  9.         <property name="password">123456</property>  
  10.           
  11.         <property name="acquireIncrement">5</property>  
  12.         <property name="initialPoolSize">10</property>  
  13.         <property name="minPoolSize">5</property>  
  14.         <property name="maxPoolSize">20</property>  
  15.           
  16.           
  17.     </default-config>  
  18.   
  19.     <named-config name="mysql">  
  20.         <property name="driverClass">com.mysql.jdbc.Driver</property>  
  21.         <property name="jdbcUrl">jdbc:mysql://localhost:3306/filter</property>  
  22.         <property name="user">root</property>  
  23.         <property name="password">123456</property>  
  24.         <property name="acquireIncrement">5</property>  
  25.         <property name="initialPoolSize">10</property>  
  26.         <property name="minPoolSize">5</property>  
  27.         <property name="maxPoolSize">20</property>  
  28.     </named-config>  
  29.   
  30. </c3p0-config>  
DBManger.java

  1. package com.hbsi.util;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7.   
  8. import javax.sql.DataSource;  
  9.   
  10. import com.mchange.v2.c3p0.ComboPooledDataSource;  
  11. public class DBManager {  
  12.     private static ComboPooledDataSource ds = null;  
  13.     static{  
  14.         try{  
  15.             //创建连接池           
  16.             ds = new ComboPooledDataSource("mysql");  
  17.         }catch(Exception e){  
  18.             e.printStackTrace();  
  19.         }  
  20.     }  
  21.   
  22.     //获取链接  
  23.     public static DataSource getDataSource(){  
  24.         return ds;  
  25.     }  
  26.   
  27. }  

User.java

  1. package com.hbsi.domain;  
  2.   
  3. public class User {  
  4.     private String username;  
  5.     private String password;  
  6.     public String getPassword() {  
  7.         return password;  
  8.     }  
  9.     public void setPassword(String password) {  
  10.         this.password = password;  
  11.     }  
  12.     public void setUsername(String username) {  
  13.         this.username = username;  
  14.     }  
  15.     public String getUsername() {  
  16.         return username;  
  17.     }  
  18. }  


UserDao.java

  1. package com.hbsi.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.hbsi.domain.User;  
  6.   
  7. public interface UserDao {  
  8.       
  9.     public List<User> getAll();  
  10.       
  11.     public User find(String username,String password);  
  12.       
  13.     public User find(String username);  
  14. }  


UserDaoImpl.java

  1. package com.hbsi.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.commons.dbutils.QueryRunner;  
  6. import org.apache.commons.dbutils.handlers.BeanHandler;  
  7. import org.apache.commons.dbutils.handlers.BeanListHandler;  
  8.   
  9. import com.hbsi.domain.User;  
  10. import com.hbsi.util.DBManager;  
  11.   
  12. public class UserDaoImpl implements UserDao {  
  13.       
  14.     public List<User> getAll(){  
  15.         try{  
  16.             QueryRunner runner = new QueryRunner(DBManager.getDataSource());  
  17.             String sql = "select * from user";  
  18.               
  19.             return (List<User>) runner.query(sql,new BeanListHandler(User.class));  
  20.               
  21.         }catch(Exception e){  
  22.             throw new RuntimeException();  
  23.         }  
  24.     }  
  25.       
  26.     public User find(String username,String password){  
  27.         try{  
  28.             QueryRunner runner = new QueryRunner(DBManager.getDataSource());  
  29.               
  30.             String sql = "select * from user where username=? and password=?";  
  31.             Object[] params = {username,password};  
  32.               
  33.             return (User) runner.query(sql, params, new BeanHandler(User.class));  
  34.               
  35.         }catch(Exception e){  
  36.             e.printStackTrace();  
  37.             throw new RuntimeException(e);  
  38.         }  
  39.     }  
  40.       
  41.     public User find(String username){  
  42.         try{  
  43.             QueryRunner runner = new QueryRunner(DBManager.getDataSource());  
  44.               
  45.             String sql = "select * from user where username=?";  
  46.               
  47.               
  48.             return (User) runner.query(sql, username, new BeanHandler(User.class));  
  49.               
  50.         }catch(Exception e){  
  51.             throw new RuntimeException();  
  52.         }  
  53.     }  
  54.   
  55. }  


LoginServlet.java

  1. package com.hbsi.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import java.security.MessageDigest;  
  6. import java.security.NoSuchAlgorithmException;  
  7.   
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.http.Cookie;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. import sun.misc.BASE64Encoder;  
  15.   
  16. import com.hbsi.dao.UserDao;  
  17. import com.hbsi.dao.UserDaoImpl;  
  18. import com.hbsi.domain.User;  
  19.   
  20. public class LoginServlet extends HttpServlet {  
  21.   
  22.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  23.             throws ServletException, IOException {  
  24.           
  25.         String username = request.getParameter("username");  
  26.         String password = request.getParameter("password");  
  27.         int autoLoginTime =Integer.parseInt(request.getParameter("autoLoginTime"));  
  28.           
  29.         UserDao dao = new UserDaoImpl();  
  30.         User user = dao.find(username, password);  
  31.           
  32.         if(user != null){  
  33.             //放到session域  
  34.             request.getSession().setAttribute("user",user);  
  35.   
  36.             Cookie cookie1 = new Cookie("username",user.getUsername());  
  37.             Cookie cookie2 = new Cookie("password",user.getPassword());  
  38.               
  39.             cookie1.setMaxAge(autoLoginTime);  
  40.             cookie2.setMaxAge(autoLoginTime);  
  41.               
  42.             cookie1.setPath("/Filter");  
  43.             cookie2.setPath("/Filter");  
  44.               
  45.             response.addCookie(cookie1);  
  46.             response.addCookie(cookie2);  
  47.               
  48.             //重定向  
  49.             response.sendRedirect("../ChangJianYingYong/welcome.jsp");  
  50.               
  51.         }else{  
  52.             request.setAttribute("message","用户名密码错");  
  53.             request.getRequestDispatcher("../ChangJianYingYong/message.jsp").forward(request, response);  
  54.         }  
  55.           
  56.     }  
  57.       
  58.     private String md5(String input){  
  59.         try {  
  60.             MessageDigest md = MessageDigest.getInstance("md5");  
  61.             byte[] result = md.digest(input.getBytes());  
  62.             BASE64Encoder encoder = new BASE64Encoder();  
  63.             return encoder.encode(result);  
  64.         } catch (NoSuchAlgorithmException e) {  
  65.             e.printStackTrace();  
  66.             throw new RuntimeException(e);  
  67.         }  
  68.           
  69.     }  
  70.       
  71.   
  72.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  73.             throws ServletException, IOException {  
  74.   
  75.         doGet(request, response);  
  76.     }  
  77.   
  78. }  


AutoLoginFilter.java

  1. package com.hbsi.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.Cookie;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14.   
  15. import com.hbsi.dao.UserDao;  
  16. import com.hbsi.dao.UserDaoImpl;  
  17. import com.hbsi.domain.User;  
  18.   
  19. public class AutoLoginFilter implements Filter {  
  20.   
  21.     public void destroy() {  
  22.         // TODO Auto-generated method stub  
  23.           
  24.     }  
  25.   
  26.     public void doFilter(ServletRequest request, ServletResponse response,  
  27.             FilterChain chain) throws IOException, ServletException {  
  28.         // TODO Auto-generated method stub  
  29.         HttpServletRequest req = (HttpServletRequest) request;  
  30.         HttpServletResponse resp = (HttpServletResponse) response;  
  31.           
  32.         //1.检查用户是否登录  
  33.         User user = (User) req.getSession().getAttribute("user");  
  34.         if(user!=null){  
  35.             chain.doFilter(req,resp);  
  36.             return;  
  37.         }  
  38.           
  39.         //2.检查用户是否带cookie来  
  40.         String username = null;  
  41.         String password = null;  
  42.         Cookie[] cookies = req.getCookies();  
  43.         for(int i=0;cookies!=null && i<cookies.length;i++){  
  44.             if(cookies[i].getName().equals("username")){  
  45.                 username = cookies[i].getValue();  
  46.             }  
  47.             if(cookies[i].getName().equals("password")){  
  48.                 password = cookies[i].getValue();  
  49.             }  
  50.         }  
  51.         if(username==null && password==null){  
  52.             chain.doFilter(req, resp);  
  53.             return;  
  54.         }  
  55.           
  56.         UserDao dao = new UserDaoImpl();  
  57.         User user1 = dao.find(username);  
  58.         String save_password = user1.getPassword();  
  59.         if(!password.equals(save_password)){  
  60.             chain.doFilter(req, resp);  
  61.             return;  
  62.         }  
  63.         req.getSession().setAttribute("user",user1);  
  64.         chain.doFilter(req, resp);  
  65.     }  
  66.   
  67.     public void init(FilterConfig filterConfig) throws ServletException {  
  68.         // TODO Auto-generated method stub  
  69.           
  70.     }  
  71.   
  72. }  

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  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_2_5.xsd">  
  7.     <!--    
  8.     <filter>  
  9.         <filter-name>FilterChain</filter-name>  
  10.         <filter-class>com.hbsi.filter.FilterChain</filter-class>  
  11.     </filter>  
  12.     <filter-mapping>  
  13.         <filter-name>FilterChain</filter-name>  
  14.         <url-pattern>*.jsp</url-pattern>  
  15.     </filter-mapping>  
  16.       
  17.     <filter>  
  18.         <filter-name>FilterDemo1</filter-name>  
  19.         <filter-class>com.hbsi.filter.FilterDemo1</filter-class>  
  20.     </filter>  
  21.     <filter-mapping>  
  22.         <filter-name>FilterDemo1</filter-name>  
  23.         <url-pattern>*.html</url-pattern>  
  24.     </filter-mapping>  
  25.       
  26.     <filter>  
  27.         <filter-name>FilterShengZhou</filter-name>  
  28.         <filter-class>com.hbsi.filter.FilterShengZhou</filter-class>  
  29.         <init-param>  
  30.             <param-name>abc</param-name>  
  31.             <param-value>aaaaa</param-value>  
  32.         </init-param>  
  33.     </filter>  
  34.     <filter-mapping>  
  35.         <filter-name>FilterShengZhou</filter-name>  
  36.         <url-pattern>*.jsp</url-pattern>  
  37.     </filter-mapping>  
  38.     -->  
  39.     <filter>  
  40.         <filter-name>CharseterEncodingFilter</filter-name>  
  41.         <filter-class>com.hbsi.filter.CharseterEncodingFilter</filter-class>  
  42.         <init-param>  
  43.             <param-name>charset</param-name>  
  44.             <param-value>UTF-8</param-value>  
  45.         </init-param>  
  46.     </filter>  
  47.     <filter-mapping>  
  48.         <filter-name>CharseterEncodingFilter</filter-name>  
  49.         <url-pattern>*.jsp</url-pattern>  
  50.     </filter-mapping>  
  51.     <filter-mapping>  
  52.         <filter-name>CharseterEncodingFilter</filter-name>  
  53.         <url-pattern>/servlet/*</url-pattern>  
  54.     </filter-mapping>  
  55.       
  56.     <filter>  
  57.         <filter-name>NoCahceFilter</filter-name>  
  58.         <filter-class>com.hbsi.filter.NoCacheFilter</filter-class>  
  59.     </filter>  
  60.     <filter-mapping>  
  61.         <filter-name>NoCahceFilter</filter-name>  
  62.         <url-pattern>*.jsp</url-pattern>  
  63.     </filter-mapping>  
  64.     <filter-mapping>  
  65.         <filter-name>NoCahceFilter</filter-name>  
  66.         <url-pattern>/servlet/*</url-pattern>  
  67.     </filter-mapping>  
  68.       
  69.     <filter>  
  70.         <filter-name>ExpiresFilter</filter-name>  
  71.         <filter-class>com.hbsi.filter.ExpiresFilter</filter-class>  
  72.         <init-param>  
  73.             <param-name>css</param-name>  
  74.             <param-value>120</param-value>  
  75.         </init-param>  
  76.         <init-param>  
  77.             <param-name>jpg</param-name>  
  78.             <param-value>120</param-value>  
  79.         </init-param>  
  80.         <init-param>  
  81.             <param-name>js</param-name>  
  82.             <param-value>120</param-value>  
  83.         </init-param>   
  84.     </filter>  
  85.     <filter-mapping>  
  86.         <filter-name>ExpiresFilter</filter-name>  
  87.         <url-pattern>*.css</url-pattern>  
  88.     </filter-mapping>  
  89.     <filter-mapping>  
  90.         <filter-name>ExpiresFilter</filter-name>  
  91.         <url-pattern>*.jpg</url-pattern>  
  92.     </filter-mapping>  
  93.     <filter-mapping>  
  94.         <filter-name>ExpiresFilter</filter-name>  
  95.         <url-pattern>*.js</url-pattern>  
  96.     </filter-mapping>  
  97.     
  98.   <servlet>  
  99.     <description>This is the description of my J2EE component</description>  
  100.     <display-name>This is the display name of my J2EE component</display-name>  
  101.     <servlet-name>LuanMaServlet</servlet-name>  
  102.     <servlet-class>com.hbsi.servlet.LuanMaServlet</servlet-class>  
  103.   </servlet>  
  104.   <servlet>  
  105.     <description>This is the description of my J2EE component</description>  
  106.     <display-name>This is the display name of my J2EE component</display-name>  
  107.     <servlet-name>LoginServlet</servlet-name>  
  108.     <servlet-class>com.hbsi.servlet.LoginServlet</servlet-class>  
  109.   </servlet>  
  110.   
  111.   <filter>  
  112.     <filter-name>AutoLoginFilter</filter-name>  
  113.     <filter-class>com.hbsi.filter.AutoLoginFilter</filter-class>  
  114.   </filter>  
  115.   <filter-mapping>  
  116.      <filter-name>AutoLoginFilter</filter-name>  
  117.      <url-pattern>/*</url-pattern>  
  118.        
  119.   </filter-mapping>  
  120.     
  121.   <servlet-mapping>  
  122.     <servlet-name>LuanMaServlet</servlet-name>  
  123.     <url-pattern>/servlet/luanMa.do</url-pattern>  
  124.   </servlet-mapping>  
  125.   <servlet-mapping>  
  126.     <servlet-name>LoginServlet</servlet-name>  
  127.     <url-pattern>/servlet/LoginServlet</url-pattern>  
  128.   </servlet-mapping>  
  129.       
  130.   <welcome-file-list>  
  131.     <welcome-file>index.jsp</welcome-file>  
  132.   </welcome-file-list>  
  133. </web-app>  

welcome.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2.   
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.   <head>     
  6.     <title>My JSP 'welcome.jsp' starting page</title>     
  7.   </head>  
  8.     
  9.   <body>  
  10.     欢迎您:${user.username} <br>  
  11.   </body>  
  12. </html>  


message.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2.   
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.   <head>     
  6.     <title>My JSP 'message.jsp' starting page</title>     
  7.   </head>  
  8.     
  9.   <body>  
  10.    ${message}<br>  
  11.   </body>  
  12. </html>  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值