需求:通过访问一个action我们可以直接跳转到一个页面,如果跳转到另一个页面之前需要先判断用户的登录状态,就可以考虑使用struts2的拦截器来实现(过滤器也可以实现)
过滤器与struts2拦截器的区别
过滤器理论上可以过滤任何内容,比如html,jsp,servlet,图片路径,action等等,拦截器只能用来拦截action
1.首先自定义一个拦截器类
package intercept;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import entity.User;
public class LoginIntercepor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");
if(user != null) {
return invocation.invoke();
} else {
return "loginFailed";
}
}
}
2.然后在struts.xml中进行配置
<package name="demo1" namespace="/" extends="struts-default">
<!-- 声明自定义的拦截器 -->
<interceptors>
<interceptor name="loginInterceptor" class="intercept.LoginIntercepor"></interceptor>
</interceptors>
<action name="user_*" class="action.UserAction" method="{1}">
<!-- 使用自定义的拦截器 -->
<interceptor-ref name="loginInterceptor">
<!-- 配置不需要拦截的方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<!-- 使用默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="loginSuccess">/loginSuccess.jsp</result>
<result name="loginFailed">/login.jsp</result>
<result name="index">/index.jsp</result>
</action>
</package>
这样当访问需要拦截的action时,就会在执行action中的方法之前先执行拦截器的代码,来判断用户是否登陆
(1)访问登录的action方法时,拦截器不会拦截,因为在配置中
<param name="excludeMethods">login</param>
此方法被忽略
(2)访问其他的action方法,拦截器执行,根据当前session中是否存在用户进行不同的处理逻辑。return invocation.invoke();
表示去执行action中的方法,return "loginFailed";
表示将跳转到配置中loginFailed所对应的页面去。
附:UserAction中的代码
package action;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import entity.User;
public class UserAction extends ActionSupport {
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 login() {
if("admin".equals(username) && "123456".equals(password)) {
User user = new User();
user.setUsername(username);
user.setPassword(password);
ServletActionContext.getRequest().getSession().setAttribute("user", user);
return "loginSuccess";
}
return "loginFailed";
}
public String index() {
return "index";
}
}