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的配置。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你需要在拦截器里判断是不是在登录啊。
你在xml中的action用的通配符,并且在里面添加了拦截器
<interceptor-ref name="authStack"></interceptor-ref>
所以只要符合这个action的请求都要先去执行拦截器,而你请求common_Login_login也符合,所以你登录的时候肯定也会进入这个拦截器
你应该将访问LoginAction的Action单独写出来,里面不写拦截器,这样就不会拦截了
个人愚见,如有误还请指正
你的struts2配置就是拦截所有的,如果不想拦截指定的,需单独配置