NutzCN Logo
问答 nutzboot 过滤器未执行 是哪里配置错了吗
发布于 64天前 作者 Hamming 124 次浏览 复制 上一个帖子 下一个帖子
标签:

onPreHandle 方法未执行 继承shiro的PathMatchingFilter
是哪里配置错了吗

package io.nutz.nutzsite.common.starter;

import io.nutz.nutzsite.common.bean.OnlineSession;
import io.nutz.nutzsite.common.constant.ShiroConstants;
import io.nutz.nutzsite.common.shiro.session.OnlineSessionDAO;
import io.nutz.nutzsite.common.utils.ShiroUtils;
import org.apache.shiro.web.filter.PathMatchingFilter;
import org.apache.shiro.web.mgt.WebSecurityManager;
import org.nutz.boot.starter.WebFilterFace;
import org.nutz.ioc.Ioc;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;

import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;

/**
 * 同步Session数据到Db
 *
 * @author haimming
 */
@IocBean
public class SyncOnlineSessionFilter extends PathMatchingFilter implements WebFilterFace {

    @Inject
    private WebSecurityManager webSecurityManager;

    @Inject
    private OnlineSessionDAO onlineSessionDAO;

    @Override
    public String getName() {
        return "syncOnlineSessionFilter";
    }

    @Override
    public String getPathSpec() {
        return "/*";
    }
    /**
     * 需要支持哪些请求方式
     *
     * @return 请求方式列表
     */
    @Override
    public EnumSet<DispatcherType> getDispatches() {
        return EnumSet.of( DispatcherType.FORWARD,
                DispatcherType.INCLUDE,
                DispatcherType.REQUEST,
                DispatcherType.ASYNC,
                DispatcherType.ERROR);
    }

    @Override
    public Filter getFilter() {
        return this;
    }

    @Override
    public Map<String, String> getInitParameters() {
        return new HashMap<String, String>();
    }

    @Override
    public int getOrder() {
        return 0;
    }

    /**
     * 同步会话数据到DB 一次请求最多同步一次 防止过多处理 需要放到Shiro过滤器之前
     */
    @Override
    protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
//        ShiroUtils.getSession();
        OnlineSession session = (OnlineSession) request.getAttribute("sid");
//        webSecurityManager.
        // 如果session stop了 也不同步
        // session停止时间,如果stopTimestamp不为null,则代表已停止
        if (session != null && session.getUserId() != null && session.getStopTimestamp() == null) {
            onlineSessionDAO.syncToDb(session);
        }
        return true;
    }
}

8 回复

日志里面显示这个对象初始化了吗?

感谢回复 日志有加载

[INFO ] 16:29:04.758 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'syncOnlineSessionFilter                 ' - io.nutz.nutzsite.common.starter.SyncOnlineSessionFilter
[INFO ] 16:29:04.760 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'whaleFilterStarter                      ' - io.nutz.nutzsite.common.starter.WhaleFilterStarter
[DEBUG] 16:29:04.769 org.nutz.ioc.loader.annotation.AnnotationIocLoader.handleIocBeanMethod(AnnotationIocLoader.java:280) - Found @IocBean method : WhaleFilterStarter.createNutFilter(...) define as name=whaleFilter
[INFO ] 16:29:04.770 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'testJob                                 ' - io.nutz.nutzsite.common.quartz.job.TestJob
[INFO ] 16:29:04.771 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'weixinToken                             ' - io.nutz.nutzsite.common.quartz.job.WeixinToken
[INFO ] 16:29:04.772 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'permissionService                       ' - io.nutz.nutzsite.common.service.PermissionService
[INFO ] 16:29:04.772 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'ehcacheCacheManager                     ' - io.nutz.nutzsite.common.shiro.cache.EhcacheCacheManager
[INFO ] 16:29:04.776 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'shiroRealm                              ' - io.nutz.nutzsite.common.shiro.SimpleAuthorizingRealm
[INFO ] 16:29:04.788 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'onlineSessionFactory                    ' - io.nutz.nutzsite.common.shiro.session.OnlineSessionFactory
[INFO ] 16:29:04.789 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'cacheSessionDAO                         ' - io.nutz.nutzsite.common.shiro.session.CacheSessionDAO
[INFO ] 16:29:04.791 org.nutz.ioc.loader.annotation.AnnotationIocLoader.addClass(AnnotationIocLoader.java:103) -    > add 'onlineSessionDAO                        ' - io.nutz.nutzsite.common.shiro.session.OnlineSessionDAO
[DEBUG] 16:29:04.802 org.nutz.ioc.loader.combo.ComboIocLoader.createIocLoader(ComboIocLoader.java:116) - found slog -- org.nutz.plugins.slog.SlogIocLoader

getOrder的问题吧

改成3 还是不行

    @Override
    public int getOrder() {
        return 3;
    }

先确定一下, getOrder是否被调用到了

filter/servlet的注册逻辑在 org.nutz.boot.starter.servlet3.NbServletContextListener.contextInitialized(ServletContextEvent)

getOrder被调用到了
打断点 试了 顺序 调整到了60 还是没有执行 是不是shiro 哪里要配置 才会执行这个监听器PathMatchingFilter

    @Override
    public int getOrder() {
        return 60;
    }

没进doFilter方法?

来自炫酷的 NutzCN

添加回复
请先登陆
回到顶部