Jfinal的filter里怎样进行getRequestDispatcher().forward()?

打雷要下雨LEO 发布于 2013/12/07 09:55
阅读 1K+
收藏 1

@JFinal 您好,想跟您请教个问题:

我使用JFinal框架做项目,其中想要做一个重定向,类似urlwriter,您别着急,OSC关于JFinal的问答我全翻了一遍了,和别人的情况可能不一样。我想将/css/*重定向到/2013/css/*,这里是静态CSS文件,也就是forward到web容器内置的default,我加了一个handle,但是nextHandler.handle(修改过的target, request, response, isHandled);这样一直报404,我又翻了翻源代码:JFinalFilter.java

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse)res;
		request.setCharacterEncoding(encoding);
		
		String target = request.getRequestURI();
		if (contextPathLength != 0)
			target = target.substring(contextPathLength);
		
		boolean[] isHandled = {false};
		try { //应该是这里调用handle
			handler.handle(target, request, response, isHandled);
		}
		catch (Exception e) {
			if (log.isErrorEnabled()) {
				String qs = request.getQueryString();
				log.error(qs == null ? target : target + "?" + qs, e);
			}
		}
		
		if (isHandled[0] == false)  //这里总会执行
			chain.doFilter(request, response);
	}



如果handle里可以使用getRequestDispatcher().forward()就可以重定向了,但是
chain.doFilter(request, response);

这句还是会往后走是不是?有什么办法吗?

昨天开始接触JFinal,不太熟悉,今天从5点就在研究这个问题了,搜了一圈无解

加载中
1
JFinal
JFinal

在你自己的那个 Handler 中添加getRequestDispatcher().forward(),以及如下这行代码:

isHandled[0] = true;
打完收工
打雷要下雨LEO
打雷要下雨LEO
搞定! 谢谢 Jfinal真的很棒
0
如梦技术
如梦技术
为什么不用nginx rewrite下,一行就搞定...
0
打雷要下雨LEO
打雷要下雨LEO
搞定了,分享下代码给别的朋友也许有帮助:

public void handle(String target, HttpServletRequest request,

HttpServletResponse response, boolean[] isHandled) { if (! target.startsWith("/")) target = "/" + target; if ( target.startsWith("/css/") || target.startsWith("/images/") || target.startsWith("/js/") ){ target = "/2013" + target; try { request.getRequestDispatcher(target).forward(request, response); } catch (ServletException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } isHandled[0] = true; } nextHandler.handle(target, request, response, isHandled); }




0
子木007
子木007

@jfinal  不好意思,挖个老帖子请教个问题。

ActionHandler 是最后一个handler,里面设置了  ishandler = true ,  所以 doFilter 通常是走不下去的。所以有几个疑问(目前看的是 2.2版本):

1.  楼上的代码设置 isHandled[0] =true 没有意义, 因为最后一句 nexthandler 自然会走到 ActionHandler 里面。 理解对吗?

2.  jfinal 是希望使用者通过 handler / plugin 接管其他框架才这样设计吗(指的是 web.xml 中只需要注册一个JFilter就可以了? 




子木007
子木007
@jfinal 请教一下 isHandled 的作用。 除非自定义的 handler 中不调用next, 设置true才有作用, 否则起作用的只有 ActionHandler ,而且固定为 true
子木007
子木007
回复 @打雷要下雨LEO : “另外isHandled[0]=true作为参数,下一个Handler就不会处理了” 不是这样吧
打雷要下雨LEO
打雷要下雨LEO
使用filter主要是为了不影响已有的servlet-mapping,一般情况下filter是限于servlet的。另外isHandled[0]=true作为参数,下一个Handler就不会处理了,直到最后又由容器处理。没有对应的servlet容器中有一个default servlet,可以返回静态文件或报错。
返回顶部
顶部