struts2 拦截器,该怎么解决

struts2 拦截器
目的:用拦截器实现,当输入为指定的用户名和密码的时候允许登录,否则返回登录页面;
这是action:
package com.zhang;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sun.org.apache.xerces.internal.impl.Constants;

public class LoginAction extends ActionSupport
{
private String username;
private String password;

public String getUsername()
{
return username;
}

public void setUsername(String username)
{
this.username = username;
}

public String getPassword()
{
return password;
}

public void setPassword(String password)
{
this.password = password;
}

public String execute()
{
return "success";
}

}


配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

<constant name="struts.ui.theme" value="simple" />
<package name="user" extends="struts-default" namespace="/user">

<interceptors>
<interceptor name="my" class="com.zhang.LoginInterceptor"></interceptor>
</interceptors>

<action name="login" class="com.zhang.LoginAction">
<result>/success.jsp</result>
<result name="login">/login.jsp</result>
<interceptor-ref name="my"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>

</struts>


login页面只有一个username和一个password文本框和一个登录按钮;

但拦截器不太会写:
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class LoginInterceptor implements Interceptor
{

public void destroy()
{
}

public void init()
{
}

public String intercept(ActionInvocation invocation) throws Exception
{
ActionContext action = invocation.getInvocationContext();
String username = (String) action.get("username");//这里该如何获取login.jsp页面传过来的值?
if (null != username && username.equals("zhang"))
{
System.out.println("拦截器:合法用户登录---");
return invocation.invoke();// 继续面拦截器或action

else
{
System.out.println("拦截器:用户未登录---");
return "login";// 转登录页面
}
}
}

这里应该用不到session,只是获取传过来的值不会获取;
请大家看看;
------解决方案--------------------
看看
------解决方案--------------------
在拦截器的配置中注入参数:

<interceptor-ref name="loginInterceptor">
<param name="username">user01</param>
        <param name="password">123</param>
</interceptor-ref>

然后在你的拦截器类获取参数值:
private String username;
private String password;
并定义Set方法。这样在你的intercept方法就可以拿到你注入的username和password
------解决方案--------------------
action中的实例变量能够在jsp页面中直接访问,是因为使用ongl将实例变量放到了request中的;

而Interceptor中用于过滤,struts认为这个并不直接与jsp页面交互,所以并没有将其中的实例变量放入request中;
------解决方案--------------------
在登陆的action 中   将 用户名 对象 绑定到session

在action包中写一个用来获得session的超类 实现SessionAware接口
protected Map<String, Object> session;

@Override
public void setSession(Map<String, Object> arg0) {
session = arg0;
}

public String execute() {
System.out.println("BaseAction...");
return "success";
}
登陆的action 继承这个父类
做完用户校验后  将用户对象放入session

在拦截器中 
Map<String, Object> session = invocation.getInvocationContext().getSession();  获取session
然后判断就可以了
------解决方案--------------------
引用:
Quote: 引用:


HttpServletRequest request = ServletActionContext.getRequest();
String username = (String)request.getAttribute("username");

还是没取到,我怀疑是我程序的错?

你是POST请求还是GET请求啊,用request.getParameter("username")试下。