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 在拦截器中向Action传参的更多相关文章

  1. 如何在Struts2的拦截器中调用Spring容器

    第一种: 通常用ApplicationContext来调用Spring配置文件中的一些Bean,所以首先创建Spring上下文容器. ApplicationContext ac = (Applicat ...

  2. struts2 在拦截器进行注入(依据Action是否实现自己定义接口)

    比如:经常在Action中都须要获取当前登录的User,就须要获取Session.然后从Session获取当前登录的User,由于这些步骤都是反复操作,能够想办法在拦截器中进行实现.能够自己定义一个接 ...

  3. 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】

    一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...

  4. Struts2学习第四天——拦截器及文件上传

    1.概述 Struts2的很多核心功能都是由拦截器完成的. 拦截器很好的实现了AOP的编程思想,在动作的执行之前和结果的返回之后,做拦截处理. 2.struts2的默认拦截器栈 3.自定义拦截器 St ...

  5. 深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载

    一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术. ...

  6. struts文件上传拦截器中参数的配置(maximumSize,allowedTypes ,allowedExtensions)问题

    <interceptor-ref name="fileUpload"> <param name="allowedTypes">image ...

  7. [技巧篇]08.Struts2拦截器中获取Servlet API方法

    讲课中遇到的解决Session拦截器的后腿问题,还有如何在拦截器中获取Servlet API,这里留一个备注,方便学生查找

  8. Struts2 在登录拦截器中对ajax请求的处理

    前言: 由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串. 之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后 ...

  9. struts2总结六: Struts2的拦截器

    一.Struts2的系统结构图

随机推荐

  1. uva 227 Puzzle (UVA - 227)

    感慨 这个题实在是一个大水题(虽然说是世界决赛真题),但是它给出的输入输出数据,标示着老子世界决赛真题虽然题目很水但是数据就能卡死你...一直pe pe直到今天上午AC...无比感慨...就是因为最后 ...

  2. 用fallocate进行"文件预留"或"文件打洞"【转】

    转自uestc-leon的博客 内容作了一些修改,查看原文请访问uestc-leon 1. 什么是空洞文件? "在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件 ...

  3. Python3 编写登陆接口

    题目选自 Alex Python自动化开发之路的题目,我是从C++转学Python的,编写的水平有限,轻喷. 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 首先应该有2个txt文件,包含用户 ...

  4. 2.1.4、SparkEnv中创建BroadcastManager

    Broadcast是分布式的数据共享,由BroadcastManager负责管理其创建或销毁.Broadcast一般用于处理共享的配置文件.通用Dataset.常用数据结构 通过SparkContex ...

  5. [poj1698]Alice's Chance[网络流]

    [转]原文:http://blog.csdn.net/wangjian8006/article/details/7926040 题目大意:爱丽丝要拍电影,有n部电影,规定爱丽丝每部电影在每个礼拜只有固 ...

  6. RPC框架分析

    RPC框架分析 常用的框架 .net(WCF)  .net中分布式框架集大成者,提供多种通信方式,多种安全策略的调用(配置繁琐). java 1.RMI JDK原生(严格的说来算不上框架). 2.Du ...

  7. Sunnypig闯三角关

    背景 贪玩的sunnypig请Charles为他打造一个奇幻世界,Charles欣然答应了.然而一向善于出难题的Charles是决不会轻易让sunnypig轻松拥有一个奇幻世界的,于是Charles在 ...

  8. ddl in PL/SQL

    If you write DDL directly in PL/SQL. You will hit error. 1 DECLARE 2 str_sql varchar2(500); 3 begin ...

  9. HDU--1054--Strategic Game【最小点覆盖】

    链接:pid=1054">http://acm.hdu.edu.cn/showproblem.php?pid=1054 题意:一个熊孩子玩策略游戏,他须要用最少的士兵守卫最多的道路.假 ...

  10. .NET几大热点问题(.NET人员必读)

    下面收集了关于.NET几大热点问题及简要答案,防止我们回答问题不专业的尴尬.同一时候还将一些.NET资源的相关网址罗列一二. 一.什么是.Net?它主要包含什么?  .Net是为简化在第三代因特网的高 ...