5
回答
微信公众号开发要用到Servlet,但被JFinal的filter过滤掉了,如何解决?

背景:

在一个已经用JFinal框架开发的项目中,需要实现微信公众号的功能,参考了微信公众号开发的例子如下:

http://blog.csdn.net/lyq8479/article/details/8944988

创建公众帐号后台接口程序

创建一个Java Web工程,并新建一个能够处理请求的Servlet,命名任意,我在这里将其命名为org.liufeng.course.servlet.CoreServlet,代码如下:

package org.liufeng.course.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.liufeng.course.util.SignUtil;

/**
 * 核心请求处理类
 * 
 * @author liufeng
 * @date 2013-05-18
 */
public class CoreServlet extends HttpServlet {
	private static final long serialVersionUID = 4440739483644821986L;

	/**
	 * 确认请求来自微信服务器
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 微信加密签名
		String signature = request.getParameter("signature");
		// 时间戳
		String timestamp = request.getParameter("timestamp");
		// 随机数
		String nonce = request.getParameter("nonce");
		// 随机字符串
		String echostr = request.getParameter("echostr");

		PrintWriter out = response.getWriter();
		// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
		if (SignUtil.checkSignature(signature, timestamp, nonce)) {
			out.print(echostr);
		}
		out.close();
		out = null;
	}

	/**
	 * 处理微信服务器发来的消息
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO 消息的接收、处理、响应
	}

}



在我们的项目中web.xml配置如下:

<filter>
		<filter-name>jfinal</filter-name>
		<filter-class>com.jfinal.core.JFinalFilter</filter-class>
		<init-param>
			<param-name>configClass</param-name>
			<param-value>com.innfee.core.ApplicationConfig</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>jfinal</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- 微信servlet配置 -->
	<servlet>
		<servlet-name>weixinServlet</servlet-name>
		<servlet-class>com.innfee.app.weixin.WeixinServlet</servlet-class>
	</servlet>
	<!-- url-pattern中配置的/coreServlet用于指定该Servlet的访问路径 -->
	<servlet-mapping>
		<servlet-name>weixinServlet</servlet-name>
		<url-pattern>/weixinServlet</url-pattern>
	</servlet-mapping>



按照以上的配置,微信的servlet被JFinal的filter过滤掉了,请问怎么处理才可以在JFinal框架下完成微信公众号这个Servlet的功能?谢谢!

举报
共有5个答案 最后回答: 4年前

可以用同名 action 代替这个 servlet:

public class WeixinController extends Controller {
  @ActionKey("/weixinServlet")
  public void index() {
    String signature = getPara("signature");
    // 时间戳
    String timestamp = getPara("timestamp");
    // 随机数
    String nonce = getPara("nonce");
    // 随机字符串
    String echostr = getPara("echostr");
    PrintWriter out = getResponse().getWriter();
    // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
    if (SignUtil.checkSignature(signature, timestamp, nonce))
      out.print(echostr);
    out.close();
    renderNull();
  }
}

    也可以使用 JFinal 提供的 UrlSkipHandler 直接跳过这个请求:

public void configHandler(Handlers me) {
  me.add(new UrlSkipHandler("/weixinServlet"));
}
--- 共有 6 条评论 ---
hswlink可行。。非常感谢!!! 4年前 回复
chrishao回复 @fangdongya : post和get仅仅是访问的两种方式而已,老大的那个index,同时都搞定了 4年前 回复
开源爱好者DONG“ 也可以使用 JFinal 提供的 UrlSkipHandler 直接跳过这个请求” 用这种方法可以,简单方便,谢谢 4年前 回复
JFinal回复 @fangdongya : 上面的代码是 WeixinController 与 servlet 无关 4年前 回复
开源爱好者DONGweixinServlet有两个方法,一个是doGet(你把它改成了index()可以),还有一个是doPost的方法,你还未考虑到这个方法。 4年前 回复

引用来自“JFinal”的评论

可以用同名 action 代替这个 servlet:

public class WeixinController extends Controller {
  @ActionKey("/weixinServlet")
  public void index() {
    String signature = getPara("signature");
    // 时间戳
    String timestamp = getPara("timestamp");
    // 随机数
    String nonce = getPara("nonce");
    // 随机字符串
    String echostr = getPara("echostr");
    PrintWriter out = getResponse().getWriter();
    // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
    if (SignUtil.checkSignature(signature, timestamp, nonce))
      out.print(echostr);
    out.close();
    renderNull();
  }
}

    也可以使用 JFinal 提供的 UrlSkipHandler 直接跳过这个请求:

public void configHandler(Handlers me) {
  me.add(new UrlSkipHandler("/weixinServlet"));
}
非常有用~早发现有这个玩意,以后就不用自己写路由了
顶部