flex问题请教??
项目中用到flex,想在遇到的问题是jboss启动登录环境访问flex页面一切ok,当刷新一下IE在访问flex页面时就会出现下面异常
Servlet.service() for servlet MessageBrokerServlet threw exception
flex.messaging.LocalizedException: The FlexSession is invalid.
at flex.messaging.FlexSession.checkValid(FlexSession.java:906)
at flex.messaging.FlexSession.getUserPrincipal(FlexSession.java:225)
at flex.messaging.HttpFlexSession.getUserPrincipal(HttpFlexSession.java:272)
at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:327)
退出环境重新登录环境也可以访问flex页面。刷新IE还是会报异常。
[解决办法]
这是java端的异常啊~~!
至于什么原因我也不知道。我也不能乱说。。
flex我没用过所谓的session···
[解决办法]
你刷新页面session就失效了,找配置文件,配置一下session的有效范围,就可以了
[解决办法]
1、在web.xml增加<filter> <filter-name>AMFContextFilter</filter-name> <filter-class>soft.flex.context.AMFContextFilter</filter-class></filter><filter-mapping> <filter-name>AMFContextFilter</filter-name> <servlet-name>MessageBrokerServlet</servlet-name></filter-mapping>2、增加AMFContextFilter文件package soft.flex.context;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class AMFContextFilter implements Filter {public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { AMFContext.setCurrentContext((HttpServletRequest) request, (HttpServletResponse) response); chain.doFilter(request, response);}public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub}public void destroy() { // TODO Auto-generated method stub}}3、增加AMFContext文件package soft.flex.context;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class AMFContext {/*** ThreadLocal object for storing object in current thread.*/@SuppressWarnings("unchecked")private static ThreadLocal tl = new ThreadLocal();/*** Set current context* * @param request* The HttpRequest object* @param response* The HttpResponses object*/@SuppressWarnings("unchecked")static public void setCurrentContext(HttpServletRequest request, HttpServletResponse response) { AMFContext c = getCurrentContext(); if (c == null) { c = new AMFContext(request, response); tl.set(c); } else { c.setRequest(request); c.setResponse(response); }}/*** Get current context value* * @return The current context*/static public AMFContext getCurrentContext() { return (AMFContext) tl.get();}// ----------------------//// Class members//// ----------------------/*** The http request object. The lifecycle of the request object is defined* as the request scope. It may be reused in another incoming connection, so* dont use it in another thread.*/private HttpServletRequest request;/*** The http response object. The lifecycle of the response object is defined* as the request scope. Dont use it in another thread. Also dont write* output to the response when it is used in the context, but you may get or* set some response header when it is safe.*/private HttpServletResponse response;/*** The constructor is private, to get an instance of the AMFContext, please* use getCurrentContext() method.* * @param request* @param response*/private AMFContext(HttpServletRequest request, HttpServletResponse response) { this.request = request; this.response = response;}/*** Get request object* * @return Http request object*/public HttpServletRequest getRequest() { return request;}/*** Set request object* * @param Http* request object*/public void setRequest(HttpServletRequest request) { this.request = request;}/*** Get response object* * @return Http response object*/public HttpServletResponse getResponse() { return response;}/*** Set response object* * @param response* Http response object*/public void setResponse(HttpServletResponse response) { this.response = response;}/*** Get the servlet context* * @return*/public ServletContext getServletContext() { HttpSession session = this.getSession(); return session.getServletContext();}/*** Get the current running session* * @return*/public HttpSession getSession() { return request.getSession();}/*** Get an object stored in the session.* * @param attr* Attribute Name* @return The value stored under the attribute name.*/public Object getSessionAttribute(String attr) { HttpSession session = this.getSession(); return session.getAttribute(attr);}/*** Store an object in the session.* * @param attr* Attribute Name* @param value* The value.*/public void setSessionAttribute(String attr, Object value) { HttpSession session = this.getSession(); session.setAttribute(attr, value);}/*** Get an object stored in the servlet context.* * @param attr* Attribute Name* @return The value stored under the attribute name.*/public Object getContextAttribute(String attr) { ServletContext sc = this.getServletContext(); return sc.getAttribute(attr);}/*** Store an object in the servlet context.* * @param attr* Attribute Name* @param value* The value.*/public void setContextAttribute(String attr, Object value) { ServletContext sc = this.getServletContext(); sc.setAttribute(attr, value);}/*** Get an object stored in the current request.* * @param attr* Attribute Name* @return The value stored under the attribute name.*/public Object getRequestAttribute(String attr) { return request.getAttribute(attr);}/*** Store an object in the current request.* * @param attr* Attribute Name* @param value* The value.*/public void setRequestAttribute(String attr, Object value) { request.setAttribute(attr, value);}}4、增加FlexSessionInterceptor文件package soft.flex.context;import javax.servlet.http.HttpServletRequest;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;import soft.common.util.Constants;public class FlexSessionInterceptor implements MethodInterceptor {public Object invoke(MethodInvocation invocation) throws Throwable { AMFContext context = AMFContext.getCurrentContext(); HttpServletRequest request = context.getRequest(); if (request.getSession().getAttribute(Constants.LOGIN_USER_INFO) == null) { throw new Exception("Session超时,请您重新登陆!"); } return invocation.proceed();}}5、在applicationContext.xml增加以下内容<!-- 配置SessionAdvice --><bean id="sessionAdvice" class="soft.flex.context.FlexSessionInterceptor" /> <!-- 配置自动代理 --> <bean id="beanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>formDesignerService</value> </list> </property> <property name="interceptorNames"> <value>sessionAdvice</value> </property> </bean>这样子的话,在所有的flex请求中都会先执行FlexSessionInterceptor类中的invoke方法如果要在任何java类中获取sessionr的话,使用AMFContext.getCurrentContext().getSession()即可