当前位置:编程学习 > JAVA >>

关于拦截器无效的问题

大家帮忙看看代码,用拦截器做操作日志的存储,就是不管用,根本进不了拦截器。在线等大家帮帮忙吧 --------------------编程问答-------------------- <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.codebehind.pathPrefix" value="/app/" />
<constant name="struts.custom.i18n.resources" value="i18n/messages" />
<constant name= "struts.multipart.maxSize" value="15242880" />
<constant name="struts.action.extension" value="action,,"></constant>

<package name="default-with-exceptions" extends="struts-default" abstract="true">
    <global-results>
<result name="exception-error-page">/app/errors/error.jsp</result>
<result name="input">/app/errors/fieldError.jsp</result>
<result name="invalid.token">/app/errors/repeatSubmit.jsp</result>
</global-results>
    <global-exception-mappings>  
     <exception-mapping result="exception-error-page" exception="java.lang.Exception"></exception-mapping>  
    </global-exception-mappings>
    </package>
 
<package name="default" extends="default-with-exceptions">
<interceptors>
<interceptor name="actionlog" class="com.tinet.bpsc.wm.commons.ActionLogInterceptor" />

<interceptor-stack name="bpscStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="tokenSession">
<param name="includeMethods">save*,add*</param>
</interceptor-ref>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="debugging"/>
                <interceptor-ref name="profiling"/>
                <interceptor-ref name="actionlog"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                  <param name="excludeParams">dojo\..*,^struts\..*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="store">
<param name="operationMode">AUTOMATIC</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>

<default-interceptor-ref name="bpscStack" />

</package>

</struts>
--------------------编程问答-------------------- package com.tinet.bpsc.wm.commons;

import java.lang.reflect.Method;
import java.util.Date;
import java.util.Map;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.util.ValueStack;
import com.tinet.bpsc.wm.commons.util.ContextUtil;
import com.tinet.bpsc.wm.commons.web.ComnAction;
import com.tinet.bpsc.wm.entity.Entity;
import com.tinet.bpsc.wm.entity.LogAction;
import com.tinet.bpsc.wm.inc.Const;
import com.tinet.bpsc.wm.service.LogActionService;


/**
 * 操作日志拦截器。
 *<p>
 * 文件名: ActionLogInterceptor.java
@SuppressWarnings("serial")
public class ActionLogInterceptor extends AbstractInterceptor {

private static Logger logger = LoggerFactory.getLogger(ActionLogInterceptor.class);
private LogActionService logActionService;


@Override
public String intercept(ActionInvocation invocation) throws Exception {
String result = invocation.invoke();

Method method = invocation.getAction().getClass().getMethod(invocation.getProxy().getMethod());
final ActionLogAnnotation annotation = method.getAnnotation(ActionLogAnnotation.class);
final ActionInvocation ai = invocation;

if (annotation != null) {
new Thread(
new Runnable(){
@Override
public void run() {
recordLogInfo(annotation, ai);
}
}
).start();
}

return result;
}

private void recordLogInfo(ActionLogAnnotation annotation, ActionInvocation invocation) {
String object = annotation.object();
String comment = annotation.comment();
String params = annotation.params();
int result = Const.LOG_ACTION_RESULT_SUCCESS;  // 默认执行成功
if (((ComnAction)invocation.getAction()).getActionErrors().size() > 0) {
result = Const.LOG_ACTION_RESULT_FAILURE;  // action操作执行失败
}
logger.debug("annotion:object=[{}],comment=[{}],params=[{}]", new String[]{object, comment, params});

LogAction logAction = new LogAction();

try {
String[] arrParams = null;
if (params.length() > 0) {
arrParams = params.split(",");
} else {
arrParams = new String[]{};
}

for (int i = 0; i < arrParams.length; i++) {
comment = StringUtils.replaceOnce(comment, "?", getParamValue(invocation, arrParams[i]));
}
object = this.getParamValue(invocation, object);
Entity logined = (Entity)invocation.getInvocationContext().getSession().get(Constants.LOGINED_KEY);

logAction.setEntityId(logined.getId());
logAction.setOperatedObject(object);
logAction.setOperateComment(comment);
logAction.setEntityName(logined.getName());
logAction.setOperateType(invocation.getAction().getClass().getName()+ "." + invocation.getProxy().getMethod());
logAction.setCreateTime(new Date());
logAction.setResult(result);
logActionService.saveActionLog(logAction);

}  catch (Exception e) {
logger.error("something error when record actionlog: {}", logAction.toString());
}
}

/**
 * 解析form表单数据
 * @param invocation
 * @param param 操作日志要记录的执行操作时提交的参数。
 * @return 返回操作对象
 */
private String getParamValue(ActionInvocation invocation, String param) {
if (param.indexOf(".") != -1) {
String scope = StringUtils.substringBefore(param, ".");
String remain = StringUtils.substringAfter(param, ".");
String theone = StringUtils.substringBefore(remain, "."); 
remain = StringUtils.substringAfter(remain, ".");

ValueStack vs = invocation.getInvocationContext().getValueStack();
if ("session".equals(scope)) {
vs.push(ServletActionContext.getRequest().getSession().getAttribute(theone));
} else if ("request".equals("scope")) {
vs.push(ServletActionContext.getRequest().getAttribute(theone));
} else {
return null;
}

if (StringUtils.isEmpty(remain)) {
return vs.pop().toString();
}
String rslt = vs.findString(remain);
vs.pop();
return rslt;
} else {
Map<String, Object> mapParams = invocation.getInvocationContext().getParameters();
String[] pvobject = (String[])mapParams.get(param);
return pvobject != null && pvobject.length > 0 
? (pvobject.length > 1 ? ArrayUtils.toString(pvobject) : pvobject[0])
: "";
}
}

@Override
public void init() {
super.init();
logActionService = (LogActionService)ContextUtil.getContext().getBean("logActionService");
}

}
--------------------编程问答-------------------- @Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ActionLogAnnotation {
String object();
String comment();
String params() default "";
}
@ActionLogAnnotation(object="trunk", comment="新增接入码,trunk=?,comment=?", params="trunk,comment")
public String save() {}


--------------------编程问答-------------------- 给你个demo
http://download.csdn.net/detail/zuxianghuang/4138590 --------------------编程问答-------------------- 楼主是否可以先整理简化一下?

基本的例子建立过吗?
http://callan.iteye.com/blog/182520 --------------------编程问答-------------------- 这个应该是你的web.xml没有调用他吧?? --------------------编程问答-------------------- 不会报错,就是注解的日志拦截器没有作用,应该是没有调到拦截器。 --------------------编程问答-------------------- 在strus2.0的时候可以用,但是更换过jar包之后就失效了,也不知道怎么回事,该引用的包都引用了。 --------------------编程问答-------------------- 换jar包 就不行了?  那就搞不清了 --------------------编程问答-------------------- 包冲突的原因啊。 --------------------编程问答-------------------- 这是之前的包这是更换后的包,
但是不知道哪里的包有问题 --------------------编程问答-------------------- 左边的是更新后的包,右边的是更新之前的包,上面说错了 --------------------编程问答--------------------
引用 4 楼 ZuxiangHuang 的回复:
给你个demo
http://download.csdn.net/detail/zuxianghuang/4138590

姐  敢不敢 给个 免积分的 --------------------编程问答-------------------- 经过调试,<default-interceptor-ref name="bpscStack" />
 这句话并没有覆盖struts-default.xml下的<default-interceptor-ref name="defaultStack"/>
 谁能给个答案,万分感激 --------------------编程问答--------------------
引用 13 楼 scottxzj 的回复:
引用 4 楼 ZuxiangHuang 的回复:给你个demo http://download.csdn.net/detail/zuxianghuang/4138590
姐  敢不敢 给个 免积分的


哎呀,阿拉是男的,男的,
不要积分也可以呀,我也是参考人家的,
你要,留个邮箱,就行了 --------------------编程问答--------------------
引用 15 楼 ZuxiangHuang 的回复:
引用 13 楼 scottxzj 的回复:
引用 4 楼 ZuxiangHuang 的回复:给你个demo http://download.csdn.net/detail/zuxianghuang/4138590
姐  敢不敢 给个 免积分的

哎呀,阿拉是男的,男的,
不要积分也可以呀,我也是参考人家的,
你要,留个邮箱,就行了

scottxzj@163.com --------------------编程问答-------------------- 现在公司发不了,晚上发你
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,