请教一下Jfinal拦截器中页面跳转

yshumk 发布于 2015/08/10 21:57
阅读 3K+
收藏 0

@Jfinal 您好,最近在尝试使用Jfinal写一个小demo试试手,Jfinal用起来好赞的!感谢!

然而在实现登录验证功能时,我想这样:对登录进行密码校验之后用getSession().setAttribute("isLogin","lalala");存,跳转到展示数据的主页redirect("/main");。

假如用户直接访问/main,我会在其处理的action所绑的第一个拦截器LoginIntercept进行验证“isLogin”的正确性的操作,若null或不是"lalala",则inv.getController().render("login.jsp")、或者inv.getController().redirect("/login"),然而发现都不能跳转到想要的页面,提示:

HTTP ERROR 404

Problem accessing /index.jsp. Reason:

Not Found

Powered by Jetty://;


以及:

八月 10, 2015 9:58:29 下午 org.apache.jasper.servlet.JspServlet serviceJspFile
严重: PWC6117: File "E%3A%5Cworkspace%5Cgreport_car_test%5CWebRoot%5Cindex.jsp" not found

附上相关代码片段:

配置路由:


public void configRoute(Routes me) {
		me.add("/", LoginController.class); // 第三个参数为该Controller的视图存放路径,缺省与第一个参数相同
		
		me.add("/main",OnlineController.class,"/");
		
	}



进localhost默认渲染login.jsp,login.jsp里面会<form id="newForm" method="post" name='newForm' action='/login'>用户密码交由LoginValidator.class校验,校验通过后set参数再 redirect("/main")。



public class LoginController extends Controller {
	public void index() {
		render("login.jsp");
	}
	
	@Before(LoginValidator.class)
	public void login(){
		getSession().setAttribute("isLogin","lalala");
		redirect("/main");
	}

}

这里想交给LoginIntercept校验是否已登录


public class OnlineController extends Controller {
	@Before({LoginIntercept.class,FileExistIntercept.class})
	public void index() {	
	    //乱七八糟的代码略
            render("main.jsp");
	}

然而并不行

public class LoginIntercept implements Interceptor {
	public void intercept(Invocation inv) {
		Controller ctl = inv.getController();
		String isLogin = (String) ctl.getSession().getAttribute("isLogin");
		if(isLogin == null || !isLogin.equals("lalala")){
			System.out.println("wtf!");
			ctl.render("login.jsp");
		}
	}
}



请问是哪里设计有问题还是?

难道是缺了inv.invoke();。。。我去试试。。。


加了else{inv.invoke();}后这层是可以了


但是第二个拦截器那里又有问题了,里面有



String pathname = PathKit.getWebRootPath() + File.separator + "online_history" + File.separator
				+ date + File.separator
				+ hour + ".html";
		File file = new File(pathname);
		if (file.exists()) {//本地有文件时
			try {
				inv.getController().renderHtml(FileUtils.readFileToString(file));
			} catch (IOException e) {
				System.out.println("读取缓存网页数据失败");
				e.printStackTrace();
			}
		} else if(ifGetNewData){//本地没文件则去实时取
			inv.invoke();
		}else{
			inv.getController().renderText("并没有此天的历史记录");
		}



inv.getController().renderHtml(FileUtils.readFileToString(file));这一句,当当地文件不存在时,inv.invoke();去进行OnlineController的index()的后续动作时,正常;但当当地文件存在时,直接inv.getController().renderHtml(FileUtils.readFileToString(file));没法展示,为何呢?
加载中
0
JFinal
JFinal

    大致看上去是因为路由规则的问题,LoginController 的 controllerKey为 "/",其中有一个 index() 以及一个 login() 方法,所以登录表单页是: "/" ,而登录数据提交页面是 "/login",而上面的代码中我看到了一个 redirect("/login"),而在登录逻辑中 redirect 显然是登录成功或失败后要去的地方,而 "/login" 并不是那两个地方。

   另外,楼主可能对于拦截器及控制器的的配合还不是很熟,多试几次就清楚了。

0
yshumk
yshumk

引用来自“JFinal”的评论

    大致看上去是因为路由规则的问题,LoginController 的 controllerKey为 "/",其中有一个 index() 以及一个 login() 方法,所以登录表单页是: "/" ,而登录数据提交页面是 "/login",而上面的代码中我看到了一个 redirect("/login"),而在登录逻辑中 redirect 显然是登录成功或失败后要去的地方,而 "/login" 并不是那两个地方。

   另外,楼主可能对于拦截器及控制器的的配合还不是很熟,多试几次就清楚了。

感谢赐教。其实上面删除线那块我本来是想inv.getController().render("login.jsp")的,后来不行才试过redirect("/")和redirect("/login")的。
昨晚找了半天,其实是我的程序里面有一个地方搞了个定时器,想获取登录后的那个页面的数据,保存在本地,然后其他用户访问时如果本地有最近的快照,则拿那个快照。
一开始我是没登录验证的拦截器的,所以直接请求localhost/main 拿到的数据就是我想要的数据,而后来加了登录校验,我定时器拿的时候被认为是没登录的,拿到的实际上是要求登录的页面的数据,于是乎我正常访问,登录好了,展现出来个快照,快照是登录页面。。。所以我误认为是我跳转那块错了
0
yshumk
yshumk

引用来自“JFinal”的评论

    大致看上去是因为路由规则的问题,LoginController 的 controllerKey为 "/",其中有一个 index() 以及一个 login() 方法,所以登录表单页是: "/" ,而登录数据提交页面是 "/login",而上面的代码中我看到了一个 redirect("/login"),而在登录逻辑中 redirect 显然是登录成功或失败后要去的地方,而 "/login" 并不是那两个地方。

   另外,楼主可能对于拦截器及控制器的的配合还不是很熟,多试几次就清楚了。

另外想请教个问题哦,我看了JFinal 部署在 Tomcat 下推荐方法 ,也是已经在tomcat上可以部署成功,访问正常。但是要求里有个“配置中的 Context 标记的 path 属性一定要设置为 "" 而不是 "/"”,

假设同个tomcat下面要有多个应用,看到评论里面你的回答是:将server.xml 中的 Host 标记复制多份,并列放着,改一下其中的 name 属性为相应的域名即可,例如将第一个的name属性改成 name="abc.com" 第二个改成 name="def.com",那么这两个域名可以分别访问到不同的两个项目

但是如果我是都放在某台服务器上,前面没有nginx之类的,单一个tomcat,对外只有IP,还没绑域名,怎么办呢?

yshumk
yshumk
@JFinal 额,,其实我问的就是只有IP没多域名,同个tomcat咋办。。算了不行我就用tomcat或者嵌入一下完整的jetty试试吧。感谢前辈提供Jfinal这么好的框架,辛苦了
JFinal
JFinal
可以不需要 nginx 就可以,只不过需要通过多域名映身到多个项目
返回顶部
顶部