我使用一个拦截器验证用户是否登录,如果没有登录if(session.get("user")==null){return Action.LOGIN;},result的地址转向login(<result name="login">/login.jsp</result>,url地址是http://localhost:8080/struts2/struts/login.action。我现在的问题是:转到登录页面后为什么我在这个(http://localhost:8080/struts2/struts/login.action)页面上输入用户密码提交后,会出404错误。这是为什么?如何解决?

解决方案 »

  1.   

    拦截器
    package myinterceptor;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    import com.opensymphony.xwork2.ActionInvocation;
    import java.util.*;
    public class MyInterceptor implements Interceptor{
    public String intercept(ActionInvocation invocation)throws Exception{
    Map<?,?> session=invocation.getInvocationContext().getSession();
    if(session.get("user")==null){
    return com.opensymphony.xwork2.Action.LOGIN;
    }
    return invocation.invoke();
    }
    public void init(){

    }
    public void destroy() { }
    }Action代码:
    package myinterceptor;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ActionContext;
    public class ActionAndInterceptor extends ActionSupport{
    private String user;
    private String password;
    public String getUser() {
    return user;
    }
    public void setUser(String user) {
    this.user = user;
    }
    public String getPassword() {
    return password;
    }
    public void setPassword(String password) {
    this.password = password;
    }
    public String execute()throws Exception{
    return SUCCESS;
    }
    public void validate(){
    if(user.equals("myname")&password.equals("mypassword")){
    ActionContext.getContext().getSession().put("user", user);
    }else{
    addFieldError("user",getText("login"));
    }
    }
    }package myinterceptor;
    import com.opensymphony.xwork2.ActionSupport;
    public class MyAction extends ActionSupport{
    public String execute()throws Exception{
    return SUCCESS;
    }
    }struts.xml代码:
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
    <package name="m" namespace="/myinterceptor" extends="struts-default">
    <interceptors >
    <interceptor name="my" class="myinterceptor.MyInterceptor"/>
    <interceptor-stack name="my">
    <interceptor-ref name ="my" /> 
    <interceptor-ref name="defaultStack"/>
    </interceptor-stack>
    </interceptors >
    <action name="MyAction" class="myinterceptor.MyAction">
    <interceptor-ref name="my"/>
    <result name="success">/myinterceptor/MyJsp.jsp</result>
    <result name="input">/index.jsp</result>
    <result name="login">/index.jsp</result>
    </action>
    <action name="ActionAndInterceptor" class="myinterceptor.ActionAndInterceptor">
    <result name="success">/myinterceptor/result.jsp</result>
    <result name="input">/index.jsp</result>
    </action>
    </package>
    </struts>
    JSP:index.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        
      </head>
      
      <body> 
       
        <s:form action="myinterceptor/ActionAndInterceptor.action">
         <s:textfield name="user" label="user"/>
         <s:textfield name="password" label="password"/>
         <s:submit/>
        </s:form>
      </body>
    </html>我首先进入index.jsp页面登录输入用户名和密码,可以运行MyAction 但是我先http://localhost:8080/struts2/myinterceptor/MyAction.action这个时,会显示index.jsp页面,然后输入用户名和密码点提交就会出错
      

  2.   

    是因为命名空间错误导致的。<s:form action="ActionAndInterceptor" namespace="/myinterceptor">
      

  3.   

    修改result:<result name="login" type="redirect">/login.jsp</result>
    重定向跳转到login页面,那么你显示的地址就是http://localhost:8080/struts2/struts/login.jsp,你可以再尝试一下行不行,如果还不行的话可以将代码发给我,相互交流一下.