一点废话
在上篇文章中我们已经说了如何自定义拦截器。
那么我们就可以使用自定义拦截器来实现日常我们经常遇到的小功能。
例如:
在慕课网 我们找到视频要点击开始学习时,会弹出登录的页面。
在京东网上买商品时,点击结算也会弹出登录的页面
在这里使用我们的自定义拦截器就能够实现这个功能。
检查登录的拦截器案例
需求
首先说说我们的需求:
1.假设我们共三个页面,登录页面,主页,其它页面
2.当我们访问主页,或者其它页面时检测用户是否登录
3.如果未登录,跳转到登录页面
4.如果已经登录,就可以访问主页和其它页面。
如何实现呢?
我们都知道用户每次访问服务器都会实例化一个session对象,我们可以在用户成功登录后把用户的帐号保存在session对象中。然后在拦截器中检测session对象是否存在,以此来检测用户是否登录。
实现步骤
- 创建一个普通类,继承AbstractInterceptor,实现抽象方法intercept
- 在struts.xml中配置拦截器
- 声明拦截器
- 使用拦截器
普通类MyIntercepter .java 自定义拦截器
根据session对象里面的username属性来判断用户是否登录来执行不同的操作。当用户未登录 返回input视图。如果登录,放行Action动作
public class LoginIntercepter extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//获取session对象
HttpSession session=ServletActionContext.getRequest().getSession();
//从session对象中获得username
String username=(String) session.getAttribute("username");
/*
* 判断username是否为空(用户是否登录)
* 用户未登录 返回input视图
* 用户登录 放行action
*/
if(StringUtils.isEmpty(username)){
return "input";
}
String res=invocation.invoke();
return res;
}
}
在struts.xml中配置拦截器
struts.xml 在这个配置文件里,配置了一个struts2框架预定义的拦截器,名称为LoginIntercepter。然后就是根据需求来判断LoginIntercepter拦截器需要和那些Action动作装配。
我们首先分析一下
- 未登录访问主页 返回登录页面
- 未登录访问其它页面 返回登录页面
- 未登录访问登录页面呢?
仔细分析就能看出 未登录访问登录页面肯定是可以通过的。否则就陷入死循环了 永远登录不上。
然后就是为访问主页和访问其它页面的action装配拦截器了。
而为了代码的简洁性,我们可以把input视图设置为全局逻辑结果视图。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
<package name="user" extends="struts-default" namespace="/user">
<!-- 声明自己定义的拦截器,名字以及对应的java类 -->
<interceptors>
<interceptor name="myIntercepter" class="com.scx.web.intercepter.LoginIntercepter"></interceptor>
</interceptors>
<!-- 全局逻辑结果视图 -->
<global-results>
<result name="input">/login.jsp</result>
</global-results>
<!-- 用户登录的操作方法 -->
<action name="login" class="com.scx.web.action.UserAction" method="login">
<result name="success" type="redirectAction">toMain</result>
</action>
<!-- 显示主页的操作方法 -->
<action name="toMain" class="com.scx.web.action.UserAction" method="main">
<interceptor-ref name="myIntercepter"></interceptor-ref>
<result name="success">/main.jsp</result>
</action>
<!-- 显示另一个页面的操作方法 -->
<action name="toOther" class="com.scx.web.action.UserAction" method="other">
<interceptor-ref name="myIntercepter"></interceptor-ref>
<result name="success">/other.jsp</result>
</action>
</package>
</struts>
JSP页面
login.jsp 登录页面 。如图所示 很简单。就不再说了
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>验证登录的拦截器案例</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.action">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="login"/>
</form>
<hr>
<a href="${pageContext.request.contextPath}/user/toMain.action"> 前往主页</a>
<a href="${pageContext.request.contextPath}/user/toOther.action"> 前往其它页面</a>
</body>
</html>
main.jsp和other.jsp 仅仅为了测试。
运行结果
提出新的问题
到这里可能有人会说,如果我们有很多个页面 我们需要在每个页面上都配置拦截器吗?这样是不是很复杂。而且在配置拦截器过后,默认的拦截器都不再工作了不会有其它问题发生吗?如果想知道,接着看下篇文章吧~会有解决办法的。