session过滤器

在web.xml中配置过滤器

 <filter>
        <filter-name>sessionFilter</filter-name>
        <filter-class>com.web.filter.SessionFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>sessionFilter</filter-name>
        <url-pattern>/*</url-pattern>

    </filter-mapping>

sessionFilter:

public class sessionFilterextends OncePerRequestFilter {
    /**
     * 内部过滤器
     *
     * @param request     请求
     * @param response    响应
     * @param filterChain 过滤器链
     * @throws ServletException Serverlet异常
     * @throws IOException      IO异常
     */
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            String uri = request.getRequestURI();
            // 默认转换至主页
            if (uri.endsWith("/")) {
                //登录验证通过
                if (null != AuthUtil.getSessionUserAuth(request)) {
                    response.sendRedirect("home.htm");
                } else {//未登录跳转到登录页
                    response.sendRedirect(request.getRequestURL() + "login.htm");
                }
            } else if (uri.contains("/app/")) {//所有的controller经过时都要检查Cookie及更新redis中的超时时间
                // Cookie处理
                setCookie(request, response);
                //请求继续执行
                filterChain.doFilter(request, response);
            } else {
                filterChain.doFilter(request, response);
            }
        } catch (Exception e) {
            logger.error("PassengerFlowCounting filter error", e);
        }
    }


    /**
     * Cookie处理
     *
     * @param request  请求
     * @param response 响应
     */
    protected void setCookie(HttpServletRequest request, HttpServletResponse response) {
        String cookieValue = CookieUtil.getCookieValue(request, AuthUtil.COOKIEID);
        // 写入Cookie
        if (StringUtils.isEmpty(cookieValue)) {
            cookieValue = CookieUtil.getUuid32();
            CookieUtil.setCookie(request, response, AuthUtil.COOKIEID, cookieValue, -1);
        } else { // 根据cookieValue 查询redis 服务器 ,判断用户是否已经登录
            String sessionValue = RedisUtils.getInstance().get(AuthUtil.SESS_PREFIX + cookieValue);
            UserLoginInfoVO sessionUserAuth = AuthUtil.getSessionUserAuth(request);
            if (null != sessionValue) {
                Gson gson = new Gson();
                //机器间跳转 session为空的情况
                UserLoginInfoVO parseObject = gson.fromJson(sessionValue, UserLoginInfoVO.class);
                //为空 或者 不为空 但是同一浏览器不同用户再登录的情况 --同一用户修改权限后重新登录 不同server不生效的情况
                if (null == sessionUserAuth || (!parseObject.getUsrCd().equals(sessionUserAuth.getUsrCd())) || (parseObject.getCurrentDateTime() > sessionUserAuth.getCurrentDateTime())) {
                    AuthUtil.setSessionAccountAuth(request, parseObject);
                }
                //重新设置session超时时间
                RedisUtils.getInstance().expire(AuthUtil.SESS_PREFIX + cookieValue, AuthUtil.getMaxInactiveInterval(request));
            } else {
                if (null != sessionUserAuth) {
                    //移除本地缓存验证用户
                    AuthUtil.removeSessionUserAuth(request);
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值