struts2登录超时拦截器个人总结
程序员文章站
2022-05-28 16:45:28
...
问题域::登录用户长时间没有与服务器交互,再次操作提示:超时,请重新登录。
解决思路::session超时时间设置、struts拦截器拦截交互操作
具体实现
使用web.xml配置进行session超时时间设置
<session-config>
<session-timeout>10</session-timeout>
</session-config>
struts拦截器代码实现
public class SessionIterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
ActionContext ctx = ActionContext.getContext();
Map session = ctx.getSession();
Action action = null;
// 之所以写这步是因为:有些action继承ActionSupport、有些Action继承BaseAction
if (actionInvocation.getAction() instanceof Action)
action = (Action) actionInvocation.getAction();
if (action instanceof LoginAction) {
return actionInvocation.invoke();
}
Operator operator = (Operator) session.get("OPERATOR_SESSION");
if (operator == null) {
HttpServletRequest request = (HttpServletRequest) actionInvocation
.getInvocationContext().get(
ServletActionContext.HTTP_REQUEST);
request.setAttribute("timeoutMSG", "超时,请重新登录");
return "timeoutSession";
} else {
return actionInvocation.invoke();
}
}
}
页面捕获传递的提示信息
<%@taglib prefix="s" uri="/struts-tags"%>
<s:property value="#attr.timeoutMSG" /><br/>
struts.xml中的配置
<package name="myInterceptor" extends="json-default"> <interceptors> <!-- 超时拦截器 --> <interceptor name="timeoutSession" class="com.sunyard.ices.web.interceptors.SessionIterceptor"></interceptor> <!-- 拦截器栈 --> <interceptor-stack name="timeoutStack"> <interceptor-ref name="timeoutSession"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 配置默认的拦截器 --> <default-interceptor-ref name="timeoutStack" /> <!-- 全局的非登录操作拦截重定向到登录的页面 --> <global-results> <result name="timeoutSession">/login.jsp</result> </global-results> </package>
以为使用了大量include,所以专门配置一个package。在其他struts配置文件中就只需要继承此package就可使用了。
<package name="operatora" extends="myInterceptor">
至此,问题已解决。初学者,第一次写博文,为了加强记忆,也方便初学者。
转载于:https://blog.51cto.com/6300646/1288570
上一篇: Struts2拦截器简单实例
下一篇: Struts2拦截器实例——登录校验