`
ronon
  • 浏览: 192794 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2 在拦截器中向Action传参

 
阅读更多

struts.xml配置文件:

<package name="system-default" extends="struts-default" abstract="true">  
    <!-- struts2拦截器,拦截方法 -->  
        <interceptors>  
                  
            <!-- 定义拦截器栈,所谓拦截器栈,是指由一个或多个拦截器组成  
				 struts2 提供的拦截器栈,包含了struts2的很多核心拦截器    
				 自己定义的放在最后面,struts2定义的放在前面  
             -->  
			 
            <interceptor-stack name="default-stack">  
                <interceptor-ref name="defaultStack"></interceptor-ref>  
                <!-- 登录拦截器 -->  
            <interceptor-ref name="webLoginInter">  
  
                  <param name="excludeMethods">     
                   toLogin,                           
                   getSessionValiCode,                
                   login,                             
                     toRegister,                  
                     register,                        
                     regAgreement,                    
                     logout                           
                  </param>  
            </interceptor-ref>  
              
            <!-- includeMethods表示包含指定的方法,即对标记为includeMethods的方法进行拦截,对应Action映射method -->  

            </interceptor-stack>  
        </interceptors>  
        <default-interceptor-ref name="default-stack"></default-interceptor-ref>  
  
        <global-results>  
           <!--将cookie里的信息传递到login方法中进行自动登录-->  
           <result name="login" type="redirectAction">>  
            <param name="namespace">/info</param>  
            <param name="actionName">login</param>  
            <!--userInfo.loginName:userInfo是要跳转至的Action中的某一属性名,loginName是该userInfo对象里的某一字段名,花括号里的字段名,对应拦截器里自定义的"key"-->  
            <param name="userInfo.loginName">${loginName}</param>  
            <param name="userInfo.loginWord">${loginWord}</param>  
        </result>  
        </global-results>  
    </package>

 

 

 

java(拦截器)代码:

import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

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


//可以继承 MethodFilterInterceptor ,也可以继承 AbstractInterceptor,此处两者都可以用
public class WebLoginInterceptor extends MethodFilterInterceptor{


	private String excludeMethods;//在struts.xml中定义的参数,不拦截这些方法
	

	public String getExcludeMethods() {
		return excludeMethods;
	}

	public void setExcludeMethods(String excludeMethods) {
		this.excludeMethods = excludeMethods;
	}
	

	//获取struts.xml中配置的不需要拦截的 methodName组,与当前请求的methodName进行匹配,如果包含则返回true
	private boolean isExcludeMethods(String methodName)
	{
		boolean flag=false;
        String [] excludeMethodsArray = excludeMethods.split(",");  
        for (int i = 0; i < excludeMethodsArray.length; i++) {
        	String excludeMethod=excludeMethodsArray[i].replace("\n", "").replace("\t", "").replace(" ", "");
            if (methodName.equals(excludeMethod)) {  
            	flag=true;
            	break;
            }  
        } 
        
        return flag;
	}

	/*
	 *根据索引获取cookie中的信息,
	 *注意:在javascript中设置cookies时要先做encodeURIComponent(),不然一些特殊字符传到这里来会丢失
	 */
	private String getCookieByIndex(HttpServletRequest request,int index)
	{
		String returnStr="";
		String nm="";
		String psd="";
		String invalidDate="";
		String isLogin="";
		try {
			Cookie[] cookies=request.getCookies();
			for(Cookie cookie : cookies)
			{
				//username 是cookie参数名(key)
				if("username".equals(cookie.getName()))
				{
					    //获取参数值
					    String userStr = new String(cookie.getValue());
						//客户端做过encode,这里要decode
					    userStr=URLDecoder.decode(userStr,"UTF-8");
						
						//此处根据自己业务来,当前项目是用以下特殊符号将用户名密码等信息分割开来放在一个参数中,所以才这样写
						if (userStr!=""){ 
							int index1 = userStr.indexOf("%%"); 
							int index2 = userStr.indexOf("&&"); 
							int index3 = userStr.indexOf("##"); 
							if(index1>-1)
							{
								nm=userStr.substring(0,index1);
								if(index2>-1)
								{
									psd=userStr.substring(index1+2,index2); 
								}
							}
							if(index3>-1)
							{
								if(index2>-1)
								{
									invalidDate=userStr.substring(index2+2,index3);
								}
								isLogin= userStr.substring(index3+2);
							}
							
						}
					    break;
				}
			}
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	    
		//用户名
		if(index==1)
		{
			returnStr=nm;
		}
		//密码
		if(index==2)
		{
			returnStr=psd;
		}
		//失效日期
		if(index==3)
		{
			returnStr=invalidDate;
		}
		//是否登录
		if(index==4)
		{
			returnStr=isLogin;
		}
		
	    return returnStr;
	}
	
	//用户未登录的情况下,拦截非ajax请求,根据cookie里的相关信息进行自动登录
	@Override
	public String doIntercept(ActionInvocation actionInvocation) throws Exception {
		
		String result = null;
		try {
			Map<String,Object> session = ActionContext.getContext().getSession();
			
			HttpServletRequest request = ServletActionContext.getRequest(); 
			HttpServletResponse response = ServletActionContext.getResponse(); 
			
			//获取请求Namespace
			String namespace = actionInvocation.getProxy().getNamespace();
			//获取请求ActionName
			String actionName = actionInvocation.getProxy().getActionName();
			//获取请求Method
			String method = actionInvocation.getProxy().getMethod();
			//获取请求方法
			String name = actionInvocation.getInvocationContext().getName();
			//获取请求参数
			Map<String,Object> params = actionInvocation.getInvocationContext().getParameters();
			
			//被拦截URL地址
			String   url=request.getScheme()+"://";   
		    url+=request.getHeader("host");   
		    url+=request.getRequestURI();   
		    if(request.getQueryString()!=null){   
		              url+="?"+request.getQueryString();
		    }
		    

		    //从session中得到userInfo
			if(userInfo==null)
			{
			    //过滤不需要拦截的方法名
			    if(isExcludeMethods(method)==true)
			    {
			    	return actionInvocation.invoke();
			    }
			    //由于ajax请求不受控(不会根据返回的result进行跳转),因此只对http请求做处理
			    if(request.getHeader("X-Requested-With") == null || !request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest"))
			    {
				    //获取cookie里的值,判断是否满足自动登录的条件,满足就自动登录
					String nm=getCookieByIndex(request,1);
					String psd=getCookieByIndex(request,2);
					String isLogin= getCookieByIndex(request,4);
					//用户名密码不为空,且用户勾选过自动登录
				    if("1".equals(isLogin) && !"".equals(nm) && !"".equals(psd))
				    {
		        		log.info("action name:" + actionInvocation.getAction());
		        		log.info("functional action name:" + actionName);
		        		log.info("使用cookie中保存的用户信息进行自动登录...");
		        		
                                         ///!!!!此处是关键
				    	//将用户名密码存入值栈中,以便于传递到其他的Action,对应struts.xml中的配置
				        actionInvocation.getStack().set("loginName", nm);
				        actionInvocation.getStack().set("loginWord", psd);
				    	
				    	//重定向到UserInfoAction的login方法中,login方法是一个登录方法,转到这个方法之后,会进行正常的登录操作
				    	return "login";
				    }
			    }
			    
			
			}
			
	    	result = actionInvocation.invoke();
		} catch (Exception e) {
			actionInvocation.getInvocationContext().put("errorMsg", e.getMessage());
			e.printStackTrace();
	
		}
		
        return result;
	}

}

 javascript代码:

就两个方法
1.设置cookie
2.获取cookie
对 document.cookie 的值来进行读、写就可以了
写入时记得要encodeURIComponent()
读取时记得要decodeURIComponent()

 

分享到:
评论

相关推荐

    struts2入门(传参)

    这个入门实例主要关注如何在Struts2中传递参数,实现一个简单的登录功能。在这个过程中,我们将涉及到以下几个核心概念和步骤: 1. **Struts2架构**: Struts2框架基于拦截器(Interceptor)模型,它通过Action类...

    struts2 使用action属性接收中文参数(post提交)

    这篇名为“Struts2 使用action属性接收中文参数(post提交)”的博文可能讲述了如何在Struts2框架中正确处理中文POST请求。在处理中文参数时,主要涉及以下几个关键知识点: 1. **字符编码设置**: - 请求编码:...

    struts2 向结果传参数

    在Struts2中,结果(Result)是动作(Action)执行后跳转的目标,它可以是一个JSP、Servlet或其他资源。有时我们需要在Action执行后向结果传递参数,以便在目标页面中使用这些参数来呈现数据或执行某些逻辑。本文将...

    webwork 权限拦截器

    在WebWork的配置文件(如`struts-config.xml`)中,我们可以指定哪些Action需要通过`AuthInterceptor`,以及其在拦截器链中的位置。 ```xml &lt;action name="protectedAction" path="/protected" parameter="execute...

    HttpClient基本功能使用(结合Struts2传参)

    在Struts2中,我们通常通过Action类和结果类型来处理用户请求。HttpClient可以帮助我们在后台模拟用户请求,与Struts2 Action进行交互,以便测试或实现服务间通信。 在使用HttpClient时,我们需要创建一个`...

    struts2基本知识

    - **Method属性**: 在Struts2配置文件中,可以通过`method`属性指定要调用的Action方法。如果没有指定`method`属性,框架默认调用`execute()`方法。 ```xml &lt;action name="login" class=...

    Struts2入门教程(全新完整版)

    1.概述strust2中的拦截器 28 2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 ...

    多action之间跳转传参问题

    - ActionContext:在Struts2中,每个Action都有一个ActionContext对象,它包含了当前请求的所有信息,包括值栈。我们可以把数据放入ActionContext,然后在其他Action中通过ActionContext获取。 - ModelDriven:...

    struts1总结

    - 支持自定义拦截器,方便扩展和复用功能。 3.2 不足: - 性能相比现代框架较低,因为每个请求都需要经过Struts1的处理。 - 配置文件复杂,容易出错且不易维护。 - 对于异步请求和复杂前端交互的支持不够理想。...

    Struts开发文档

    在 `web.xml` 中进行配置后,该过滤器将拦截所有请求并根据配置的 `struts.xml` 文件进行相应的处理。 综上所述,通过以上步骤,您可以成功地搭建并配置一个基本的Struts2应用程序。Struts2不仅简化了Java Web应用...

    java web 面试

    其工作流程包括用户发送请求,Struts拦截器进行处理并转发给相应的Action,Action执行业务逻辑后返回视图,最终呈现给用户。 #### 六、Hibernate查询方式 **知识点6:Hibernate查询方式** Hibernate提供了多种...

Global site tag (gtag.js) - Google Analytics