拦截器应用案例
需求:当用户登陆成功,跳转到显示用户的JSP页面中。当用户登陆失败,重新返回登陆界面。如果用户直接访问显示用户的JSP页面,那么返回到登陆界面
这里写图片描述
分析
实现这个需求,我们可以使用过滤器的。只要获取用户的请求URL,再判断URL是不是为list.jsp,如果是,我们返回到登陆的界面就好了。
现在,为了对拦截器的理解,我们使用拦截器去完成这个功能!
搭建配置环境
-
导入我们c3p0.xml文件
-
导入c3p0开发包
-
导入mysql开发包
-
写数据库连接池工具类
-
dbUtils开发包
-
8个struts2需要用到的开发包
这里写图片描述
-
创建数据库表,导入数据
这里写图片描述
编写entity
package zhongfucheng.entity; /** * Created by ozc on 2017/5/3. */ public class User { private String id ; private String username; private String cellphone; private String email; private String password; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getCellphone() { return cellphone; } public void setCellphone(String cellphone) { this.cellphone = cellphone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
编写DAO
package zhongfucheng.dao; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import zhongfucheng.entity.User; import zhongfucheng.utils.Utils2DB; import java.sql.SQLException; import java.util.List; /** * Created by ozc on 2017/5/3. */ public class UserDao { public User login(User user) { try { String sql = "SELECT * FROM user WHERE username = ? AND password = ?"; QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource()); return (User) queryRunner.query(sql, new BeanHandler(User.class), new Object[]{user.getUsername(), user.getPassword()}); } catch (SQLException e) { new RuntimeException("登陆失败了!"); } return null; } public List<User> getAll() { try { String sql = "SELECT * FROM user"; QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource()); return (List<User>) queryRunner.query(sql, new BeanListHandler(User.class)); } catch (SQLException e) { new RuntimeException("登陆失败了!"); } return null; } }
编写Service
public class Service { UserDao userDao = new UserDao(); public User login(User user) { return userDao.login(user); } public List<User> getAll() { return userDao.getAll(); } }
编写登陆的JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登陆页面</title> </head> <body> <form action="${pageContext.request.contextPath}/user_login" method="post"> <input type="text" name="username"><br> <input type="password" name="password"><br> <input type="submit" value="登陆"><br> </form> </body> </html>
编写处理请求的Action
package zhongfucheng.action; import com.opensymphony.xwork2.ActionContext; import zhongfucheng.entity.User; import zhongfucheng.service.Service; import java.util.List; import java.util.Map; /** * Created by ozc on 2017/5/3. */ public class UserAction { /****************1.封装数据********************/ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } /***************2.调用Service*******************/ Service service = new Service(); //登陆 public String login() { User user = service.login(this.user); if (user == null) { return "input"; } else { //将user的信息存到Session域对象中 Map<String, Object> session = ActionContext.getContext().getSession(); session.put("user", user); //登陆成功 return "login"; } } //查看user信息 public String list() { //拿到所有用户的信息 List<User> users = service.getAll(); //存到request域对象中 Map<String, Object> request = ActionContext.getContext().getContextMap(); request.put("users", users); return "list"; } }
struts.xml配置文件
<package name="xxx" extends="struts-default" > <action name="user_*" class="zhongfucheng.action.UserAction" method="{1}" > <!--如果登陆成功,重定向到Action中,执行list业务方法--> <result name="login" type="redirectAction">user_list</result> <!--如果是list,那么跳转到list.jsp页面--> <result name="list" >/WEB-INF/list.jsp</result> </action> </package>
到目前为止,我们登陆或者不登陆都可以得到用户的具体信息….这是不合理的
我们想要的效果是:只有用户正在调用login方法,或者该用户已经登陆了,才可以查看具体的用户信息。
因此,我们们要拦截它们,只有用户调用的是login方法时或者已经登陆的情况下,才能跳转到对应的显示页面
拦截器
package zhongfucheng; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * Created by ozc on 2017/5/3. */ public class Interceptor extends AbstractInterceptor{ @Override public String intercept(ActionInvocation actionInvocation) throws Exception { //得到正在执行的代理对象 ActionProxy proxy = actionInvocation.getProxy(); //通过代理对象得到正在执行的方法 String method = proxy.getMethod(); //如果方法的名字不是login,那么就让他们返回到login页面上 if (!method.equals("login")) { //查看用户是否登陆了 Object user = ActionContext.getContext().getSession().get("user"); //如果没有登陆,回到login页面 if (user == null) { return "input"; } else { //登陆了,那么就让它访问具体的用户信息页面 return actionInvocation.invoke(); } } else { //如果是访问login方法,那么就让它执行 return actionInvocation.invoke(); } } }
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="xxx" extends="struts-default"> <interceptors> <!--配置自定义的拦截器--> <interceptor name="Interceptor1" class="zhongfucheng.Interceptor"/> <!--配置拦截器栈,把默认的拦截器栈都加载自定义的拦截器栈中--> <interceptor-stack name="myStack"> <interceptor-ref name="Interceptor1"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <!--让Struts执行拦截器--> <!--【执行拦截器:第一种写法: 当前包下所有的acntion都执行myStack栈】--> <default-interceptor-ref name="myStack"></default-interceptor-ref> <!--第二种写法: 只是在这一个Action中执行myStack栈 <interceptor-ref name="defaultStackt"></interceptor-ref> <interceptor-ref name="loginCheck"></interceptor-ref> --> <!-- 第三种写法:执行用户栈(与第二种写法一样, 只在当前aciton中执行自定义栈) --> <!-- <interceptor-ref name="myStack"></interceptor-ref>--> <action name="user_*" class="zhongfucheng.action.UserAction" method="{1}"> <!--如果登陆成功,重定向到Action中,执行list业务方法--> <result name="login" type="redirectAction">user_list</result> <!--如果是list,那么跳转到list.jsp页面--> <result name="list">/WEB-INF/list.jsp</result> <!--如果是直接访问Action或者没有用户登陆,返回login页面--> <result name="input">/login.jsp</result> </action> </package> </struts>
效果:
只有当用户登陆了才能查看用户具体信息,直接访问Action会跳转回
这里写图片描述