• cas 单点登录 --自定义审计日记@Audit()


    错误信息:

      1 org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing [AnnotatedAction@50b13f08 targetAction = [EvaluateAction@1e91236d expression =
       authorityCacheAction.authorityCacheByST(flowRequestContext,service), resultExpression = [null]], attributes = map[[empty]]]
       in state 'authorityCacheAction' of flow 'login' -- action execution attributes were 'map[[empty]]'
    2 at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:60) 3 at org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:101) 4 at org.springframework.webflow.engine.State.enter(State.java:194) 5 at org.springframework.webflow.engine.Transition.execute(Transition.java:227) 6 at org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:393) 7 at org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) 8 at org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119) 9 at org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555) 10 at org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:388) 11 at org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) 12 at org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:105) 13 at org.springframework.webflow.engine.State.enter(State.java:194) 14 at org.springframework.webflow.engine.Transition.execute(Transition.java:227) 15 at org.springframework.webflow.engine.DecisionState.doEnter(DecisionState.java:51) 16 at org.springframework.webflow.engine.State.enter(State.java:194) 17 at org.springframework.webflow.engine.Transition.execute(Transition.java:227) 18 at org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:393) 19 at org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) 20 at org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119) 21 at org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555) 22 at org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:388) 23 at org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) 24 at org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:105) 25 at org.springframework.webflow.engine.State.enter(State.java:194) 26 at org.springframework.webflow.engine.Transition.execute(Transition.java:227) 27 at org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:393) 28 at org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) 29 at org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119) 30 at org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555) 31 at org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:388) 32 at org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) 33 at org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:105) 34 at org.springframework.webflow.engine.State.enter(State.java:194) 35 at org.springframework.webflow.engine.Transition.execute(Transition.java:227) 36 at org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:393) 37 at org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) 38 at org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119) 39 at org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555) 40 at org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:388) 41 at org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) 42 at org.springframework.webflow.engine.ViewState.handleEvent(ViewState.java:232) 43 at org.springframework.webflow.engine.ViewState.resume(ViewState.java:196) 44 at org.springframework.webflow.engine.Flow.resume(Flow.java:545) 45 at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:258) 46 at org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:169) 47 at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183) 48 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933) 49 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:867) 50 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) 51 at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) 52 at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 53 at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) 54 at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 55 at org.jasig.cas.web.init.SafeDispatcherServlet.service_aroundBody2(SafeDispatcherServlet.java:125) 56 at org.jasig.cas.web.init.SafeDispatcherServlet.service_aroundBody3$advice(SafeDispatcherServlet.java:54) 57 at org.jasig.cas.web.init.SafeDispatcherServlet.service(SafeDispatcherServlet.java:1) 58 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 59 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 60 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 61 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 62 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 63 at edu.vt.middleware.servlet.filter.RequestDumperFilter.doFilter(RequestDumperFilter.java:86) 64 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 65 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 66 at com.github.inspektr.common.web.ClientInfoThreadLocalFilter.doFilter(ClientInfoThreadLocalFilter.java:63) 67 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 68 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 69 at edu.vt.middleware.cas.web.filter.GetSessionCookieFilter.doFilter(GetSessionCookieFilter.java:112) 70 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 71 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 72 at edu.vt.middleware.servlet.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:86) 73 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 74 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 75 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 76 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) 77 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:616) 78 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 79 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 80 at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 81 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 82 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) 83 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132) 84 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) 85 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1533) 86 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1489) 87 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 88 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 89 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 90 at java.lang.Thread.run(Thread.java:748) 91 Caused by: org.springframework.binding.expression.EvaluationException:
    An ELException occurred getting the value for expression 'authorityCacheAction.authorityCacheByST(flowRequestContext,service)' on context [class org.springframework.webflow.engine.impl.RequestControlContextImpl] 92 at org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:92) 93 at org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75) 94 at org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188) 95 at org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145) 96 at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51) 97 ... 88 more 98 Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 21): Method call: Method authorityCacheByST(org.springframework.webflow.engine.impl.RequestControlContextImpl,
      org.jasig.cas.authentication.principal.SimpleWebApplicationServiceImpl)cannot be found on com.sun.proxy.$Proxy46 type
    99 at org.springframework.expression.spel.ast.MethodReference.findAccessorForMethod(MethodReference.java:202) 100 at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:118) 101 at org.springframework.expression.spel.ast.MethodReference.access$000(MethodReference.java:44) 102 at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:258) 103 at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:82) 104 at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102) 105 at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:98) 106 at org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84) 107 ... 92 more

    错误信息基本上是红色部分。

    场景还原:

    1、cas单点登录,想自定义审计注入【@Audit()】,于是在cas登录流程加入了一个自己写的类:

     1 public class AuthorityCacheAction {
     2 
     3   private static final Logger logger = LoggerFactory.getLogger(AuthorityCacheAction.class);
     4 
     5   private RedisUtil redisUtil;
     6 
     7   public RedisUtil getRedisUtil() {
     8     return redisUtil;
     9   }
    10 
    11   public void setRedisUtil(RedisUtil redisUtil) {
    12     this.redisUtil = redisUtil;
    13   }
    14 
    15   @Audit(action = "MY_AUTHORITY_CACHE_TICKET", actionResolverName = "MY_AUTHORITY_CACHE_TICKET_RESOLVER", resourceResolverName = "MY_AUTHORITY_CACHE_TICKET_RESOURCE_RESOLVER")
    16   @Transactional(readOnly = false)
    17   public Event authorityCacheByST(RequestContext context, Service service) throws Exception {
    18     19     看重点部分:20     21     22 
    23     MyServiceTicket myServiceTicket = (MyServiceTicket) attributes.get("serviceTicketId");
    24     myServiceTicket.setServiceTicketId(serviceTicketId);
    25 
    26     redisUtil.set(serviceTicketId, attributes.get("groupAuthorities").toString());
    27     return new Event(this, "success");
    28   }
    29 
    30 }

    cas登录流程流程代码:

    1   <action-state id="authorityCacheAction">
    2         <evaluate expression="authorityCacheAction.authorityCacheByST(flowRequestContext,service)" />
    3         <transition on="success" to ="warn" />
    4      </action-state>

    aop切入点声明:

    <aop:aspectj-autoproxy/>
        
    <bean id="authorityCacheAction" class="com.tyky.cas.web.AuthorityCacheAction" 
          p:redisUtil-ref="redisUtil"/>
    
    ...........

    差不多就是事故现场了,单点登录到这个流程,就会报以上错误!还有种错误情况情况就是redisUtil 为null,redisUtil 的bean声明在另一个xml文件中,一直以为是xml加载顺序的原因,尝试将两个bean的声明写在同一个xml中,redisUtil不为空了,但是我的审计@Audit()方法不起作用,于是在想为什么不能注入,已经声明了

    <aop:aspectj-autoproxy/>

    并将class在里面声明了。

    后来各种在网上尝试找方法,看到了一句 "原来Sprig AOP默认情况下创建的代理是基于接口的,所以类的属性是不能通过代理来访问的,这就是为什么前面报这样的错了!",尝试将该类添加一个接口,于是心愿了了。

    1 public class AuthorityCacheAction implements IAuthorityCacheAction {
    2 .......
    3 
    4 }

    接口:

    1 public interface IAuthorityCacheAction {
    2   public Event authorityCacheByST(RequestContext context,Service service) throws Exception;
    3 
    4 }

    参考资料中是用另外一种方式解决的。

    动态代理:

    内容是摘抄的,不知最初的原作者,见谅

     

    Java 动态代理。具体有如下四步骤:

    1. 通过实现 InvocationHandler 接口创建自己的调用处理器;
    2. 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
    3. 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
    4. 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。

     

    GCLIB代理

      cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
      cglib封装了asm,可以在运行期动态生成新的class。
      cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。

    原理区别:

    java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

    1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 
    2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 
    3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

     

    如何强制使用CGLIB实现AOP? 
    * 添加CGLIB库,SPRING_HOME/cglib/*.jar 
    * 在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>

    JDK动态代理和CGLIB字节码生成的区别? 
    * JDK动态代理只能对实现了接口的类生成代理,而不能针对类 
    * CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 
      因为是继承,所以该类或方法最好不要声明成final。

    曾尝试过使用<aop:aspectj-autoproxy proxy-target-class="true"/> ,可能因为含有这个aop声明的xml文件包含其他bean的声明导致出错,我就是用了接口的方式。

    reference:  http://blog.csdn.net/gxlstone/article/details/12955063

  • 相关阅读:
    高可靠JAVA项目
    C语言JS引擎
    星际争霸,FF反作弊对战平台
    【转】ffluos编译
    〓经典文字武侠游戏 书剑 书剑江湖自由度超高!公益服!〓
    全局解释器锁GIL
    创建多线程Thread
    线程的简述Thread
    进程池的回调函数callback
    进程池的同步与异步用法Pool
  • 原文地址:https://www.cnblogs.com/hoojjack/p/7384614.html
Copyright © 2020-2023  润新知