关于handler的问题

@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
		
	if (target.startsWith("/styles")) {
		isHandled[0] = true;
		target = "/app" + target;
	}
	
	next.handle(target, request, response, isHandled);
	
}

想把访问http://127.0.0.1/styles/xx.css

转到

http://127.0.0.1/app/styles/xx.css

修改target好像不起做用

@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
		
	if (target.startsWith("/styles")) {
		isHandled[0] = true;
		target = "/app" + target;
		try {
		        // 转发
			// request.getRequestDispatcher(target).forward(request, response);
			// 重定向
			response.sendRedirect(target);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	next.handle(target, request, response, isHandled);
	
}

两种方式这样修改都能起作用,请问修改target起什么作用?(jfinal3.2)


评论区

杜福忠

2017-10-09 11:23

可以先看下源码:
package com.jfinal.core;
中 ActionHandler :
public final void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
if (target.indexOf('.') != -1) {
return ;
}

当你的handler (修改过 target ) 调用
next.handle(target, request, response, isHandled);
时, 最终会调到ActionHandler 的 handle ,
而:
if (target.indexOf('.') != -1) {
return ;
}
jfinal不处理静态资源请求 , (上线 目前基本都使用 nginx处理静态资源, 所以请求也不会到达这里)
而容器(tomcat)是不知道你改了target(URL)的 , 自然没有什么反应了
----------------------
而 转发和重定向 , 容器(tomcat)是知道的你要去哪个URL的, 自然就能到达了

软件攻城狮

2017-10-09 16:27

HandlerKit.redirect(target, request, response, isHandled);
这个工具有对重定向进行封装处理了。
if (target.startsWith("/styles")) {
target = "/app" + target;
HandlerKit.redirect(target, request, response, isHandled);
}
这样就可以搞定了,不过这个工具怎么不加转发处理的方法,毕竟重定向需要两次请求。

JFinal

2017-10-10 10:52

@软件攻城狮 只改变 target 就可以,不需要 HanderKit.redirect(url)

软件攻城狮

2017-10-11 23:10

@JFinal 只修改target不会生效,我是用的jetty启动的,然后又试了tomcat,都一样不会生效,是不是缺少什么配置?

JFinal

2017-10-12 00:15

@软件攻城狮 jfinal 自己在 com.jfinal.ext.handler 中的 Handler 都是这么来用的,极其好用,单步调试一下找出原因

软件攻城狮

2017-10-12 00:48

http://blog.csdn.net/javazejian/article/details/51192130
这个就是原因了,一个方法不能修改一个基本数据类型的参数(数值型和布尔型)。这也就是为什么isHandled要使用数组对象,修改target在handler调用结束就会被还原了。

软件攻城狮

2017-10-12 00:50

数据的最终获取路径还是原来的target,因为String传递到方法内部被修改,调用结束之后就会被还原成原来的值。

JFinal

2017-10-13 10:25

@软件攻城狮 改变的 target 会对下一个 Handler 起作用:
target = "/path" + target;
next.handle(target, req, res, isHandled);

上面代码第二行的 target 对于 next 这个 Handler 对象来说是有效的

软件攻城狮

2017-10-19 12:32

@JFinal 这个我知道有跟过代码,next.handle方法调用结束,target 就会变成原来的。

热门反馈

扫码入社