Struts2通过自定义拦截器实现登录之后跳转到原页面

这个功能对用户体验来说是非常重要的。实现起来其实很简单。

拦截器的代码如下:

package go.derek.advice;

import go.derek.entity.User;
import go.derek.util.CommonChecks;
import go.derek.util.Constant;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.StrutsStatics;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class JumpBeforeInterceptor extends AbstractInterceptor implements ApplicationContextAware{

	private static final long serialVersionUID = 7224871247223705569L;

	@Override
	public String intercept(ActionInvocation ai) throws Exception {
		ActionContext actionContext = ai.getInvocationContext();
		Map<String, Object> session = actionContext.getSession();
		User currentUser = (User) session.get(Constant.USER_INFO);
		if (null != currentUser
				&& CommonChecks.isNotEmpty(currentUser.getUserId())) {
			return ai.invoke();//执行下一个拦截器,如果没有拦截器了,就执行action
		}
		else{
				HttpServletRequest request = (HttpServletRequest) actionContext
					.get(StrutsStatics.HTTP_REQUEST);
				String queryString = request.getQueryString();
			    // 预防空指针
			    if (queryString == null) {
					queryString = "";
			    }
			    // 拼凑得到登陆之前的地址
			    String realPath = request.getRequestURI() + "?" + queryString;
			    System.out.println(realPath+"	realPath");
				session.put(Constant.GOING_TO_URL, realPath);
				return ai.invoke();//放行
			}
	}

	@Override
	public void setApplicationContext(ApplicationContext arg0)
			throws BeansException {
		// TODO Auto-generated method stub

	}
}

将上一页面的url放到session中,然后登录的时候再从session中取出来,再重定向就可以了。

loginAction中这样写

String url = (String) this.getSession().get(Constant.GOING_TO_URL);
		if (CommonChecks.isNotEmpty(url)) {
			this.getResponse().sendRedirect(url);
			return null;
		}

struts.xml配置文件中,要对上面的自定义拦截器做配置:

<interceptor name="jumpBefore"
				class="go.derek.advice.JumpBeforeInterceptor"/>
			<interceptor-stack name="jumpTo">
			<!-- 定义拦截器栈包含checkLogin拦截器 -->
			<interceptor-ref name="jumpBefore"></interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>

还要在之前的那个页面对应的action中,把拦截器配置上,比如:

<action name="problems" class="problemsAction">
			<result>/problems.jsp</result>
			<interceptor-ref name="jumpTo" />
		</action>

经过上面的过程,就可以实现登陆之后跳转回原页面了~

Struts2透过自定义拦截器实现登录之后跳转到原页面的更多相关文章

  1. Struts2通过自己定义拦截器实现登录之后跳转到原页面

    这个功能对用户体验来说是非常重要的.实现起来事实上非常easy. 拦截器的代码例如以下: package go.derek.advice; import go.derek.entity.User; i ...

  2. JavaWeb -- Struts 自定义拦截器, 登录权限拦截

    1. 自定义拦截器, 登录权限拦截 login.jsp 登录JSP <%@ page language="java" contentType="text/html; ...

  3. struts2基础——自定义拦截器

    一.自定义拦截器 默认的拦截器能实现的功能是有限的,Struts2 支持自定义拦截器. 二.拦截器类 1.实现 Interceptor 接口 2.继承 AbstractInterceptor 抽象类, ...

  4. 【struts2】自定义拦截器

    1)什么是自定义的拦截器 所谓自定义的拦截器,就是由我们自己定义并实现的拦截器,而不是由Struts2定义好的拦截器.虽然Struts2的预定义拦截器已经满足了大多数情况的需要.但在有些时候,我们可能 ...

  5. struts2 的自定义 拦截器

    Struts2的 拦截器: 对于拦截器,Struts2官方给出的 定义是: 拦截器是动态拦截Action调用的对象.它提供了一种机制,使开发者可以定义一段代码,在Action执行之前或者之后被调用执行 ...

  6. struts2基础---->自定义拦截器

    这一章,我们开始struts2中拦截器的学习. 自定义拦截器

  7. struts2自定义拦截器 设置session并跳转

    实例功能:当用户登陆后,session超时后则返回到登陆页面重新登陆. 为了更好的实现此功能我们先将session失效时间设置的小点,这里我们设置成1分钟 修改web.xml view plainco ...

  8. 【Struts2】自定义拦截器interceptors

    下面给一张图片表示Struts2拦截器的处理流程. 通过这个流程图,我们可以看出一个完整的请求大概的过程为: 请求 -->filter 控制器 --> 拦截器 1/ 拦截器 2--> ...

  9. Struts2笔记——自定义拦截器

    需要两个步骤,自定义类实现拦截器接口和在struts.xml注册拦截器 =============================== 1.自定义类实现com.opensymphony.xwork2. ...

随机推荐

  1. python 3.5构建WINDOWS推送服务

    import ConfigParser import os import sys cf = ConfigParser.ConfigParser() #绝对路径获取 ABSPATH=os.path.ab ...

  2. rzsz的安装

    rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具优点:比ftp命令方便,而且服务器不用打开FTP服务. sz:将选定的文件发送(send)到本地机器rz:运行该命令 ...

  3. tabBar 选中默认蓝色 ,取消选中(自定义)

    - (void)viewDidLoad { [super viewDidLoad]; //    [self _initSubViewControllers]; //    [self _custom ...

  4. jquery点击选中,再次点击取消选中

    if(!$(this).hasClass("current")){ $(this).addClass("current"); }else{ $(this).re ...

  5. JavaScript DOM编程艺术-学习笔记(第三章、第四章)

    第三章: 1.js的对象分为三种:①用户自定义对象 ② 内建对象(js提供的对象) ③宿主对象(js寄宿的环境-浏览器,提供的对象) 2.文档是由节点组成的集合,即dom树,html元素是根元素,是唯 ...

  6. Java代码之输出参数和(强制类型转换)

    说明(因为Java中java Application的参数都是默认的字符型的数据,所以需要强制类型转换这一步骤) 设计思想: 向系统里输入若干个参数,计算出参数个数,利用for语句计算出参数的和.(程 ...

  7. Unity 5 Game Optimization

    2. Scripting Strategies 2.1 Cache Component references (缓存组件引用) 使用 Rigidbody rigidbody = GetComponen ...

  8. android app 集成 支付宝支付 微信支付

    项目中部分功能点需要用到支付功能,移动端主要集成支付宝支付和微信支付 支付宝sdk以及demo下载地址:https://doc.open.alipay.com/doc2/detail.htm?spm= ...

  9. javascript中关于this的理解

    首先看一下这几个定义 this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被视为某个对象的方法调用时,this等于那个对象. 不过,匿名函数的执行环境具有全 ...

  10. for循环---几种写法

    最常见的写法 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...