首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

Struts2拦截器

2012-01-29 
Struts2拦截器求助第一次使用Struts2,用到了拦截器我的xml:package namedefault namespace/ extend

Struts2拦截器求助
第一次使用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,画面显示空白画面。

求哪位大侠解答一下我哪里出了问题。谢谢

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



[解决办法]
应该到global-results定义的页面。
[解决办法]
[Quote:]
<!-- 当返回login视图名时,转入/login.html页面 -->
<result name="login">/sylqv.jsp</result>
</global-results>
[/Quote]

这里定义的明明是 返回login时,转入/sylqv.jsp页面啊。。。。当然不会到login.html页面了
[解决办法]
<!-- 定义全局Result -->
<global-results>
<!-- 当返回login视图名时,转入/login.html页面 -->
<result name="login">/login.html</result>
 </global-results>
 
[解决办法]
拦截器本身没有问题 白色的页面啊 没找到对应的页面吧 页面的路径?有没有输出错误信息?
[解决办法]
加断点看看进到拦截器内没,如果进入了,就着重看一下返回路径问题
[解决办法]
<result name="success" type="json">/main.html</result>
这个type="json" 我还真没用过,你看下去掉会不会跳到main.html


[解决办法]
struts2默认的跳转方法是forward,你可以把global的那个result跳转设置为redirect,看看地址栏里的url发生什么变化。

如果变化了,那就是你页面的事情。
如果没有变化,发出来,再讨论。
[解决办法]
注意拦截器配置的顺序问题,请删除<interceptor-ref name="paramsPrepareParamsStack" />这个了再重新测试下
[解决办法]
我是楼主 csdn 不让连续回复3次。换个号。

按照16楼的兄弟 我加上 type="redirect" 或者不定义type 都是报
CRIPT5022: You're trying to decode an invalid JSON String:

如果改成type="json" 不报错,却直接到了登录后画面,拦截器给出的调试信息确实对的 打出了“没有登陆”
struts2没有用过以前,,不知道为什么。。。
[解决办法]
1、请删除<interceptor-ref name="paramsPrepareParamsStack" />测试输入任何一url拦截器是否可以跳转到登录画面
2、如果可以跳转请对com.yss.alm.Interceptor.AuthorityInterceptor进行修改,对提交登录的url进行免session检查
[解决办法]
在Struts2中,type="json“这样是用来做AJAX请求的
所以根本就没有跳转页面。
[解决办法]
<global-results>
<!-- 当返回login视图名时,转入/login.html页面 -->
<result name="login">/sylqv.jsp</result>
 </global-results>
 
你这这里的result中,设置一下type,采用redirect的方式,试试。

因为采用type="json"的时候,Struts2会将你Action中的变量转成JSON 返回到页面。
[解决办法]
那我觉得你应该在你前段接收到的结果中,设置一个标志位了,如果接收到你传递的某个结果,你应该在前段页面定向一下。

因为针对ajax请求中,struts是直接输出到请求结果,不负责页面跳转。所以出现了,你的数据到达你请求的页面,而你请求的页面不能处理你的结果信息,导致他变成了空白页。


你可以在firefox中,调试一下~看看下面,请求响应后的json对象,应该是获得["tip":"您还没有登陆,请登陆系统"]这样的东西。
[解决办法]
因为你在地址栏里输入的是main.html请求,所以由你的过滤器处理的信息,依然会返回到main.html页面里,但是你在main.html中,写的js是无法正常解析你返回的json对象,也就是["tip":"您还没有登陆,请登陆系统"],导致你这段js出现异常信息,所以你既没有跳转页面,也没法显示到main.html中信息。

所以,要在main页面中,做接收tip的处理,当服务器响应的是tip的时候,你要让main页面跳转到login.html就好啦!
[解决办法]
那我觉得就应该从json-default这个包考虑了,因为struts是无法控制ajax请求的,也就是说,如果你请求的页面是需要ajax请求action的时候,action只负责把它处理的结果输出来,然后ajax就能捕获这些信息,然后接下来就是ajax做处理了。

但是如果这个时候,你在拦截器里做了跳转,而前段的ajax还等着你返回的字符串呢?

这个东西我也只能解释到这里,我个人实现ajax的能力有限~不好意思。
[解决办法]
我突然想到一个方法,就是你自己写一个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操作之前,被拦截器拦截,返回错误信息
[解决办法]

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

热点排行