struts2-权限拦截器、日志拦截器、execAndWait(进度条)拦截器配置
1.权限拦截器
package login;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class LoginInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation ai) throws Exception {
//取得请求的URL
String url = ServletActionContext.getRequest().getRequestURL().toString();
HttpServletResponse response=ServletActionContext.getResponse();
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires",0);
System.out.println("execute LoginInterceptor");
//对登录与注销请求直接放行,不予拦截
if (url.indexOf("login.action")!=-1 || url.indexOf("logout.action")!=-1)
{
return ai.invoke();
}
else
{
//验证Session是否过期
if(!ServletActionContext.getRequest().isRequestedSessionIdValid())
{
//session过期,转向session过期提示页,最终跳转至登录页面
return "tologin";
}
else
{
String systemUser =(String) ServletActionContext.getRequest().getSession().getAttribute("user");
//验证是否已经登录
if (systemUser==null)
{
//尚未登录,跳转至登录页面
return "tologin";
}
else
{
return ai.invoke();
}
}
} } }
LoginInterceptor
2.日志拦截器
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.interceptor.PreResultListener;
public class DologInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
// TODO Auto-generated method stub
} @Override
public void init() {
// TODO Auto-generated method stub
}
LogDao ld=new LogDao();
@Override
public String intercept(ActionInvocation ai) throws Exception {
ai.addPreResultListener(new PreResultListener() {
public void beforeResult(ActionInvocation ai, String arg1) {
try {
boolean param=true;
System.out.println("execute DologIntercepter");
OperateLog log=new OperateLog();
long time=System.currentTimeMillis();
log.setId(time);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd H:m:s");
String operatetime=format.format(new Date()).toString();
log.setOperatetime(operatetime);
Map<String, Object> session = ai.getInvocationContext().getSession();
String user = (String) session.get("user");
if (user != null)
{
log.setOperator(user);
}
else
{
log.setOperator("operator:can't get form system");
}
String operation="className:" + ai.getAction() + " ";
operation=operation+"methodName:" + ai.getInvocationContext().getName()+ " "; Map<String, Object> map = ai.getInvocationContext().getParameters();
Set<String> keys = map.keySet();
if (keys==null||keys.size()==0)
{
param=false;
System.out.println("parameters null");
}
else
{
operation=operation+"Parameters:";
for (String key : keys)
{
operation=operation+key + "=" + ((Object[]) map.get(key))[0]+ "#";
}
}
operation=operation+" executeResult:" + ai.getResultCode() + " ";
log.setOperation(operation);
if (param)
{
ld.save(log);
System.out.println("print the log object:"+log);
}
} catch (Exception e) {
e.printStackTrace();
} }
});
return ai.invoke();
}
}
DologInterceptor
3.execAndWait为struts2自带拦截器,这里不附源代码
前台与execAndWait配合的页面代码:
重点是: <meta http-equiv="refresh" content="3;url=generatePath.action">
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>My JSP 'indicate_waiting.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!-- 下面的meta元素才是重点,其他的没什么影响,是IDE自带的 -->
<meta http-equiv="refresh" content="3;url=generatePath.action">
<title> 正在查询,请稍等...</title>
<style type="text/css">
.query_hint{
border:5px solid #939393;
width:400px;
height:50px;
line-height:55px;
padding:0 20px;
position:absolute;
left:40%;
margin-left:-140px;
top:30%;
margin-top:-40px;
font-size:15px;
color:#333;
font-weight:bold;
text-align:center;
background-color:#f9f9f9;
}
.query_hint img{position:relative;top:10px;left:-8px;}
</style>
</head> <body>
<div id="query_hint" class="query_hint">
<img src="data:images/waiting.gif" />正在执行查询,请稍等...<%-- <s:property value="complete"/> --%>
</div> </html>
indicate_waiting.jsp
4.在struts.xml中对拦截器的配置
<package name="generatepath" namespace="/" extends="struts-default">
<interceptors>
<!-- 定义权限控制拦截器 -->
<interceptor name="loginVerify" class="login.LoginInterceptor"></interceptor>
<!-- 定义日志拦截器 -->
<interceptor name="dolog" class="dolog.DologInterceptor"></interceptor>
<!-- 定义一个包含登陆控制和日志管理的拦截器栈 -->
<interceptor-stack name="mydefaultStack">
<interceptor-ref name="loginVerify"></interceptor-ref>
<interceptor-ref name="dolog"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="execAndWait">
<param name="delay">1000</param>
<param name="delaySleepInterval">1000</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认拦截器 -->
<default-interceptor-ref name="mydefaultStack"></default-interceptor-ref>
<!-- 定义全局处理结果 -->
<global-results>
<result name="tologin" type="redirect">/session.jsp</result>
</global-results>
<action name="generatePath" class="neo4j.PathIndicationAction" method="doIndicatePath">
<result name="wait">/work/search/indicate_waiting.jsp</result>
<result name="indicateResult">/work/search/pathIndication.jsp</result>
</action>
</package>
5.后台实现代码略。
struts2-权限拦截器、日志拦截器、execAndWait(进度条)拦截器配置的更多相关文章
- vue-music 关于Player (播放器组件)--播放和进度条
迷你播放器 1.播放器组件会在各个页面的情况下会打开. 首先在vuex state.js 中定义全局的播放器状态 import {playMode} from 'common/js/config.js ...
- 基于<MediaElement>的WPF视频播放器(可拖拽进度条播放)【1】
一.前言 前两天上峰要求做一个软件使用向导,使用WPF制作.这不,这两天从一张白纸开始学起,做一个播放演示视频的使用向导.以下是粗设计的原型代码: 二.效果图 三.代码 前台代码: < ...
- MediaPlayer音乐播放器、上一首、下一首、播放、停止、自动下一首、进度条
本文介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用Med ...
- Struts2各个功能详解(2)-输入校验和拦截器
前面知道了struts2的架构图和struts2的自动封装表单参数和数据类型自动转换,今天来学struts2的第三第四个东西,输入校验和拦截器. 一:输入校验 客户端校验进行基本校验,如检验非空字段 ...
- 拦截器——原理(AOP、责任链模式、配置)
1.Struts2拦截器概述: (1)Struts2框架封装中封装了很多功能,这些功能其实都是封装在Struts2的拦截器里面,Struts2里面有很多拦截器,每次不是这些拦截器都执行,每次只执行默认 ...
- Flume自定义拦截器(Interceptors)或自带拦截器时的一些经验技巧总结(图文详解)
不多说,直接上干货! 一.自定义拦截器类型必须是:类全名$内部类名,其实就是内部类名称 如:zhouls.bigdata.MySearchAndReplaceInterceptor$Builder 二 ...
- springmvc3 拦截器,过滤ajax请求,判断用户登录,拦截规则设置
web.xml设置:(/拦截所有请求) <servlet> <servlet-name>dispatcher</servlet-name> <servlet- ...
- 【spring boot】7.静态资源和拦截器处理 以及继承WebMvcConfigurerAdapter类进行更多自定义配置
开头是鸡蛋,后面全靠编!!! ======================================================== 1.默认静态资源映射路径以及优先顺序 Spring B ...
- 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示
1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...
随机推荐
- Android子线程更新UI的方法总结
版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...
- 线程暴长~Quartz中创建Redis频繁后导致线程暴长
在最近项目开发过程中,在进行任务调度处理过程中,出现了一个问题,它的线程数暴长,从20多个可以到1000多个,如果你的服务器性能好的话,可以到10000多个,太恐怖了,就算你的服务再好,早晚有一天也会 ...
- Error: [$injector:unpr] angular.js
首先去看控制器是否存在错误 (function () { angular.module('myApp.demo', []) .controller('demoCtrl', ['$scope', '$r ...
- ADO.NET 快速入门(十一):连接池
这个示例演示了如何构建一个到数据源的连接池.你可以通过连接池部署高性能的应用程序.本例中使用连接串创建连接池,并且由 SqlConnection 自动管理. string connString; ...
- 使用synchronize同步关键字来同步代码快
1.synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有 ...
- 极限编程(XP)基本原则与规范
1. 坐在一起(Sitting Together) 尽可能让团队成员坐在一起,Kent Block在一次芝加哥的某个濒临困境的项目中发现,虽然这个团队都是由程序 精英组成,但是却陷入困境,后来他发现, ...
- Codeforces Gym 100425A Luggage Distribution 二分 数学
A - Luggage DistributionTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/c ...
- iOS开发——数据持久化&本地数据的存储(使用NSCoder将对象保存到.plist文件)
本地数据的存储(使用NSCoder将对象保存到.plist文件) 下面通过一个例子将联系人数据保存到沙盒的“documents”目录中.(联系人是一个数组集合,内部为自定义对象). 功能如下: ...
- mybatis 关联映射传递多参数方法
<resultMap type="com.secoo.my.bean.OrderItemComment" id="orderItemResult"> ...
- C++ 模板类demo
#include <iostream> using namespace std; template <typename T> class MyVector { friend o ...