java - struts拦截器连登录界面也一起拦截了,无法登录
迷茫
迷茫 2017-04-18 10:27:48
[Java讨论组]

1.最近在学习struts2的拦截器。配置了一个登陆的拦截器。可是在输入登录信息后,打断点发现,直接进入拦截器,未先进入相应的Action中将登录信息保存在session中,导致拦截器一直给跳转到登录页。
拦截器配置如下:

public class AuthInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation actionInvocation) throws Exception{
    //1.获取访问的url
    String url = actionInvocation.getProxy().getActionName();
    //2.从session中获取相应的登录用户和是否是管理员
    String username = (String) ActionContext.getContext().getSession().get("loginUser");
    Boolean isAmin = (Boolean) ActionContext.getContext().getSession().get("isAdmin");
    //3.根据地址判断是否已经可以授权访问
    if(url.startsWith("admin_")){
        if(username == null || "".equals(username.trim())){
            return "loginInput";
        }
        if(isAmin == null || !isAmin){
            return "error";
        }
    }else{
        if(username == null || "".equals(username.trim())){
            return "loginInput";
        }
    }
    return actionInvocation.invoke();
    }
   }
   

struts.xml配置如下:







    
        

        
        
        
            
            
        
    
    
    
        /WEB-INF/inc/error.jsp
        /WEB-INF/Login/input.jsp
    
    
        
        /WEB-INF/{2}/{3}.jsp
        ${url}
    



LoginAction如下:

 package com.van.action;

 import com.opensymphony.xwork2.ActionContext;
public class LoginAction {
private String username;
private String password;

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String input(){
    return "success";
}

public String login(){
    //获取session的第一种方法
    if(username.equals("admin")){
        ActionContext.getContext().getSession().put("iaAdmin",true);
    }
    ActionContext.getContext().getSession().put("loginUser",username);
    ActionContext.getContext().put("url","/WEB-INF/user_Article_add");
    return "redirect";
}

public String logout(){
    ActionContext.getContext().getSession().clear();
    ActionContext.getContext().put("url","/WEB-INF/common_Login_input");
    return "redirect";
}

}
地址栏输入信息如下:
http://localhost:8080/sturts/...


点提交后,断点显示直接进入拦截器中,未先进入LoginAction的login方法进行session的配置。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
PHPz

你需要在拦截器里判断是不是在登录啊。

阿神


你在xml中的action用的通配符,并且在里面添加了拦截器
<interceptor-ref name="authStack"></interceptor-ref>
所以只要符合这个action的请求都要先去执行拦截器,而你请求common_Login_login也符合,所以你登录的时候肯定也会进入这个拦截器
你应该将访问LoginAction的Action单独写出来,里面不写拦截器,这样就不会拦截了
个人愚见,如有误还请指正

伊谢尔伦

你的struts2配置就是拦截所有的,如果不想拦截指定的,需单独配置

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号