第一次使用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,画面显示空白画面。求哪位大侠解答一下我哪里出了问题。谢谢
我的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,画面显示空白画面。求哪位大侠解答一下我哪里出了问题。谢谢
<global-results>
<!-- 当返回login视图名时,转入/login.html页面 -->
<result name="login">/sylqv.jsp</result>
</global-results>
这里定义的明明是 返回login时,转入/sylqv.jsp页面啊。当然不会到login.html页面了
<global-results>
<!-- 当返回login视图名时,转入/login.html页面 -->
<result name="login">/login.html</result>
</global-results>
案例说不论那个,也都应该有跳转的行为,可是现在的情况是 压根不跳转
按理说不论写那个,也都应该有跳转的行为,可是现在的情况是 压根不跳转
可是我悲催的就是不能跳转到登录画面它就是不跳转啊。
这个type="json" 我还真没用过,你看下去掉会不会跳到main.html
如果没有变化,发出来,再讨论。
设置为redirect的结果是一样的。我试过了
CRIPT5022: You're trying to decode an invalid JSON String:如果改成type="json" 不报错,却直接到了登录后画面,拦截器给出的调试信息确实对的 打出了“没有登陆”
struts2没有用过以前,,不知道为什么
2、如果可以跳转请对com.yss.alm.Interceptor.AuthorityInterceptor进行修改,对提交登录的url进行免session检查
1就过去去,不是这个问题。前台还是报CRIPT5022: You're trying to decode an invalid JSON String:
所以根本就没有跳转页面。
那应该如何改呢
这个项目是EXT4 + SSH + ORACLE
<!-- 当返回login视图名时,转入/login.html页面 -->
<result name="login">/sylqv.jsp</result>
</global-results>
你这这里的result中,设置一下type,采用redirect的方式,试试。因为采用type="json"的时候,Struts2会将你Action中的变量转成JSON 返回到页面。
设置了 结果就是前台页面是空白 报错了 提示CRIPT5022: You're trying to decode an invalid JSON String:
你可以在firefox中,调试一下~看看下面,请求响应后的json对象,应该是获得["tip":"您还没有登陆,请登陆系统"]这样的东西。
不过感觉越来越接近真相了
我在url输入的是main.html
在main.html里会引入一些js
js里有同步的ajax请求。而login.html里没有ajax 只有ext的 submit请求。
这样的话会不会很麻烦啊,我需要在每个不是login.html的页面都加上相应的tip处理么
其实 ctx.put("tip", "您还没有登陆,请登陆系统"); 这个意识信息对我可有可无。能不能从修改拦截器入手呢?
1. 访问main.hmtl
2. filter过滤,如果用户为空,则直接sendRedirect()到登录页面,否则加载html页面
3. 加载html页面的时候,遇到js加载action的时候,继续会走filter,但是这个时候,你已经通过验证了,所以就能通过你的那个检证了,正常加载数据之前的加载流程是:
1. 访问main.html
2. 遇到js加载action,访问action
3. action操作之前,被拦截器拦截,返回错误信息
实验一下,恐怕白折腾了