8.4.2 只允许微信浏览器访问
如果我们要限制公众账号里的某些Web资源只能通过微信浏览器访问,就需要使用Java中的过滤器来实现。过滤器的实现代码如下:
- package org.liufeng.course.servlet;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * 过滤器(限制只有微信浏览器能访问)
- *
- * @author liufeng
- * @date 2013-10-24
- */
- public class BrowserFilter implements Filter {
- @Override
- public void destroy() {
- }
- @Override
- public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest) req;
- String userAgent = request.getHeader("User-Agent");
- // 微信内置浏览器
- if (userAgent.contains("MicroMessenger"))
- chain.doFilter(req, resp);
- // 其他浏览器
- else {
- HttpServletResponse response = (HttpServletResponse) resp;
- response.setCharacterEncoding("gb2312");
- // 输出提示
- PrintWriter out = response.getWriter();
- out.write("请使用微信浏览器访问!");
- out.close();
- }
- }
- @Override
- public void init(FilterConfig arg0) throws ServletException {
- }
- }
过滤器类的核心是doFilter()方法,用于对客户端请求进行过滤。首先获取到客户端浏览器的User Agent,然后判断是不是微信浏览器,如果是就继续往下走(允许访问被保护的资源),如果不是将会在页面显示提示“请使用微信浏览器访问!”。
BrowserFilter类编写完成后,还需要在项目的web.xml中添加如下代码:
- <filter>
- <filter-name>browserFilter</filter-name>
- <filter-class>
- org.liufeng.course.servlet.BrowserFilter
- </filter-class>
- </filter>
- <!-- 限制只有微信浏览器才能访问HTML、PNG和JPG -->
- <filter-mapping>
- <filter-name>browserFilter</filter-name>
- <url-pattern>*.html</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>browserFilter</filter-name>
- <url-pattern>*.png</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>browserFilter</filter-name>
- <url-pattern>*.jpg</url-pattern>
- </filter-mapping>
上面这段代码的作用是设置过滤器类BrowserFilter的作用范围,也就是只保护HTML、PNG和JPG三种资源。当客户端访问这些资源时,请求会先经过BrowserFilter类的doFilter()方法,该方法通过判断浏览器类型决定是否允许访问。