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拦截器(Interceptor) Struts2拦截器(Interceptor)
解决Struts2中的中文乱码。该代码是用作Struts2的拦截器中
struts2常用拦截器,struts2经常用到的拦截器,熟悉熟悉
该例子为struts2注解与拦截器demo,利用myEclipse8.5开发,导入刚才后,自动加载所需struts2的jar包,可以直接运行,是初学struts2注解、拦截器很好的例子,保证10分钟学会2种技术,愿意分享给大家。
关于struts2 拦截器的详细的解释及其在开发中对struts2的拦截器的应用和拦截器在框架中的作用.
struts2,Interceptor struts2拦截器实例,两套实例,一套是针对单个的action配置的,另一套实例是针对全局的action配置的拦截器interceptor
struts2 Interceptor拦截器 http://whitewolf.0fees.net
使用Struts2实现用户权限拦截、重点是掌握拦截器的使用和配置方法,通过案例的学习,就能掌握struts中拦截器的使用方法,让我们能快速上手
Struts2拦截器.ppt Struts2拦截器.ppt Struts2拦截器.ppt
Struts2拦截器源程序 Struts2拦截器源程序 Struts2拦截器源程序 Struts2拦截器源程序 Struts2拦截器源程序
详细说明了struts2中拦截器的使用。并且通过一个小例子讲解了拦截器的具体使用
Struts2在com.opensymphony.xwork2.interceptor.annotations包中定义了3个拦截器注解类型。
基于struts2的拦截器测试,实现了页面的跳转,中间过程的拦截
1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按...
struts2拦截器应用小例子,与大家共分享
struts2 用拦截器 实现用户权限登录 可以直接运行,只单单用到struts的东西。
Struts2拦截器实现权限控制demo,我感觉对初学者还是有一定帮助的
Struts2的核心,拦截器的应用!!!
Struts2的拦截器的使用详解实例 博文链接:https://zmx.iteye.com/blog/457434
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.