下面简要写一个session拦截器的具体代码实现:
1、java代码实现
会话拦截器代码:
public class SessionInterceptor extends AbstractInterceptor{
Logger log = Logger.getLogger(SessionFilter.class);
@Override
public String intercept(ActionInvocation invoc) throws Exception {
ActionSupport action = (ActionSupport) invoc.getAction();
String ns = invoc.getProxy().getNamespace();
String actionName = invoc.getProxy().getActionName();
String methodName = invoc.getProxy().getMethod();
if(log.isInfoEnabled()){
log.info("执行" + ns + actionName + "的" + methodName + "方法");
}
if(action instanceof SysUserAction){
if("login".equalsIgnoreCase(methodName)){
return invoc.invoke();
}
}
Object obj = invoc.getInvocationContext().getSession().get("user");
if(obj == null){
log.error("用户无效或者Session过期,将返回登录页面");
action.addActionError("用户无效或者Session过期");
return ActionSupport.INPUT;
}else{
return invoc.invoke();
}
}
}
日志拦截器的部分代码:
public String intercept(ActionInvocation invoc) throws Exception {
if (!flag) {
return invoc.invoke();
}
ActionSupport action = (ActionSupport) invoc.getAction();
String ns = invoc.getProxy().getNamespace();
String actionName = action.getClass().getName();
String methodName = invoc.getProxy().getMethod();
long before = System.currentTimeMillis();
log.info("拦截[" + ns + actionName + "]的方法[" + methodName + "]");
try {
SystemLog sysLog = null;
String ret = null;
// 系统登录
if ("login".equalsIgnoreCase(methodName)) {
ret = invoc.invoke();
SysUserAction ba = (SysUserAction) invoc.getAction();
SysUser user = (SysUser) ba.getSession().getAttribute("user");
if (user == null) {
user = new SysUser();
user.setUserName(ba.getLoginname());
sysLog = writeLog(user, LOGIN, 0);
} else {
sysLog = writeLog(user, LOGIN, 1);
}
}
// 系统退出
else if ("logout".equalsIgnoreCase(methodName)) {
SysUserAction ba = (SysUserAction) invoc.getAction();
SysUser user = (SysUser) ba.getSession().getAttribute("user");
ret = invoc.invoke();
if(ba.getSession().getAttribute("user") != null){
sysLog = writeLog(user, LOGOUT, 0);
}else{
sysLog = writeLog(user, LOGOUT, 1);
}
}
sysLog.setWorkInfo(sysLog.getWorkInfo()
+ (sysLog.getWorkState() == 1 ? "成功" : "失败"));
systemLogService.saveLog(sysLog);
long after = System.currentTimeMillis();
log.info("记录日志成功,共耗时为(ms):" + (after - before));
return ret;
} catch (Exception e) {
log.error("记录日志出现异常,异常如下:" + e.getMessage());
e.printStackTrace();
return BaseAction.ERROR;
}
}
2、strut2拦截器的配置
在strut.xml文件中加入如下配置
<interceptors>
<!-- 判断Session有效性的拦截器 -->
<interceptor name="sessionInterceptor"
class="cn.com.core.SessionInterceptor "/>
<!-- 记录日志的拦截器 -->
<interceptor name="logInterceptor"
class="cn.com.xinli.ccp.core.LogInterceptor">
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="sessionInterceptor"/>
</interceptor-stack>
<interceptor-stack name="myLogStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="logInterceptor"/>
</interceptor-stack>
</interceptors>
<!--默认session拦截器对任何action均有效-->
<default-interceptor-ref name="myStack" />
而记录日志的拦截器,我们可以配置让其生效的相应的action对象。所以如下面代码:表示仅仅用户在登录登出的时候才进行日志过滤记录。
<action name="login" class="sysUserAction" method="login">
<interceptor-ref name="myLogStack"></interceptor-ref>
<result>main/manager_index.jsp</result>
</action>
<action name="logout" class="sysUserAction" method="logout">
<interceptor-ref name="myLogStack"></interceptor-ref>
<result type="redirect">index.jsp</result>
</action>