登录拦截器,主页都出来了才被拦截

    public void intercept(Invocation inv) {

        Controller controller = inv.getController();

        String sessionId = controller.getCookie("LoginUserCache");

        if (StringUtils.isBlank(sessionId)) {

            // controller.redirect("/login/login.html");

            // controller.renderText("<script language='javascript'>window.top.location.href='" + "/login/login.html" + "'</script>");

        } else {

            Record user = controller.getSessionAttr(sessionId);

            System.out.println("user: " + user.toString());

            if (user == null) {

                controller.renderText("<script language='javascript'>window.top.location.href='" + "/login/login.html" + "'</script>");

                inv.invoke();//必须要写 要不后面代码不执行 别问我 我不懂 看源码去

            }

        }

    }


评论区

淡定007

2017-10-19 16:54

感觉只有在有数据的时候拦截器才起做用,主页的网页都已经显示出来

淡定007

2017-10-19 16:54

compile group: 'com.jfinal', name: 'jfinal', version: '3.2'

JFinal

2017-10-19 16:59

不会的, 所有拦截器与action执行完成以后,render 的动作才被真正执行,这个是确信无疑的,调试一下

当你调用 render 方法时,jfinal 内部仅仅是 new 出来一个 XxxRender 对象,并不会真正调用 XxxRender 中的 render() 方法,只有当拦截器与 controller 的事情完事以后, XxxRender.render() 才真正被执行

淡定007

2017-10-19 17:12

public void configHandler(Handlers me) {
//此方法用来配置JFinal的Handler,如下代码配置了名为ResourceHandler的处理器,Handler可以接管所有 web 请求
me.add(new ContextPathHandler("ctx"));
me.add(new GlobalHandler());
me.add(new HtmlHandler());
}

淡定007

2017-10-19 17:12

我的是没通过render的,
response.setCharacterEncoding("UTF-8");
System.out.println(target);
if (target.endsWith(".html")) {
try {
Map map = new HashMap();
Enumeration pNames = request.getAttributeNames();
while (pNames.hasMoreElements()) {
String name = (String) pNames.nextElement();
Object value = request.getAttribute(name);
//System.out.println(name + " " + value);
map.put(name, value);
}
RenderManager.me().getEngine().getTemplate(target).render(map, response.getWriter());
} catch (IOException e) {
e.printStackTrace();
}
isHandled[0] = true;
} else {
next.handle(target, request, response, isHandled);
}
}

淡定007

2017-10-19 17:13

应该怎么改这个

淡定007

2017-10-19 17:13

@JFinal 我写了这个 麻烦您在给看看

JFinal

2017-10-19 17:17

@淡定007 没通过 render , 那就是当时就向客户端发送数据了, 我前面所说的前提就是用 controller 中的 render 系列的方法

如果你自行通过 response.getWriter() 或者 getOutputStream(), 自然就要求拦截器中的 inv.invoke() 放在前在了

淡定007

2017-10-19 17:21

@JFinal 那我这个函数应该怎么改呢? 我这个函数好像是在拦截器前执行的

淡定007

2017-10-19 18:40

@JFinal 假如我去掉了这个函数 直接用

http://localhost:8080/index/index 能很好的验证登录。
但假如客户打错了 ,打成了带,
html后缀的http://localhost:8080/index/index。html

这时候错误更多了

淡定007

2017-10-19 18:41

@JFinal 为什么框架中 index与index.html 不是相同的东西

淡定007

2017-10-19 18:58

@JFinal 我这段代码就是想不用每个网页都写个action。

淡定007

2017-10-20 09:05

@JFinal 我做的系统基本都是纯html的 我想把拦截器函数写到handle的地方是不是可以?

淡定007

2017-10-20 09:37

@JFinal 先执行了handle在执行的拦截器。

淡定007

2017-10-20 10:05

@JFinal 拦截器好像是只拦截带action的

淡定007

2017-10-20 10:39

@JFinal
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
response.setCharacterEncoding("UTF-8");
System.out.println("handle=" + target);
if (target.endsWith(".html")) {
//----重写下拦截器
if (target.indexOf("/login") != 0) {
String sessionId = CookieUtil.getCookie(request, "LoginUserCache").getValue();
if (StringUtils.isBlank(sessionId)) {
try {
response.sendRedirect("/login/login.html");
return;
} catch (IOException e) {
e.printStackTrace();
}
} else {
Record user = (Record) request.getSession().getAttribute(sessionId);
System.out.println("user: " + user);
if (user == null) {
try {
response.sendRedirect("/login/login.html");
return;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

热门反馈

扫码入社