struts2 的自定义 拦截器
Posted "啷个哩个啷"
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2 的自定义 拦截器相关的知识,希望对你有一定的参考价值。
Struts2的 拦截器:
对于拦截器,Struts2官方给出的 定义是:
拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一段代码,在Action执行之前或者之后被调用执行,也可以在一个Action执行前阻止执行,同时也提供了一种可以提取Action中科重用部分的方式。
通俗一点来说,拦截器是一个实现了一定功能的类,它以一种课插拔的方式(所谓可插拔就是指增加和减少某个功能的时候,不会影响到其他功能的实现),被定义在某个Action执行之前或者之后,用来完成特定的功能。
添加了拦截器执后的执行流程图:
它的设计机制就是:当为Action添加功能的时候就配置拦截器,当为Action减少功能的时候就取消配置拦截器
通过这种方法,在Action所需要功能发生变化的时候,我们只要修改拦截器的配置就能轻松实现。
这里是一个自定义拦截登陆的小案例:
1.声明一个类实现Interceptor接口或者继承AbstractInterceptor类
public class LoginInter implements Interceptor{ public void destroy() { System.out.println("拦截器销毁"); } public void init() { System.out.println("拦截器初始化"); } public String intercept(ActionInvocation actionInvocation) throws Exception { Map<String, Object> session = ActionContext.getContext().getSession(); String value = ""; StringBuilder stringBuilder = new StringBuilder(""); stringBuilder.append(actionInvocation.getProxy().getNamespace()); //拿到 请求的actionname stringBuilder.append(actionInvocation.getProxy().getActionName()); //拿到请求的 namespace 路径 String usernmae = (String) session.get("username"); System.out.println(stringBuilder.toString()+"---------------------"+usernmae); if(stringBuilder.toString().equals("/interlogin")){ value = actionInvocation.invoke(); //放行 }else if(usernmae!=null){ value=actionInvocation.invoke(); }else{ value="login"; } System.out.println(value+"------------------"); return value; } }
这里的意思是:首先判断访问的 url是否是interlogin 就是验证登陆的路径,其次判断登陆成功后的session是否为空,不为空说明已经登陆过了 放行,最后一种情况没有符合前两种情况就让用户重新登陆
value 返回的是逻辑视图名 让value跟配置文件的action中的result去匹配,找到物理视图,返回给用户。
配置文件配置信息:
<!--自定义拦截器 模仿登陆拦截--> <package name="inter" namespace="/inter" extends="struts-default"> <interceptors> <interceptor name="logininter" class="inter.LoginInter"></interceptor> <!--指定自定义的拦截器--> <interceptor-stack name="loginStack"> <!--定义拦截器栈--> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="logininter"></interceptor-ref> </interceptor-stack> </interceptors> <global-results> <result name="login">/jsp/login.jsp</result> <!--定义全局路径--> </global-results> <action name="login" class="action.TestInterAction"> <!--登陆action--> <result name="success">/jsp/welcome.jsp</result> <interceptor-ref name="loginStack"></interceptor-ref> </action> <action name="book" class="action.TestBookAction" > <!--内部访问action--> <result name="success">/jsp/booksuccess.jsp</result> <interceptor-ref name="loginStack"></interceptor-ref> </action> </package>
画个页面:
<title>登陆页面</title> </head> <body> <s:form action="/inter/login" method="POST"> <s:textfield name="username"></s:textfield> <br/> <s:textfield name="pwd"></s:textfield><br/> <s:submit value="提交"></s:submit> </s:form> </body> </html>
创建Action:
private String pwd; private String username; public String execute() throws Exception { System.out.println(pwd+"-------------"+username); Map<String, Object> session = ActionContext.getContext().getSession(); if(pwd!=null&&username!=null) { if (pwd.equals("1") && username.equals("1")) { session.put("username",username); System.out.println("login successg"); return SUCCESS; }else{ return LOGIN; } }else if(session.get("username")!=null){ System.out.println("check session"); return SUCCESS; }else{ System.out.println("return login"); return LOGIN; } }
省略get 和set
首先测试在没有登陆的情况下试着访问内部action
后台 打印结果:
/interbook---------------------null 返回登陆 login------------------
返回登陆页面,说明这个简单的session验证登陆成功的拦截非登陆的情况 下访问内部action
测试登陆 ,action有个简单的逻辑判断
点击提交:进入欢迎界面,看后台打印数据,拿到name和pwd 走逻辑判断,返回给拦截器,然后拦截器去匹配配置文件中result
信息: Deploying web application directory D:\\Tomcat\\Tomcat2\\Tomcat 7.0\\webapps\\manager 十月 25, 2017 2:22:58 下午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deployment of web application directory D:\\Tomcat\\Tomcat2\\Tomcat 7.0\\webapps\\manager has finished in 110 ms /interlogin---------------------null 1-------------1 login successg 判断登陆 success------------------
当再次访问登陆验证时候
/interlogin---------------------1 null-------------null check session 判断登陆 success------------------
由于登陆成功之后将用户放入session中了,所以再次访问登陆路径的时候,判断的 是session,session不为空说明已经登陆了,返回success
这个时候 就可以访问内部的action
这就是一个简单的sturts2 自定义拦截器小案例!
以上是关于struts2 的自定义 拦截器的主要内容,如果未能解决你的问题,请参考以下文章