我写了两个拦截器类,一个是用户是否登录的验证,另一个是用户的权限的验证,代码如下://用户状态拦截器
package com.groobyming.SuperMarket.view;
import java.util.Map;
import com.groobyming.SuperMarket.model.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class UserStateInteceptor extends AbstractInterceptor { @Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
Map<String, Object> session=actionInvocation.getInvocationContext().getSession();
Map request=(Map)actionInvocation.getInvocationContext().get("request");
User user=(User) session.get("userLogined");
System.out.println("进入了状态拦截器");
if(user!=null){

return actionInvocation.invoke();
}else{
session.put("userStateError","<font color=red>您还没有登录</font>");
return Action.LOGIN;
}
}}//用户权限拦截器
package com.groobyming.SuperMarket.view;
import java.util.Map;
import com.groobyming.SuperMarket.model.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class UserRoleInteceptor extends AbstractInterceptor { @Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
Map<String,Object> session=actionInvocation.getInvocationContext().getSession();
User user=(User) session.get("userLogined");
Map request=(Map)actionInvocation.getInvocationContext().get("request");
System.out.println("进入了权限拦截器");
if(user.getRole()==1){


return actionInvocation.invoke();
}else{
session.put("userRoleError","您的权限不够");
return Action.LOGIN;
}

}}//接下来我在用户登录的时候,输入用户名和密码,当用户名和密码正确时,便把该用户存放到session里面, 代码如下:
package com.groobyming.SuperMarket.view;import java.util.Map;import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;import com.groobyming.SuperMarket.DTO.LoginDTO;
import com.groobyming.SuperMarket.biz.UserManager;
import com.groobyming.SuperMarket.model.User;
import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
private Map<String,Object> request;
private Map<String,Object> session;
private Map<String,Object> application;
private LoginDTO loginer; 
private UserManager userManager;
public UserManager getUserManager() {
return userManager;
}
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
          //这里王session里面存user
public String test(){
System.out.println("login.name:"+loginer.getName());
System.out.println("login.password:"+loginer.getPassword());
User user=this.userManager.login(loginer);
session.put("userLogined",user);
return "login_success";

}
public void setRequest(Map<String, Object> request) {
this.request=request;


}
public void setSession(Map<String, Object> session) {
this.session=session;

}
public void setApplication(Map<String, Object> application) {
this.application=application;

}
public void setLoginer(LoginDTO loginer) {

this.loginer = loginer;

}
public LoginDTO getLoginer() {
return loginer;
}

}
//我的struts.xml里面配置如下<!-- 拦截器配置 -->
<interceptors>
<interceptor name="userStateItp" class="com.groobyming.SuperMarket.view.UserStateInteceptor"/>
<interceptor name="userRoleItp" class="com.groobyming.SuperMarket.view.UserRoleInteceptor"/>
<interceptor-stack name="userActionItpStack">
<interceptor-ref name="userStateItp"/>
<interceptor-ref name="userRoleItp"/>
</interceptor-stack>
</interceptors>
<default-action-ref name="default"/>
<global-results>
<result name="login">/login.jsp</result>
</global-results>//Action配置
<action name="user_*" class="userAction" method="{1}">
<result name="success">/success.jsp</result>
<!-- 先配置默认的拦截器 -->
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="userActionItpStack"/>
</action>
<action name="users_*" class="loginAction" method="{1}">
<result name="login_success" type="chain">user_showUserInfo</result>
</action>//大问题
//接着我做了如下的操作,当我登录成功,并且权限通过后,我在此在success.jsp里面写了这样一段代码
<a href="superet/user_showUserInfo">也就是再次请求那个UserAction,此时拦截器里面却不能读出user了,为Null我和费解!!!,我在spring里面也管理了action,设置了scope为singleton 

解决方案 »

  1.   

    要取出session里的东西 必须session有内容!
      

  2.   

    是不是因为你跳到别的页面的时候session里面已经没有user了?你应该在跳转时要setSession(user)吧
      

  3.   

    为什么页面跳转的时候也要setSession? 既然是同一次会话,我想应该是共用一个session,那么session里面的值应该是在所有action里面都是有效的(能一次传入,多次读出)
    我也是刚用strut2 ,不明白strut2里面的session作用域难道和strut1有所不同?
      

  4.   

    肯定不是那里问题,你把错误信息发出来看看,而且看你的代码 很多不懂:
    比如:Map request=(Map)actionInvocation.getInvocationContext().get("request"); 这段不知道做什么用的。
    <a href="superet/user_showUserInfo">这个好像有问题
      

  5.   

    我刚刚试了下,拦截器都撤销了,做了如下操作
    我在第一次请求actionA的时候把用户对象传入了session,然后在将请求转发到actionB,在请求actionB里面,我通过session.get(xx,xx)获得了放入的用户对象,actionB呈现给我一个视图B.jsp,这时我在B.jsp里面再次请求actionB的时候,就有问题了,居然拿不到用户对象了,也就是在session里面的user已经不存在了~~~  不明白为什么会不存在更简单的举个例子说:
    代码如下:
    public class LoginAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{ 
    private Map <String,Object> request; 
    private Map <String,Object> session; 
    private Map <String,Object> application;  
         public String test(){ 
                                                   System.out.println(session.get("msg"));//打印出msg               
                    session.put("just for test",msg);//往session里面存入msg                return "login_success"; } 
    我每次都请求这个action的test method,按照常理说应该是第一次出现null,然后第二次出现just for test可是却每次都是null,请问是为什么?