拦截器
程序员文章站
2022-06-13 20:54:17
...
拦截器执行流程:
- 启动:
- 创建所有拦截器、执行init()
- 访问:
- 向创建Action
- 再执行拦截器
- 最后,拦截器放行,执行execute()
拦截器案例:
- 需求:
- 登录后显示列表
- 案例准备:
- Struts的jar文件
- DbUtils组件
- 数据库连接池/驱动包
下面来一份简单的拦截器的登录验证案例:
- UserAction:
import cn.jjs.entity.Admin;
import cn.jjs.service.AdminService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.Map;
public class UserAction extends ActionSupport {
/****************1.封装请求数据***********************/
private Admin admin;
public Admin getAdmin() {
return admin;
}
public void setAdmin(Admin admin) {
this.admin = admin;
}
/****************2.调用的service***********************/
private AdminService adminService = new AdminService();
//登录
public String login(){
try {
Admin userInfo = adminService.login(admin);
//判断
if (userInfo == null) {
//登录失败
return "input";
}
//登录成功数据保存在session中
Map<String, Object> session = ActionContext.getContext().getSession();
session.put("userInfo", userInfo);
//登录成功
return "loginSuccess";
}catch (Exception e){
return ERROR;
}
}
//列表
public String list(){
try {
//查找全部
List<Admin> adminList = adminService.getAll();
//保存到request
ActionContext.getContext().getContextMap().put("adminList", adminList);
return "list";
}catch (Exception e){
return ERROR;
}
}
}
- UserCheckInterceptor:
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class UserCheckInterceptor extends AbstractInterceptor {
/**
* 拦截器业务处理方法
*/
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//拿到当前执行的方法名:判断,只有当前方法名不是login,就进行验证。
//拿到actionContext对象
ActionContext ac = invocation.getInvocationContext();
//获取action的代理对象
ActionProxy proxy = invocation.getProxy();
//回去当前执行的方法名
String methodName = proxy.getMethod();
//判断
if(!"login".equals(methodName)){
//先获取当前登录的用户
Object obj = ac.getSession().get("userInfo");
if(obj == null){
//当前用户没有登录
return "input";
}else{
//当前用户有登录
return invocation.invoke();
}
}else{
//说明当前用户正在登陆
return invocation.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>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--1.修改struts默认的访问后缀-->
<constant name="struts.action.extension" value="action,do,"></constant>
<!--2.修改xml自动重新加载-->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!--3.开启动态方法调用(默认不开启)-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!--4.修改上传文件最大为30M-->
<constant name="struts.multipart.maxSize" value="31457280"></constant>
<package name="user" extends="struts-default">
<!--【拦截器配置】-->
<interceptors>
<interceptor name="loginCheck" class="cn.jjs.interceptor.UserCheckInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginCheck"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!--【第一种方法】执行拦截器【当前包下所有action都执行myStack栈-->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!--全局配置-->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="user_*" class="cn.jjs.action.UserAction" method="{1}">
<!--【第二种方法】只是在只一个action中执行myStackzhan
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginCheck"></interceptor-ref>
-->
<!--【第三种方法】与第二种相同,只在这个action中执行自定义栈-->
<interceptor-ref name="myStack"></interceptor-ref>
<!--1.登录失败-->
<result name="input">/login.jsp</result>
<!--2.登录成功-->
<result name="loginSuccess" type="redirectAction">user_list</result>
<!--3.列表展示-->
<result name="list">/WEB-INF/list.jsp</result>
</action>
</package>
</struts>
- list.jsp:
<%--
Created by IntelliJ IDEA.
User: jinshuo
Date: 2019/7/28
Time: 17:26
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>list</title>
</head>
<body>
<table align="center" border="1">
<tr>
<td>序号</td>
<td>编号</td>
<td>用户名</td>
<td>密码</td>
</tr>
<%--<c:forEach--%>
<%--用struts标签迭代数据--%>
<%@taglib prefix="s" uri="/struts-tags" %>
<s:iterator var="admin" value="#request.adminList" status="st">
<tr>
<td>
<s:property value="#st.count"/>
</td>
<td>
<s:property value="#admin.id"/>
</td>
<td>
<s:property value="#admin.userName"/>
</td>
<td>
<s:property value="#admin.pwd"/>
</td>
</tr>
</s:iterator>
<tr>
</tr>
</table>
</body>
</html>
- login.jsp:
<%--
Created by IntelliJ IDEA.
User: jinshuo
Date: 2019/7/28
Time: 17:26
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user_login">
用户名:<input type="text" name="admin.userName">
密码:<input type="text" name="admin.pwd">
<input type="submit" value="登录">
</form>
</body>
</html>
上一篇: SpringBoot 配置文件与依赖库分离打包配置
下一篇: 我做网站三年时间得到的经验