NutzCN Logo
问答 session.getAttr...()获取不到,但是@Attr获取到了
发布于 2664天前 作者 蛋蛋的忧伤 4216 次浏览 复制 上一个帖子 下一个帖子
标签:

我在过滤器里这么写的:

HttpServletRequest re = actionContext.getRequest();
        HttpSession session = re.getSession();
        String user_id = (String) session.getAttribute("user_name");

然后获取的user_id是null,但是我的入口方法就能获取到,

 public Object userInfo(@Attr("user_name")String user_name){

这里就不为null,很奇怪什么原因呢?

33 回复

在req里面吧

我登录成功后是往session里存的啊...@Attr不是从session取的吗...

先从req取,没有就从session取

但你说是存到session的,是不是过滤器写得有问题,或者放的地方有问题?

我登录成功之后就存到session了

 session.setAttribute("user_name",user.getSys_user_name());

然后我的过滤器是这么写的:

public View match(ActionContext actionContext) {
        HttpServletRequest re = actionContext.getRequest();
        HttpSession session = re.getSession();
        String str = (String) re.getAttribute("user_name");
        String user_id = (String) session.getAttribute("user_name");
        if(user_id == null){
            HttpServletResponse response = actionContext.getResponse();
            try {
                response.sendError(401,"您还没登录!");
                return new VoidView();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

但是就是出现了用@Attr可以访问到的,但是过滤器里就是访问不到的情况,实在困惑...

@At
    @Filters
    public Object userInfo(@Attr("user_name")String user_name,HttpSession session){
        String str = (String) session.getAttribute("user_name");
        System.out.println(str);
        User user = dao.fetch(User.class, Cnd.where(User.SYS_USER_NAME, "=", user_name));
        if(user!=null){
            return new NutMap().setv("code",1).setv("user",user);
        }else{
            return new NutMap().setv("code",0).setv("msg","未登录!");
        }
    }

这个里面可以获取到,但是过滤器里就获取不到

@wendal
userInfo方法里可以获取到session,但是过滤器里就获取为null,这就很愁人了.....

关联源码, debug一下 AllAttrInjector 类

AllAttrInjector 类里的get方法是成功获取到session属性值的,但是我filter里的session.getAttr...是没东西的....

明明应该是有值的,但是filter里就是没值,这还怎么做权限?...

有可能是空格或者不可见字符, 把 "user_name" 定义为一个静态常量吧

@wendal
不行哇,我搞了静态变量,但是依然获取不到啊.....

我这测试阶段要被骂死了啊.....一会好一会不好

大叔请注意,我为了解决安卓那边关闭程序再打开cookie失效问题,我手动添加了一个cookie到本地,然后会不会是这个原因导致的?

  Cookie cookie =new Cookie("JSESSIONID",session.getId());
                cookie.setMaxAge(60*60*24);
                response.addCookie(cookie);

我这么写之后,在@Attr里可以获取到,但是filter里就是null啊.....

话说, 如果Filter取不到值,那就判定为未登陆, 那还怎么会进入入口方法呢??

我这个@Filter了,没有过滤这个入口

就是因为这样,其他过滤掉的都走不了.....

但其实还有session,就是走不了,所以很恼火...

Filter的代码贴来看看

package com.wsd.oa.filter;

import com.wsd.oa.controller.UserController;
import org.nutz.mvc.ActionContext;
import org.nutz.mvc.ActionFilter;
import org.nutz.mvc.View;
import org.nutz.mvc.annotation.Filters;
import org.nutz.mvc.view.VoidView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@Filters
public class CheckSession implements ActionFilter {

    public View match(ActionContext actionContext) {
        HttpServletRequest re = actionContext.getRequest();
        HttpSession session = re.getSession();
        String str = (String) re.getAttribute(UserController.USER_NAME);
        String user_id = (String) session.getAttribute(UserController.USER_NAME);
        if(user_id == null){
            HttpServletResponse response = actionContext.getResponse();
            try {
                response.sendError(401,"您还没登录!");
                return new VoidView();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

}

估计不是同一个session id

 /**
     * 获取用户基本信息
     * @param user_name
     * @return
     */
    @At
    @Filters
    public Object userInfo(@Attr(USER_NAME)String user_name){
//        String str = (String) session.getAttribute("user_name");
//        System.out.println(str);
        User user = dao.fetch(User.class, Cnd.where(User.SYS_USER_NAME, "=", user_name));
        if(user!=null){
            return new NutMap().setv("code",1).setv("user",user);
        }else{
            return new NutMap().setv("code",0).setv("msg","未登录!");
        }
    }

/**
     * 登录
     * @param account 手机号
     * @param pwd 密码
     * @param session
     * @return
     */
    @At
    @Filters()
//    @POST
    public Object login(@Param("account")String account, @Param("pwd")String pwd, HttpSession session,HttpServletResponse response){
        try {
            if(account==null && account.trim().length()<1){
                return new NutMap().setv("code",0).setv("msg","用户名不可为空!");
            }
            if(pwd==null && pwd.trim().length()<1){
                return new NutMap().setv("code",0).setv("msg","密码不可为空!");
            }
            String password = DigestUtil.digestStringBase64(pwd, "SHA");    //进行加密比对
            User user = dao.fetch(User.class, Cnd.where(User.SYS_USER_NAME, "=", account).and(User.PWD, "=", password));
            if(user!=null){
                session.setAttribute(USER_NAME,user.getSys_user_name());
                session.setAttribute("emp_no",user.getEmp_no());
                Cookie cookie =new Cookie("JSESSIONID",session.getId());
                cookie.setMaxAge(60*60*24);
                response.addCookie(cookie);

                return new NutMap().setv("code",1).setv("msg","登录成功!");

            }else{
                return new NutMap().setv("code",0).setv("msg","用户名或密码错误!");
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return new NutMap().setv("code",0).setv("msg","未知错误!");
        }
    }

所以你就没有在同一个请求里面验证过, 做个入口方法应用该Filter,然后Filter里面注释掉response.sendError和return new VoidView(), 然后入口方法用@Attr取值.

你之前的验证要么走Filter然后401, 要么直接进入口方法, 没有一起走的

走了,filter里获取不到session,@Attr可以获取到.....

你贴的Filter代码怎么可能走得了?

打印session.getId(),看看filter打印的值与入口方法内的值是否一致

目测不是同一个session对象,一个容器的,一个shiro的?

妈的,不是一个sessionid......我存了本地之后,服务器重启了,然后本地的cookieid还是旧的.....

但是我重新登录之后又重新写了一个cookie到本地啊,难道她不会覆盖原来的吗?????如果不覆盖的话,那我怎么清除呢????

你应该用sessionless的token,脱离这个死循环

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