`
master3003
  • 浏览: 46889 次
社区版块
存档分类
最新评论

Ajax的请求在struts2中怎么实现跳转

 
阅读更多
我前台用的ext,所有请求都是Ajax的请求,然后我后台用的struts,配置了一个全局的权限拦截器。如果未登录就自动跳转到登陆界面。也配置了全局的跳转。
<global-results>
<result name="login" type="redirect">/login.jsp</result>
</global-results>
   但是因为是Ajax的请求,所以界面并不跳转。但是都可以在后台输出跳转
2010-05-13 17:05:49,281 DEBUG (org.apache.struts2.dispatcher.ServletRedirectResult:57) - Redirecting to finalLocation /graduation/login.jsp
用firedebug也有跳转到login.jsp的一个get方法。
  后来想在拦截器里面直接用后台的代码跳转。
HttpServletRequest req = (HttpServletRequest) ctx.get(StrutsStatics.HTTP_REQUEST);
HttpServletResponse resp = (HttpServletResponse) ctx.get(StrutsStatics.HTTP_RESPONSE);
resp.sendRedirect(req.getContextPath()+"/login.jsp");

或者是 req.getRequestDispatcher("/login.jsp").forward(req, resp);
但是都会在后台报错:严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:770)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
请教高手啦、、、、、

------------------------------------------------------------------------------------------------------------------
问题补充:


andyjackson 写道
既然你是用ajax请求 那么无论他如何跳转都没有用,他会将数据一大堆返回,还不方便ajax请求,你最好是在ajax的onsucess中手动跳转

我是配置的一个登陆验证逻辑,给所有的action都加了一个,如果在Ajax中跳转当然可以,但是我得把每个请求都加个跳转,很麻烦,有好的办法么?

------------------------------------------------------------------------------------------------------------------
问题补充:
我是这样子做的啊、
xiaolongfeixiang 写道
Java代码 
后来想在拦截器里面直接用后台的代码跳转。 

后来想在拦截器里面直接用后台的代码跳转。

在Interceptor中不能直接resp.sendRedirect(req.getContextPath()+"/login.jsp");

因为下一个Interceptor无法被调用。所以会报错

你可以这样:

Xml代码 
<global-results>   
<result name="login">/login.jsp</result>   
</global-results> 

<global-results>
<result name="login">/login.jsp</result>
</global-results>




采纳的答案
2010-05-13 yy629 (资深程序员)
由于你的请求都是采用Ajax的, 所以每次发起ajax请求, 虽然拦截器判断出未登录跳转到登录页面, 那么, 这次ajax请求的结果就是这个页面(具体的说, 这次请求返回的就是登录页面的源代码), 所以浏览器不会发生跳转. 通过在请求完成事件处理函数中判断返回的文本是不是登录页面的源码(比如检查返回值中是否包含<title>用户登录</title>, 这个和登录页面有关了), 如果包含, 则top.location.href='登录页面的url'

--------------------------------------------------------------------------------
提问者对于答案的评价:
谢谢大家的热心解答,Ajax请求确实不能单纯的用拦截器进行跳转,必须得在Ajax请求中设个回调处理,虽然麻烦,但是好像只能这样,偷懒不成啦。参考fireinjava兄台的处理可以。

问题答案可能在这里 → 寻找更多解答
秀一下我们的Runes v10业务平台,欢迎拍砖。
掌控上传进度的AJAX Upload
如何控制访问页面,filter可以吗?
SSH的项目中有没有判断session是否为空的过滤器之类的东西
如何实现struts2拦截器失败 自动跳转

其他回答
既然你是用ajax请求 那么无论他如何跳转都没有用,他会将数据一大堆返回,还不方便ajax请求,你最好是在ajax的onsucess中手动跳转
andyjackson (初级程序员) 2010-05-13
不方便ajax处理
andyjackson (初级程序员) 2010-05-13
Java代码 
后来想在拦截器里面直接用后台的代码跳转。 

后来想在拦截器里面直接用后台的代码跳转。

在Interceptor中不能直接resp.sendRedirect(req.getContextPath()+"/login.jsp");

因为下一个Interceptor无法被调用。所以会报错

你可以这样:

Xml代码 
<global-results>   
<result name="login">/login.jsp</result>   
</global-results> 

<global-results>
<result name="login">/login.jsp</result>
</global-results>


xiaolongfeixiang (资深架构师) 2010-05-13
讲讲解决思路:

1,使用filter过滤器,直接sendRedirect是完全可以的。(就如你下面的代码是完全正确的)

Java代码 
HttpServletRequest req = (HttpServletRequest) ctx.get(StrutsStatics.HTTP_REQUEST);   
HttpServletResponse resp = (HttpServletResponse) ctx.get(StrutsStatics.HTTP_RESPONSE);   
resp.sendRedirect(req.getContextPath()+"/login.jsp");  

HttpServletRequest req = (HttpServletRequest) ctx.get(StrutsStatics.HTTP_REQUEST);
HttpServletResponse resp = (HttpServletResponse) ctx.get(StrutsStatics.HTTP_RESPONSE);
resp.sendRedirect(req.getContextPath()+"/login.jsp");

为什么不能使用拦截器和上面同样的代码,这跟拦截器的实现机制有关系的,我们知道在struts中一个重要的机制是AOP编程,拦截器就是用AOP思想来实现的。所以同样的代码在filter中可以使用,而在拦截器中不可使用。
2,使用拦截器实现,但是逻辑稍微有点复杂。
===========================================
大体思路是这样的:在拦截器中设置一个标识(表示是否登录),在login action中获取该标志,根据该标志的值进行跳转。(上面的代码依然可以用)
可以参考这个实现:http://www.blogjava.net/max/archive/2006/12/06/85925.html



Anddy (架构师) 2010-05-13
引用
我是这样子做的啊、


你设置的是 redirect , 改为默认的 dispatcher就好了
xiaolongfeixiang (资深架构师) 2010-05-13
AJAX请求是不可能在服务端完成跳转的,它只能将文本信息传回到客户端。你可以这么做,如果验证失败的话让拦截器将失败信息以一定的json格式写入输出流中,然后在js里为
Ext.ajax添加requestcomplete事件监听,对返的XMLHttpRequest 进行解析,如果responseText属性是验证失败的json串则在客户端通过window.location进行跳转;因为Ext.ajax是个单例对象,所以一个页面只需配置一次即可,多个页面的话你就得每个页面都复制了
chemzqm (资深程序员) 2010-05-13
我弄过
请看:http://fireinjava.iteye.com/blog/483931(同步异步皆可)

你也可以在interceptor里面getRootWin().location="http://....";
分享到:
评论

相关推荐

    基于Ajax的新MVC框架的研究与实现

    本文还将Java反射机制与Velocity技术相结合,实现了在VTL文件中直接存取Container的相关属性。由于引入了jQuery,极大简化了DOM以及Ajax编程。与Struts相比,应用新框架使开发人员不再需要编写配置文件,也不用考虑复杂...

    Ajax Session失效跳转登录页面的方法

    在Struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(Session失效拦截);一般请求的话,如果Session失效时,我们会跳到登录页面,可是如果我们采用AJAX请求时,将会...

    反向Ajax 30分钟快速掌握

    场景1:当有新邮件的时候,网页自动弹出提示信息而无需...文章旨在演示如何实现以上两种技术手段,Struts2或SpringMVC中的应用并未涉及。此外,Servlet的配置也采用注解的方式,相关知识大家可以参考其它资料。 一、C

    java面试宝典

    170、Javascript如何发送一个Ajax请求? 41 171、AJAX都有哪些有点和缺点? 41 172、Ajax和javascript的区别? 41 Servlet部分 42 174、JAVA SERVLET API中forward() 与redirect()的区别? 42 178、如何现实servlet...

    java命名规范 开发规范

    d. 开发Service接口和Service接口实现,并在Action中通过set方法注入该Service; 接口文件:UserService 接口实现:UserServiceImpl 注入Service e. 开发DAO,DAO继承com.hikvision.xxx.HibernateBaseDAO; 示例 f...

    千方百计笔试题大全

    170、Javascript如何发送一个Ajax请求? 41 171、AJAX都有哪些有点和缺点? 41 172、Ajax和javascript的区别? 41 Servlet部分 42 174、JAVA SERVLET API中forward() 与redirect()的区别? 42 178、如何现实servlet...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    基于J2EE框架的个人博客系统项目毕业设计论...

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    window.open()实现post传递参数

    常常遇到这样的需求,即实现子系统页面之间跳转并在新的页面打开,我所在项目组使用的是SSH框架,所以url均为类似****.action,同时还带有两参数(系统ID与系统名称),两个参数被struts拦截后存入session中,...

    最新Java面试宝典pdf版

    2、你在项目中用到了xml技术的哪些方面?如何实现的? 114 3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有...

    Java面试笔试资料大全

    2、你在项目中用到了xml技术的哪些方面?如何实现的? 114 3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有...

    JAVA面试宝典2010

    2、你在项目中用到了xml技术的哪些方面?如何实现的? 114 3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有...

    Java面试宝典-经典

    2、你在项目中用到了xml技术的哪些方面?如何实现的? 114 3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有...

    java面试题大全(2012版)

    2、你在项目中用到了xml技术的哪些方面?如何实现的? 114 3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有...

    Java面试宝典2010版

    2、你在项目中用到了xml技术的哪些方面?如何实现的? 114 3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有...

    Java面试宝典2012版

    2、你在项目中用到了xml技术的哪些方面?如何实现的? 114 3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档...

    java面试宝典2012

    2、你在项目中用到了xml技术的哪些方面?如何实现的? 124 3、用jdom解析xml文件时如何解决中文问题?如何解析? 124 4、编程用JAVA解析XML的方式. 125 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有...

    Java面试宝典2012新版

    2、你在项目中用到了xml技术的哪些方面?如何实现的? 114 3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有...

Global site tag (gtag.js) - Google Analytics