本文的核心内容:拦截器(拦截栈)、JSP通用跳转
一:Struts2的拦截器(Interceptor) 同一个包中有效。
1. 作用:拦截请求和响应。可将多个Action中的共性代码提取到拦截器中,从而可以减少Action中的代码冗余。(作用类似于Servlet中的Filter)
2. 实现: 实现接口->配置Struts.Xml
3. 拦截响应:ai.invoke()方法之前执行的代码片段,称为拦截请求;ai.invoke()方法之后执行的代码片段,称为拦截响应。
4. 中断请求:
I. 拦截器中可根据条件判断控制程序流程(调用ai.invoke(),到达目标Action)或者根据拦截器的返回结果,中断可断请求,并执行全局跳转。
5. 拦截器栈:
如果不自己定义拦截器:Struts2默认的拦截器部分。
6. 设置引用默认拦截器栈:
7. 书写顺序:package 标签内部书写顺序
I. 拦截器
II. 拦截器栈
III. 默认引用的拦截器(栈)
IV. 全局跳转
V. Action
8. 拦截器不能直接拦截JSP页面。
解决方案 将重要的JSP页面全放入WEB-INF目录下。(防止用户直接访问)
Web.xml设置默认访问页面index.jsp
<welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list>
index.jsp页面使用脚本直接跳转MainAction->主页面
Index.jsp
MainAction
Struts.xml
MainAction只做一件事,加载信息,跳转主页面
通过直接访问Action间接控制JSP页面的访问
9. 方法拦截器
继承MethodFilterInterceptor
配置拦截(黑白名单)
拦截器实战:用户权限验证(用户不登录不能访问任何与自身数据有关操作)
1:用户登录成功后->Session中存储用户的信息。
private String name; private String pwd; //实例属性需要为其提供get/set方法 ,此处省略 public String login() throws Exception { HttpServletResponse response=ServletActionContext.getResponse(); ControlService service=new ControlServiceImpl(); Control con=service.login(name, pwd); ValueStack vs=ActionContext.getContext().getValueStack(); if(con==null){ return Action.NONE; }else{ Cookie cookieName=new Cookie("name",name); Cookie cookiePwd=new Cookie("pwd",pwd); //路径必须设置为当前JSP页面同一级所在路径:/EMSStruts/login.jsp cookieName.setPath("/EMSStruts"); cookiePwd.setPath("/EMSStruts"); response.addCookie(cookieName); response.addCookie(cookiePwd); vs.setValue("#session.con", con); return Action.SUCCESS; } }
2:拦截器的核心方法。
public String intercept(ActionInvocation ai) throws Exception { //通过ai获取值栈->操作OGNL表达式取作用域中的值。 ValueStack vs=ai.getStack(); Control con=(Control)vs.findValue("#session.con"); if(con!=null){ ai.invoke();//已登录->放行。 } return "loginPage";//未登录->全局跳转 }
3:Struts配置文件
<interceptors> <!-- 如果自定义拦截器后、Struts2默认拦截栈将失效,如果需要则需手动引入 --> <interceptor name="check" class="interceptor.CheckInterceptor" /> <!-- 自定义拦截栈可以封装多个拦截栈和拦截器、省去每个Action配置的麻烦 --> <interceptor-stack name="myStack"> <interceptor-ref name="check" /> <!-- 引入Struts2默认拦截栈 --> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <!-- 设置当前包下所有Action默认执行的拦截栈或拦截器->不必再每个Action中手动配置 如果有特殊的拦截器则需在Action中添加 --> <default-interceptor-ref name="myStack" /> <!--设置全局跳转、 name若与Action的name冲突,Action的name优先 --> <global-results> <result name="loginPage" type="redirect">/login.jsp</result> </global-results>
二:配置通用JSP页面跳转
Action跳转JSP页面转为->跳转通用的Action自动完成路径配置。