第一次使用Struts2,用到了拦截器
我的xml:
<package name="default" namespace="/" extends="json-default">
<interceptors>
<!-- 定义权限检查拦截器 -->
<interceptor name="authority" class="com.yss.alm.Interceptor.AuthorityInterceptor" />
<!-- 定义一个包含权限检查的拦截器栈 -->
<interceptor-stack name="Mydefault">
<!-- 定义拦截器栈包含defaultStack拦截器 -->
<interceptor-ref name="defaultStack" />
<!-- 定义拦截器栈包含authority拦截器 -->
<interceptor-ref name="authority" />
</interceptor-stack>
</interceptors> <default-interceptor-ref name="Mydefault" /> <!-- 定义全局Result --> 
<global-results> 
<!-- 当返回login视图名时,转入/login.html页面 --> 
<result name="login">/sylqv.jsp</result>
</global-results>
        
<action name="login" class="YHBAction" method="execute">
<result name="success" type="json">/main.html</result>
<interceptor-ref name="paramsPrepareParamsStack" /> 
</action>
</package>我的java:public class AuthorityInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = -6486163537439978414L; // 拦截Action处理的拦截方法
@SuppressWarnings("rawtypes")
public String intercept(ActionInvocation invocation) throws Exception {
// 取得请求相关的ActionContext实例
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession(); // 如果没有登陆,返回重新登陆
if (session.get("user") != null) {
System.out.println("Interceptor");
System.out.println("登陆");
return invocation.invoke();

}
// 没有登陆,将服务器提示设置成一个HttpServletRequest属性
ctx.put("tip", "您还没有登陆,请登陆系统");
// 直接返回login的逻辑视图
System.out.println("没有登陆");
return Action.LOGIN;
}
}我在URl中直接输入登录后的地址时,通过输出调试信息表明拦截器确实起作用了,可是没有自动跳转到login.html画面,只是画面的url还是登录后的url,没有变成 login.html,画面显示空白画面。求哪位大侠解答一下我哪里出了问题。谢谢

解决方案 »

  1.   

    <!-- 定义全局Result -->  
    <global-results>  
    <!-- 当返回login视图名时,转入/login.html页面 -->  
    <result name="login">/sylqv.jsp</result>
    </global-results>
      

  2.   

    应该到global-results定义的页面。
      

  3.   


    这里定义的明明是 返回login时,转入/sylqv.jsp页面啊。当然不会到login.html页面了
      

  4.   

    <!-- 定义全局Result -->  
    <global-results>  
    <!-- 当返回login视图名时,转入/login.html页面 -->  
    <result name="login">/login.html</result>
     </global-results>
     
      

  5.   

    谢谢楼上几位,不是那么简单的毛病。/sylqv.jsp是我后来改的,看看是不是因为不认html只认jsp的问题,看来也不是sylqv.jsp,和login.html都是存在的
    案例说不论那个,也都应该有跳转的行为,可是现在的情况是 压根不跳转
      

  6.   

    看来也不是。sylqv.jsp和login.html都是存在的,
    按理说不论写那个,也都应该有跳转的行为,可是现在的情况是 压根不跳转
      

  7.   

    页面的路径仍然是我 直接输入的登录后界面的路径 只不过 不能显示,画面是空白的。由此说明拦截器确实起作用了,没加拦截器之前是可以正常显示画面的。debug确实进入了拦截器内,而且输出的调试信息也证明了这一点。
    可是我悲催的就是不能跳转到登录画面它就是不跳转啊。
      

  8.   

    <result name="success" type="json">/main.html</result>
      这个type="json" 我还真没用过,你看下去掉会不会跳到main.html
      

  9.   

    struts2默认的跳转方法是forward,你可以把global的那个result跳转设置为redirect,看看地址栏里的url发生什么变化。如果变化了,那就是你页面的事情。
    如果没有变化,发出来,再讨论。
      

  10.   

    注意拦截器配置的顺序问题,请删除<interceptor-ref name="paramsPrepareParamsStack" />这个了再重新测试下
      

  11.   


    设置为redirect的结果是一样的。我试过了
      

  12.   

    有了新进展,前台画面报错了。SCRIPT5022: You're trying to decode an invalid JSON String:
      

  13.   

    我是楼主 csdn 不让连续回复3次。换个号。按照16楼的兄弟 我加上 type="redirect" 或者不定义type 都是报
    CRIPT5022: You're trying to decode an invalid JSON String:如果改成type="json" 不报错,却直接到了登录后画面,拦截器给出的调试信息确实对的 打出了“没有登陆”
    struts2没有用过以前,,不知道为什么
      

  14.   

    1、请删除<interceptor-ref name="paramsPrepareParamsStack" />测试输入任何一url拦截器是否可以跳转到登录画面
    2、如果可以跳转请对com.yss.alm.Interceptor.AuthorityInterceptor进行修改,对提交登录的url进行免session检查
      

  15.   


    1就过去去,不是这个问题。前台还是报CRIPT5022: You're trying to decode an invalid JSON String:
      

  16.   

    在Struts2中,type="json“这样是用来做AJAX请求的  
    所以根本就没有跳转页面。
      

  17.   


    那应该如何改呢
    这个项目是EXT4 + SSH + ORACLE
      

  18.   

    <global-results>  
    <!-- 当返回login视图名时,转入/login.html页面 -->  
    <result name="login">/sylqv.jsp</result>
     </global-results>
     
    你这这里的result中,设置一下type,采用redirect的方式,试试。因为采用type="json"的时候,Struts2会将你Action中的变量转成JSON 返回到页面。
      

  19.   


    设置了 结果就是前台页面是空白 报错了 提示CRIPT5022: You're trying to decode an invalid JSON String:
      

  20.   

    那我觉得你应该在你前段接收到的结果中,设置一个标志位了,如果接收到你传递的某个结果,你应该在前段页面定向一下。因为针对ajax请求中,struts是直接输出到请求结果,不负责页面跳转。所以出现了,你的数据到达你请求的页面,而你请求的页面不能处理你的结果信息,导致他变成了空白页。
    你可以在firefox中,调试一下~看看下面,请求响应后的json对象,应该是获得["tip":"您还没有登陆,请登陆系统"]这样的东西。
      

  21.   

    不是很明白
    不过感觉越来越接近真相了
    我在url输入的是main.html
    在main.html里会引入一些js
    js里有同步的ajax请求。而login.html里没有ajax 只有ext的 submit请求。
      

  22.   

    因为你在地址栏里输入的是main.html请求,所以由你的过滤器处理的信息,依然会返回到main.html页面里,但是你在main.html中,写的js是无法正常解析你返回的json对象,也就是["tip":"您还没有登陆,请登陆系统"],导致你这段js出现异常信息,所以你既没有跳转页面,也没法显示到main.html中信息。所以,要在main页面中,做接收tip的处理,当服务器响应的是tip的时候,你要让main页面跳转到login.html就好啦!
      

  23.   


    这样的话会不会很麻烦啊,我需要在每个不是login.html的页面都加上相应的tip处理么
    其实 ctx.put("tip", "您还没有登陆,请登陆系统"); 这个意识信息对我可有可无。能不能从修改拦截器入手呢?
      

  24.   

    我只是想要他单纯的返回login.html就可以了。。
      

  25.   

    那我觉得就应该从json-default这个包考虑了,因为struts是无法控制ajax请求的,也就是说,如果你请求的页面是需要ajax请求action的时候,action只负责把它处理的结果输出来,然后ajax就能捕获这些信息,然后接下来就是ajax做处理了。但是如果这个时候,你在拦截器里做了跳转,而前段的ajax还等着你返回的字符串呢?这个东西我也只能解释到这里,我个人实现ajax的能力有限~不好意思。
      

  26.   

    我突然想到一个方法,就是你自己写一个filter,过滤html。让你的验证在请求html的时候,就把它拦截了,而不是在html中,js代码load数据访问到action的时候,再拦截。这个filter,作用在拦截器之前!简单介绍一下流程:
    1. 访问main.hmtl
    2. filter过滤,如果用户为空,则直接sendRedirect()到登录页面,否则加载html页面
    3. 加载html页面的时候,遇到js加载action的时候,继续会走filter,但是这个时候,你已经通过验证了,所以就能通过你的那个检证了,正常加载数据之前的加载流程是:
    1. 访问main.html
    2. 遇到js加载action,访问action
    3. action操作之前,被拦截器拦截,返回错误信息
      

  27.   

    用filter是我目前正在使用的方式,我现在之所以想换成AbstractInterceptor 是由于filter在过滤ajax请求时 无能为力,上面的问题我已经解决了,就是在拦截器里做个标识返回给页面,然后再让页面跳转。目前运行良好不过又出现了新问题。以前用filter的时候ajax请求返回的responseText不会出现乱码问题,而现在用了拦截器后ajax请求返回的responseText中文全部为???乱码。又折腾了一下午,还在折腾中。。
      

  28.   

    在web.xml中的将Filter配置在struts2过滤器之前 貌似就能解决Filter无法拦截ajax的问题
    实验一下,恐怕白折腾了
      

  29.   

    你把字符编码的filter也一起删除了吧?我觉得这个可以保留的。