关于session过期返回主页解决方案之一以及js中的“和'使用问题
2013-08-06 10:56
639 查看
今天为了一个session超时能够返回主页的问题,搞得我蛋疼。原来别人写的老代码。使用spring的aop编程的原理在baseAction中使用
这样在以后使用到userinfor的所有的使用到的方法中都throws Exception 在aop的类ExceptionAspect接收这个异常并处理。
ActionContext.getContext().getValueStack().set("jsonString", "eval(\"alert('" + e.getMessage() + "');window.top.location.href(window.location.protocol + '//' + window.location.host +'/cpms');\")");
返回一个json字符串使用eval让他作为js执行,这里就要说道这个url了。
这个url是使用js方法拼接出来的,因为,实际使用的项目中个可能经常要变化部署的服务器,你不可能将整个地址写死。
使用window.top.location.href的原因是因为很多项目页面都使用了类似frame框架的设计,这样控制的是整个页面,转向另一个url,而不会出现一个版块打开了首页的奇怪现象。
最后说道的是js中的单引号和双引号的问题的,js语言规则不是很强,单引号和双引号都可以用来括起一个字符串,你也可以根据需要恰当的使用这两种符号,
但我强调的是在返回的拼接url中使用单引号吧。当无知的我使用了双引号”//“,为了在java字符串中让他认为//后面的是注释我还特意的转译了下”\/\/“,很顺利的传到页面上的url变成了
http:“//” + window.location.host +”/cpms“
你没看错js他也不认识”//“ 了,不管什么原因一旦//或者/前面出现了”的话,后面的他就不认了。具体的我也搞不明白。
当我很是蛋疼时,我把所有的双引号换成单引号,终于得到了我想要的结果。在java端也不用什么转译的。真是方便啊!
public UserSession getUserInfor() { UserSession userinfor = SpringSecurityUtils.getCurrentUser(); if (null == userinfor) { throw new AppException(AppException.SESSION_TIME_OUT, "用户未登录或登录超时,请重新登录!"); } return userinfor; }
这样在以后使用到userinfor的所有的使用到的方法中都throws Exception 在aop的类ExceptionAspect接收这个异常并处理。
package cn.comingnet.commons.aop; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.Logger; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springside.modules.security.springsecurity.SpringSecurityUtils; import cn.comingnet.app.entity.system.AppLog; import cn.comingnet.app.service.system.LogManager; import cn.comingnet.commons.exception.AppException; import cn.comingnet.commons.exception.Exceptioni18n; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * 对action层进行aop,异常等处理 * * @author jile * */ @Aspect public class ExceptionAspect { private Logger log = Logger.getLogger(ExceptionAspect.class); @Autowired private LogManager logManager; /** * 定义action层方法 */ @Pointcut("execution(* cn.comingnet.app.web.action..*.*(..)) ") public void webServiceMethod() { } /** * 为WebService入口方法加入TraceID控制. */ @SuppressWarnings("finally") @Around("webServiceMethod()") public Object traceAround(ProceedingJoinPoint pjp) { ActionSupport baseAction = (ActionSupport) pjp.getTarget(); String signature = pjp.getSignature().toString();// 获取目标方法签名 String methodName = signature.substring(signature.lastIndexOf(".") + 1, signature.indexOf("(")); Object obj = "reload"; Date startDate = new Date(); try { // System.out.println("开始aop==>"+pjp.getSignature()); obj = pjp.proceed(); } catch (Throwable e) { Date endDate = new Date(); // System.out.println("拦截异常信息:【" + e.getMessage() + "】"); log.error(e.getMessage(), e); AppLog appLog = new AppLog(); appLog.setType("异常信息"); appLog.setModule(pjp.getTarget().getClass().toString()); appLog.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startDate)); appLog.setEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(endDate)); appLog.setTimes(endDate.getTime() - startDate.getTime()); appLog.setContent(Exceptioni18n.processor(e) + "<br>" + Exceptioni18n.traceToString(e)); appLog.setClazz(pjp.getTarget().getClass().toString()); appLog.setMethod(methodName); appLog.setNote(methodName); appLog.setIsException(1); appLog.setExceptionName(e.getClass().toString()); appLog.setIp(SpringSecurityUtils.getCurrentUserIp()); appLog.setOperator(SpringSecurityUtils.getCurrentUserName()); logManager.save(appLog); // 针对ajax请求的异常处理 if (ActionContext.getContext().getValueStack().findString("op").equals("ajax")) { obj = "json"; if (e instanceof AppException) { if (AppException.SESSION_TIME_OUT == ((AppException) e).getCode()) { ActionContext.getContext().getValueStack().set("jsonString", "eval(\"alert('" + e.getMessage() + "');window.top.location.href(window.location.protocol + '//' + window.location.host +'/cpms');\")"); } else { ActionContext.getContext().getValueStack().set("jsonString", "{success:false,message:'" + e.getMessage() + "'}"); } } else { ActionContext.getContext().getValueStack().set("jsonString", "{success:false,message:'" + Exceptioni18n.processor(e) + "'}"); } } baseAction.addActionMessage("<font color=red><b>" + Exceptioni18n.processor(e) + "</b></font>"); } finally { return obj; } } }
ActionContext.getContext().getValueStack().set("jsonString", "eval(\"alert('" + e.getMessage() + "');window.top.location.href(window.location.protocol + '//' + window.location.host +'/cpms');\")");
返回一个json字符串使用eval让他作为js执行,这里就要说道这个url了。
这个url是使用js方法拼接出来的,因为,实际使用的项目中个可能经常要变化部署的服务器,你不可能将整个地址写死。
使用window.top.location.href的原因是因为很多项目页面都使用了类似frame框架的设计,这样控制的是整个页面,转向另一个url,而不会出现一个版块打开了首页的奇怪现象。
最后说道的是js中的单引号和双引号的问题的,js语言规则不是很强,单引号和双引号都可以用来括起一个字符串,你也可以根据需要恰当的使用这两种符号,
但我强调的是在返回的拼接url中使用单引号吧。当无知的我使用了双引号”//“,为了在java字符串中让他认为//后面的是注释我还特意的转译了下”\/\/“,很顺利的传到页面上的url变成了
http:“//” + window.location.host +”/cpms“
你没看错js他也不认识”//“ 了,不管什么原因一旦//或者/前面出现了”的话,后面的他就不认了。具体的我也搞不明白。
当我很是蛋疼时,我把所有的双引号换成单引号,终于得到了我想要的结果。在java端也不用什么转译的。真是方便啊!
相关文章推荐
- 关于使用struts2时子窗体页面跳转后在父窗体打开的问题以及Session过期后的页面跳转问题
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- 关于Column '*' not found 解决方案 Hibernate使用SQL查询返回实体类型,即返回某个类,或实体类
- C++Builder中关于INDY库的使用 以及一些问题的解决(E2238 Multiple declaration for 'fd_set')
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- 关于使用iframe镶嵌页面当session过期无法在主页面刷新问题
- 关于使用LoadRunner测试时使用Servlet返回的Sessionid的问题
- 关于Sybase ASE数据库的license以及试用版过期的问题的解决方案
- Spring MVC使用@ResponseBody返回JSON数据406以及乱码问题解决方案
- 关于Sybase ASE数据库的license以及试用版过期的问题的解决方案
- Spring MVC使用@ResponseBody返回JSON数据406以及乱码问题解决方案
- 关于使用Iterator时报NoSuchElementException错误的解决方案以及遍历容器的效率问题
- 关于js中获得某一天的昨天以及上周一天的日期使用问题
- 关于"使用注册为 allowDefinition='MachineToApplication' 的节是错误的"的解决方案