目标:登录验证,登录成功转向成功页面,可以进行用户添加操作,登录失败转向失败页面,未登录就输入添加用用户的连接则非法,强制跳转到登陆页面
1 . 首先添加struts2 jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
freemarker-2.3.16.jar
javassist-3.7.ga.jar
ognl-3.0.jar
struts2-core-2.2.1.jar
xwork-core-2.2.1.jar
2 . 配置strtus的拦截器,在web.xml配置
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. 编写登陆验证的Ation ,LoginAction.java
//实现modelDriven接口 public class LoginAction implements ModelDriven{ private User user ; @Override public Object getModel() { if(user == null){ user = new User(); } return user ; } //账号密码判断 public String login(){ //账号密码正确进入成功页面 if("admin".equals(user.getUsername()) && "admin".equals(user.getPassword())){ //把user放到session ActionContext.getContext().getSession().put("Login", user); return "success" ; } //否则进入失败页面 return "fail"; } }
4 . 编写模拟用户添加的action
public class UserAction { public String add(){ return "add"; } }
5 . 编写判断是否登陆的拦截器
//实现Interceptor接口 public class LoginInterceptor implements Interceptor{ @Override public void destroy() { } @Override public void init() { } @Override public String intercept(ActionInvocation invocation) throws Exception { //如果从session取不到值的话,表示用户未登录,转到登陆页面 if(invocation.getInvocationContext().getSession().get("Login")==null){ return "index"; } //继续往下执行 return invocation.invoke(); } }
6 . 配置struts.xml文件,分三部分贴
(1) 配置登陆拦截器和默认使用的拦截器
<!-- 一系列的拦截器 --> <interceptors> <!-- 登陆用到的拦截器 --> <interceptor name="logininterceptor" class="cn.com.action.LoginInterceptor"> </interceptor> <!-- 拦截栈 --> <interceptor-stack name="needLoginStack"> <interceptor-ref name="exception" /> <interceptor-ref name="logininterceptor" /> <interceptor-ref name="alias" /> <interceptor-ref name="servletConfig" /> <interceptor-ref name="i18n" /> <interceptor-ref name="prepare" /> <interceptor-ref name="chain" /> <interceptor-ref name="debugging" /> <interceptor-ref name="scopedModelDriven" /> <interceptor-ref name="modelDriven"> <param name="refreshModelBeforeResult">true</param> </interceptor-ref> <interceptor-ref name="fileUpload" /> <interceptor-ref name="checkbox" /> <interceptor-ref name="multiselect" /> <interceptor-ref name="staticParams" /> <interceptor-ref name="actionMappingParams" /> <interceptor-ref name="params"> <param name="excludeParams"> dojo\..*,^struts\..* </param> </interceptor-ref> <interceptor-ref name="conversionError" /> <interceptor-ref name="validation"> <param name="excludeMethods"> input,back,cancel,browse </param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods"> input,back,cancel,browse </param> </interceptor-ref> </interceptor-stack> <!-- The completeStack is here for backwards compatibility for applications that still refer to the defaultStack by the old name --> <interceptor-stack name="completeStack"> <interceptor-ref name="defaultStack" /> </interceptor-stack> <!-- Sample execute and wait stack. Note: execAndWait should always be the *last* interceptor. --> <interceptor-stack name="executeAndWaitStack"> <interceptor-ref name="execAndWait"> <param name="excludeMethods">input,back,cancel</param> </interceptor-ref> <interceptor-ref name="defaultStack" /> <interceptor-ref name="execAndWait"> <param name="excludeMethods">input,back,cancel</param> </interceptor-ref> </interceptor-stack> <!-- 未配置登陆验证的拦截栈 --> <interceptor-stack name="otherStack"> <interceptor-ref name="exception" /> <interceptor-ref name="alias" /> <interceptor-ref name="servletConfig" /> <interceptor-ref name="i18n" /> <interceptor-ref name="prepare" /> <interceptor-ref name="chain" /> <interceptor-ref name="debugging" /> <interceptor-ref name="scopedModelDriven" /> <interceptor-ref name="modelDriven"> <param name="refreshModelBeforeResult">true</param> </interceptor-ref> <interceptor-ref name="fileUpload" /> <interceptor-ref name="checkbox" /> <interceptor-ref name="multiselect" /> <interceptor-ref name="staticParams" /> <interceptor-ref name="actionMappingParams" /> <interceptor-ref name="params"> <param name="excludeParams"> dojo\..*,^struts\..* </param> </interceptor-ref> <interceptor-ref name="conversionError" /> <interceptor-ref name="validation"> <param name="excludeMethods"> input,back,cancel,browse </param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods"> input,back,cancel,browse </param> </interceptor-ref> </interceptor-stack> </interceptors>
2 . 配置默认使用登陆拦截器
<default-interceptor-ref name="needLoginStack"></default-interceptor-ref> <global-results> <result name="index">/index.jsp</result> </global-results>
3 . 配置LoginAction 和UserAction
<action name="login" class="cn.com.action.LoginAction"> <result name="success">/success.jsp</result> <result name="fail">/fail.jsp</result> <!-- 很明显,登陆判断的Action并不需要判断是否登陆 --> <interceptor-ref name="otherStack"></interceptor-ref> </action> <action name="user" class="cn.com.action.UserAction"> <result name="add">/addSuccess.jsp</result> <!-- 除了登陆判断的Action,其他所有的Action都需要判断是否已经登陆,登陆方能操作 --> <interceptor-ref name="needLoginStack"></interceptor-ref> </action>
4 . struts.xml总体配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="system" namespace="/system" extends="struts-default"> <!-- 一系列的拦截器 --> <interceptors> <!-- 登陆用到的拦截器 --> <interceptor name="logininterceptor" class="cn.com.action.LoginInterceptor"> </interceptor> <!-- 拦截栈 --> <interceptor-stack name="needLoginStack"> <interceptor-ref name="exception" /> <interceptor-ref name="logininterceptor" /> <interceptor-ref name="alias" /> <interceptor-ref name="servletConfig" /> <interceptor-ref name="i18n" /> <interceptor-ref name="prepare" /> <interceptor-ref name="chain" /> <interceptor-ref name="debugging" /> <interceptor-ref name="scopedModelDriven" /> <interceptor-ref name="modelDriven"> <param name="refreshModelBeforeResult">true</param> </interceptor-ref> <interceptor-ref name="fileUpload" /> <interceptor-ref name="checkbox" /> <interceptor-ref name="multiselect" /> <interceptor-ref name="staticParams" /> <interceptor-ref name="actionMappingParams" /> <interceptor-ref name="params"> <param name="excludeParams"> dojo\..*,^struts\..* </param> </interceptor-ref> <interceptor-ref name="conversionError" /> <interceptor-ref name="validation"> <param name="excludeMethods"> input,back,cancel,browse </param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods"> input,back,cancel,browse </param> </interceptor-ref> </interceptor-stack> <!-- The completeStack is here for backwards compatibility for applications that still refer to the defaultStack by the old name --> <interceptor-stack name="completeStack"> <interceptor-ref name="defaultStack" /> </interceptor-stack> <!-- Sample execute and wait stack. Note: execAndWait should always be the *last* interceptor. --> <interceptor-stack name="executeAndWaitStack"> <interceptor-ref name="execAndWait"> <param name="excludeMethods">input,back,cancel</param> </interceptor-ref> <interceptor-ref name="defaultStack" /> <interceptor-ref name="execAndWait"> <param name="excludeMethods">input,back,cancel</param> </interceptor-ref> </interceptor-stack> <!-- 未配置登陆验证的拦截栈 --> <interceptor-stack name="otherStack"> <interceptor-ref name="exception" /> <interceptor-ref name="alias" /> <interceptor-ref name="servletConfig" /> <interceptor-ref name="i18n" /> <interceptor-ref name="prepare" /> <interceptor-ref name="chain" /> <interceptor-ref name="debugging" /> <interceptor-ref name="scopedModelDriven" /> <interceptor-ref name="modelDriven"> <param name="refreshModelBeforeResult">true</param> </interceptor-ref> <interceptor-ref name="fileUpload" /> <interceptor-ref name="checkbox" /> <interceptor-ref name="multiselect" /> <interceptor-ref name="staticParams" /> <interceptor-ref name="actionMappingParams" /> <interceptor-ref name="params"> <param name="excludeParams"> dojo\..*,^struts\..* </param> </interceptor-ref> <interceptor-ref name="conversionError" /> <interceptor-ref name="validation"> <param name="excludeMethods"> input,back,cancel,browse </param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods"> input,back,cancel,browse </param> </interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="needLoginStack"></default-interceptor-ref> <global-results> <result name="index">/index.jsp</result> </global-results> <action name="login" class="cn.com.action.LoginAction"> <result name="success">/success.jsp</result> <result name="fail">/fail.jsp</result> <!-- 很明显,登陆判断的Action并不需要判断是否登陆 --> <interceptor-ref name="otherStack"></interceptor-ref> </action> <action name="user" class="cn.com.action.UserAction"> <result name="add">/addSuccess.jsp</result> <!-- 除了登陆判断的Action,其他所有的Action都需要判断是否已经登陆,登陆方能操作 --> <interceptor-ref name="needLoginStack"></interceptor-ref> </action> </package> </struts>
6 .编写四个页面
(1)登陆页面index.jsp
<form action="system/login!login.action" method="post"> 用户名:<input type="text" name="username"><br> 密码: <input type="password" name="password"><br> <input type="submit" value="登陆"> </form>
(2) 登陆失败和成功页面
success.jsp
<h1> 登陆成功</h1><br> <h1><a href="system/user!add.action"> 添加用户</a></h1><br>
fail.jsp
<center> <h1>登陆失败</h1><br> </center>
(3) 添加用户成功页面 addSuccess.jsp
<center> <h1>添加一个用户成功</h1> </center>
最后,启动服务器测试
输入用户名和密码admin可以登陆,可以添加用户
评论