论坛首页 入门讨论版 Struts

怎么取出session里的user

浏览 1524 次
该帖已经被评为新手帖
作者 正文
最后更新时间:2008-04-11
我们在处理用户登录的时候:

public class LoginAction extends ActionSupport implements ServletResponseAware, ServletRequestAware, SessionAware{   

    public String login()throws Exception{   
      ...
      User user = new userDao(loginName, password);   
      session.put(USER_SESSION_KEY, user);   
      return SUCCESS;  
      ...
    }
}


登录成功后将user对象写入session。

现在的问题是,其他的action里需要把user对象取出来。

最笨的办法是每个action里都定义user成员对象,execute方法里都写语句从session取出user赋给对象。

我想应该有更好的方法,能统一的设置user对象并调用,用继承或拦截器什么的。

刚接触Java和Struts,没什么经验积累,请各位不吝赐教。
   
最后更新时间:2008-04-11
这肯定要用拦截器实现了,我正在学。。。观望一下。。。
   
0 请登录后投票
最后更新时间:2008-04-11
楼主可以自己定义一个抽象类,里面声明一个user属性,以及setter、getter方法然后

1、通过拦截器给user赋值

2、通过getter方法给user赋值

这样你的所有子类的action 都可以通过getter取到user了。
   
0 请登录后投票
最后更新时间:2008-04-11
filter很不错的选择.
   
0 请登录后投票
最后更新时间:2008-04-11
session只要是一次会话当中都能使用哈.你从session里取出来就可以了样
   
0 请登录后投票
最后更新时间:2008-04-11
1.定义BaseAction,通用的操作都放里面,包括获取User。
2.看你用的好像是webwork,让BaseAction实现user的aware接口可以自动注入。
   
0 请登录后投票
最后更新时间:2008-04-11
如果是关于用户身份和权限的操作工作,

filterServlet是一种选择,可以通过配置Filter链和映射路径达到权限封锁的效果

如果是在struts下的话,我个人以为filterServlet虽然仍然奏效,但是ActionServlet作为总控制器,如果能在其身上想办法,似乎逻辑更加明确。

在Struts中,担任MVC/Model 2控制器角色核心的是ActionServlet,所有的请求都必须先通过它,在Struts 1.1中,有关于请求的处理大部份已交由RequestProcessor,当ActionServlet收到GET或POST的请求,其doGet()或doPost()会呼叫process()方法来处理请求

因此在struts中,扩展RequestProcessor是一种不错的选择
   
0 请登录后投票
最后更新时间:2008-04-12
姜太公 写道
1.定义BaseAction,通用的操作都放里面,包括获取User。
2.看你用的好像是webwork,让BaseAction实现user的aware接口可以自动注入。

我觉得这种方法比较合适,我们用的就是这样
   
0 请登录后投票
最后更新时间:2008-04-14
这个问题基本解决,向大家汇报一下

首先建了个Action的基类

public class AppAction extends ActionSupport {
	public AppUser appUser;
	
	public void setAppUser(AppUser user){
		this.appUser = user;
	}

}


需要获取user的action从这个类继承下来。

然后定义了一个拦截器
public class LoginInterceptor extends AbstractInterceptor {

	
    @Override   
    public String intercept(ActionInvocation invocation) throws Exception {
           
        ActionContext actionContext = invocation.getInvocationContext();
        
        Map session = actionContext.getSession();
        if (session != null && session.get(com.demo.AppUser.USER_SESSION_KEY) != null){
        	Object action = invocation.getAction();
        	//发现是AppAction
        	if( action instanceof AppAction) {
        		AppAction appAction = (AppAction)action;
                        AppUser user = (AppUser)session.get(com.demo.AppUser.USER_SESSION_KEY);
                        appAction.setAppUser(user); //从session取出user对象设置给AppAction实例
        	}
            return invocation.invoke();
        }
        
        return "globalLogin";
    }
}


再定义一个package,所有需要权限拦截器的action用这个

    <!-- 定义含“权限检查拦截器”的包,供其他模块引用 -->
    <package name="struts-default-with-auth-check" extends="struts-default">
        <interceptors>
            
            <!-- 定义“权限检查拦截器” -->
            <interceptor name="authCheck"
                class="com.test.interceptor.LoginInterceptor">
            </interceptor>
            
            <!-- 定义含“权限检查拦截器”的拦截器栈,注意缺省的拦截器栈“defaultStack”要放在前面 -->
            <interceptor-stack name="myStack">
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="authCheck"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        
        <!-- 正式应用可能含很多package,为了能从其他package中跳转到登录页面,把登录页面定义成全局result -->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>

        <global-results>
            <result name="globalLogin">/login.jsp</result>
        </global-results>
    </package>


这个配置是从 http://blog.csdn.net/JavaWinner/archive/2008/03/16/2186778.aspx 这里学习来的
   
0 请登录后投票
最后更新时间:2008-04-18
姜太公 写道
1.定义BaseAction,通用的操作都放里面,包括获取User。
2.看你用的好像是webwork,让BaseAction实现user的aware接口可以自动注入。


他用的明明是struts2嘛
   
0 请登录后投票
论坛首页 入门讨论版 Struts

跳转论坛:
JavaEye推荐