8.4.2 只允许微信浏览器访问

如果我们要限制公众账号里的某些Web资源只能通过微信浏览器访问,就需要使用Java中的过滤器来实现。过滤器的实现代码如下:

  1. package org.liufeng.course.servlet;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  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. /**
  15. * 过滤器(限制只有微信浏览器能访问)
  16. *
  17. * @author liufeng
  18. * @date 2013-10-24
  19. */
  20. public class BrowserFilter implements Filter {
  21. @Override
  22. public void destroy() {
  23. }
  24.  
  25. @Override
  26. public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)throws IOException, ServletException {
  27. HttpServletRequest request = (HttpServletRequest) req;
  28. String userAgent = request.getHeader("User-Agent");
  29. // 微信内置浏览器
  30. if (userAgent.contains("MicroMessenger"))
  31. chain.doFilter(req, resp);
  32. // 其他浏览器
  33. else {
  34. HttpServletResponse response = (HttpServletResponse) resp;
  35. response.setCharacterEncoding("gb2312");
  36. // 输出提示
  37. PrintWriter out = response.getWriter();
  38. out.write("请使用微信浏览器访问!");
  39. out.close();
  40. }
  41. }
  42.  
  43. @Override
  44. public void init(FilterConfig arg0) throws ServletException {
  45. }
  46. }

过滤器类的核心是doFilter()方法,用于对客户端请求进行过滤。首先获取到客户端浏览器的User Agent,然后判断是不是微信浏览器,如果是就继续往下走(允许访问被保护的资源),如果不是将会在页面显示提示“请使用微信浏览器访问!”。

BrowserFilter类编写完成后,还需要在项目的web.xml中添加如下代码:

  1. <filter>
  2. <filter-name>browserFilter</filter-name>
  3. <filter-class>
  4. org.liufeng.course.servlet.BrowserFilter
  5. </filter-class>
  6. </filter>
  7. <!-- 限制只有微信浏览器才能访问HTML、PNG和JPG -->
  8. <filter-mapping>
  9. <filter-name>browserFilter</filter-name>
  10. <url-pattern>*.html</url-pattern>
  11. </filter-mapping>
  12. <filter-mapping>
  13. <filter-name>browserFilter</filter-name>
  14. <url-pattern>*.png</url-pattern>
  15. </filter-mapping>
  16. <filter-mapping>
  17. <filter-name>browserFilter</filter-name>
  18. <url-pattern>*.jpg</url-pattern>
  19. </filter-mapping>

上面这段代码的作用是设置过滤器类BrowserFilter的作用范围,也就是只保护HTML、PNG和JPG三种资源。当客户端访问这些资源时,请求会先经过BrowserFilter类的doFilter()方法,该方法通过判断浏览器类型决定是否允许访问。