需求:有些页面需要先登录才可以访问,如果没有登陆就跳转到login.jsp去登陆
此案例为访问login方法的时候不拦截,只有把user放到session中才可以访问别的方法
web.xml 配置拦截器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
LoginInterceptor 自定义登陆拦截器
public class LoginInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//获取session
Map<String, Object> session = ActionContext.getContext().getSession();
//session中获取user
Object object = session.get("user");
//没登陆
if(object==null) {
return "toLogin";
}else {
//已经登陆 ,放行
return invocation.invoke();
}
}
}
LoginAction 登陆Action
public class LoginAction extends ActionSupport{
public String login() throws Exception {
User user = new User();
user.setName("jack");
user.setPassword("123");
Map<String, Object> session = ActionContext.getContext().getSession();
session.put("user", user);
return "toIndex";
}
public String list() throws Exception {
List<String> arrayList = new ArrayList<>();
arrayList.add("user1");
arrayList.add("user2");
ActionContext.getContext().put("list", arrayList);
return "toSuccess";
}
}
struts.xml 指定login方法不拦截
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="result" namespace="/" extends="struts-default">
<interceptors>
<!-- 1.注册拦截器 -->
<interceptor name="myInterceptor" class="com.it.action.LoginInterceptor"></interceptor>
<!-- 2.注册拦截器栈 -->
<interceptor-stack name="myStack">
<!-- 自定义拦截器引入 -->
<interceptor-ref name="myInterceptor">
<!-- 指定哪些方法不拦截-->
<param name="excludeMethods">login</param>
<!-- 拦截哪些方法 -->
<!-- <param name="includeMethods">print,list</param> -->
</interceptor-ref>
<!-- 默认的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 3.指定默认拦截器 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!-- 定义全局结果集 -->
<global-results>
<result name="toLogin" type="redirect">/login.jsp</result>
</global-results>
<action name="DemoAction1_*" class="com.it.action.LoginAction" method="{1}">
<result name="toIndex" type="dispatcher">/hello.jsp</result>
<result name="toSuccess" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>