Struts自定义拦截器为什么没执行就直接跳转了?

测试臭手王 2015-03-16 03:01:35
我想做一个登录验证,未登录的其他的所有的action都拦截跳转到登录页面,不知道哪里出错,其他的action总是直接跳转到登录页面,不管是否登陆成功
贴上我的登录action和自定义拦截器,以及struts.xml

登录action

public String login(){
userInfo = new UserInfo();
userInfo.setName(userName);
userInfo.setPassword(userPassword);
if(userService.checkPassword(userInfo)){
status = STATUS_SUCCESS;
}else {
status = STATUS_FAIL;
}
log.info(status+"");
if(status==STATUS_SUCCESS){
ActionContext.getContext().put(Constants.USER_SESSION, userName);
ActionContext.getContext().put(Constants.USER_PASS, userPassword);
Log.info(userName+" log in success!");
return SUCCESS;
}else {
return ERROR;
}
}

拦截器class

public class LoginInterceptor extends AbstractInterceptor {
private static Logger log = LoggerFactory.getLogger(LoginInterceptor.class);

@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
String user = (String) session.get(Constants.USER_SESSION);
log.info(user);
if (!StringUtils.isEmpty(user)) {
log.info(user+" has log in!");
return invocation.invoke();
}else {
log.info("未登录!");
}

ctx.put("tip", "你还没有登录");
return Action.LOGIN;

}

struts.xml

<package name="all" extends="json-default">
<interceptors>
<interceptor name="authority"
class="chris.action.LoginInterceptor"/>
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="authority" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mydefault" />
<global-results>
<result name="login">/admin/login.ftl</result>
</global-results>
</package>
<package name="admin" namespace="/admin" extends="all">
<action name="addUser" class="chris.action.AdminAction" method="addUser">
<result name="success" type="json">
<param name="includeProperties">status</param>
</result>
</action>
<action name="login" class="chris.action.AdminAction" method="login">
<result name="success" type="freemarker">/admin/welcome.ftl</result>
<result name="error" type="freemarker">/admin/login.ftl</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<action name="welcome" class="chris.action.AdminAction" method="welcome">
<result name="success" type="freemarker">/admin/welcome.ftl</result>
</action>
</package>
...全文
212 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
测试臭手王 2015-04-02
  • 打赏
  • 举报
回复
哎,可能是jboss的问题,重启服务器就正常了
__威少__ 2015-03-17
  • 打赏
  • 举报
回复
引用 5 楼 Super_xiao 的回复:
[quote=引用 2 楼 s120922718 的回复:] <action name="login" class="chris.action.AdminAction" method="login"> <result name="success" type="freemarker">/admin/welcome.ftl</result> <result name="error" type="freemarker">/admin/login.ftl</result> <interceptor-ref name="defaultStack"></interceptor-ref> </action> 把name="defaultStack"改成你自定义的拦截器名试一下
改成我的就直接把登陆的动作都拦截了,那就没法在session里面put了[/quote] 确实不能这样配置,没详细看题目。 你登录的时候没有put进去session吧,getContext以后是不是还需要调用getSession再put
测试臭手王 2015-03-17
  • 打赏
  • 举报
回复
确切地说是拦截器只执行了一次,之后就直接不执行了,直接跳转到login界面了
一大三千 2015-03-17
  • 打赏
  • 举报
回复
引用 4 楼 Super_xiao 的回复:
[quote=引用 3 楼 u011726984 的回复:] 配置文件的12行name=“error”。还有24行的拦截器name="mydefault"
12行name="login"是因为我的拦截class返回的ACTION.LOGIN是"login",我当然要用全局的login来跳转撒,24行的就是为了登陆这个举动不被拦截,所以写了默认的拦截器的,我现在的问题是拦截器没有执行class里面的interceptor方法,直接跳到了login的页面,不管登陆与否[/quote]那你就在拦截器里排除登录行为的方法啊!有个<param name="excludeMethods">login</param>这个参数。
测试臭手王 2015-03-16
  • 打赏
  • 举报
回复
引用 2 楼 s120922718 的回复:
<action name="login" class="chris.action.AdminAction" method="login"> <result name="success" type="freemarker">/admin/welcome.ftl</result> <result name="error" type="freemarker">/admin/login.ftl</result> <interceptor-ref name="defaultStack"></interceptor-ref> </action> 把name="defaultStack"改成你自定义的拦截器名试一下
改成我的就直接把登陆的动作都拦截了,那就没法在session里面put了
测试臭手王 2015-03-16
  • 打赏
  • 举报
回复
引用 3 楼 u011726984 的回复:
配置文件的12行name=“error”。还有24行的拦截器name="mydefault"
12行name="login"是因为我的拦截class返回的ACTION.LOGIN是"login",我当然要用全局的login来跳转撒,24行的就是为了登陆这个举动不被拦截,所以写了默认的拦截器的,我现在的问题是拦截器没有执行class里面的interceptor方法,直接跳到了login的页面,不管登陆与否
一大三千 2015-03-16
  • 打赏
  • 举报
回复
配置文件的12行name=“error”。还有24行的拦截器name="mydefault"
__威少__ 2015-03-16
  • 打赏
  • 举报
回复
<action name="login" class="chris.action.AdminAction" method="login"> <result name="success" type="freemarker">/admin/welcome.ftl</result> <result name="error" type="freemarker">/admin/login.ftl</result> <interceptor-ref name="defaultStack"></interceptor-ref> </action> 把name="defaultStack"改成你自定义的拦截器名试一下
测试臭手王 2015-03-16
  • 打赏
  • 举报
回复
求助啊,大神们

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧