`
starbhhc
  • 浏览: 658353 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

struts2拦截器使用(用户session失效后的统一页面指向)

 
阅读更多

 

用户登录之后session我们设置一定的时间失效,失效后页面的转向问题一般都是跳回主页或者是我们自定义的页面

action:

package com.tkbs.web.interceptors;

import java.util.Date;
import java.util.Map;

import javax.annotation.Resource;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.tkbs.domain.user.UserAccounts;
import com.tkbs.service.user.UserService;

/**
 * 用户拦截器
 * author zxg
 * version 1.0
 */
public class UserInterceptor implements Interceptor {

    private static final long serialVersionUID = 5582842221490358379L;

    public void destroy() {

    }

    /**
     * 在服务启动的时候执行
     */
    public void init() {
    }

    public String intercept(ActionInvocation actionInvocation) throws Exception {
        System.out.println("<<<教师拦截器初始化...");

        ActionContext ctx = ActionContext.getContext();
        Map session = ctx.getSession();
        // sessionUser 如果session中不存在用户在返回index视图
        if (session.get("sessionUser")== null) {
            return "index";
        }
        String result = actionInvocation.invoke();
        return result;
    }
}

如果注册页面的请求也包含在拦截器的拦截中加以判断:

package com.tkbs.web.interceptors;

import java.util.Date;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.tkbs.domain.user.UserAccounts;
import com.tkbs.service.user.UserService;

/**
 * 用户拦截器
 * author zxg
 * version 1.0
 */

public class UserInterceptor implements Interceptor {

    private static final long serialVersionUID = 5582842221490358379L;

    public void destroy() {

    }

    /**
     * 在服务启动的时候执行
     */
    public void init() {
    }

    public String intercept(ActionInvocation actionInvocation) throws Exception {
        System.out.println("<<<教师拦截器初始化...");

        ActionContext ctx = ActionContext.getContext();
        Map session = ctx.getSession();
        // sessionStudent
        if (session.get("sessionUser")== null) {
            
            //判断是不是注册用户,如果是注册用户(包含userRegisterPage)则继续执行,否则跳转到index视图
            HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST); 
            String uri = request.getRequestURI();
            if(uri.indexOf("userRegistPage") == -1) {
                return "index";
            }
        }
        String result = actionInvocation.invoke();
        return result;
    }
}

这里用户的拦截器定义在user包下

User包下拦截器
<!-- user 包配置 -->
    <package name="user" extends="myDefault" namespace="/user">
        <interceptors>
            <interceptor name="userInterceptor"
                class="com.tkbs.web.interceptors.UserInterceptor">
            </interceptor>
            <interceptor-stack name="userStack">
                <interceptor-ref name="userInterceptor"></interceptor-ref>
                <interceptor-ref name="myDefaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 默认拦截器,此包下所有的ACTION将都被拦截。如果ACTION再定义了拦截器,则失效 -->
        <default-interceptor-ref name="userStack"></default-interceptor-ref>
        <global-results>
            <!-- 首页-->
            <result name="index">/index.jsp</result>
        </global-results>
        <!-- *_*_*
            页面转向${ctp}/page/resource_queryResource_resourceList
            ...actions.page.resource.queryResource[method=resourceList]
            ...actions.page.resource.queryResourceDetial[method=resourceDetial]
        -->
        <action name="*_*_*" class="{2}Action" method="{3}">
            <result name="update" type="redirectAction">
                <param name="actionName">
                    userDiary_userDiary_diaryShow
                </param>
                <param name="namespace">/user</param>
                <param name="parse">true</param>
                <param name="diaryId">${diaryId}</param>
                <param name="userId">${userId}</param>
            </result>
            <!-- page 与包相应  -->
            <result name="{3}" type="dispatcher">
                /modulePage/{1}/{3}.jsp
            </result>
            <!-- json  -->
            <result name="json" type="json" />
            <!-- user -->
            <result name="pwdUpOff" type="redirectAction">
            <param name="namespace">/user</param>
            <param name="actionName">
                userUser_user_userIndex
            </param>
            <param name="parse">true</param>
             </result>
        </action>
    </package>

全局拦截器的定义:

全局拦截器:
    <!-- default (全局)包配置 -->
    <package name="myDefault" extends="json-default" namespace="/">
        <interceptors>
            <interceptor name="configInterceptor"
                class="com.tkbs.web.interceptors.ConfigInterceptor">
            </interceptor>
            <!-- 默认的必须放在最下面! -->
            <interceptor-stack name="myDefaultStack">
                <interceptor-ref name="configInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 默认拦截器,此包下所有的ACTION将都被拦截。如果ACTION再定义了拦截器,则失效 -->
        <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
        <global-results>
            <!-- 首页-->    
            <result name="index">/index.jsp</result>
            <result name="adminLoginPage">
                /moduleAdmin/index/adminLogin.jsp
            </result>
        </global-results>
        <!-- 用户登录 login_adminLogin/userLogin-->
        <action name="login_*" class="loginAction" method="{1}">
            <!-- 前台用户登录 userLogin-->
            <result name="loginMessage" type="json"></result>
            <result name="adminLogSuccess" type="redirectAction">
                <param name="actionName">
                    index_indexManage_adminIndex
                </param>
                <param name="namespace">/admin</param>
            </result>
            <result name="adminLoginIn">
                /moduleAdmin/index/adminIndex.jsp
            </result>
            <result name="adminLoginPage">
                /moduleAdmin/index/adminLogin.jsp
            </result>
        </action>
        <!-- 用户退出登录-->
        <action name="existLogin_*" class="existLoginAction"
            method="{1}">
            <result name="index">/index.jsp</result>
        </action>
    </package>

Struts2分别对Request、Session和Application三个对象封装成了三个Map对象,直接使用封装好的Map对象来读取和保存数据。可以通过com.opensymphony.xwork2.ActionContext类来得到这三个对象。ActionContext是Action执行的上下文,保存了很多对象如parameters、request、session、application和locale等。通过ActionContext类获取Map对象的方法为:

ActionContext context=ActionContext.getContext(); --得到Action执行的上下文

Map request=(Map)context.get("request");--得到HttpServletRequest的Map对象 

Map session=context.getSession();--得到HttpSession的Map对象

Map application=context.getApplication();--得到ServletContext的Map对象

HttpServletRequest request = (HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST); 

HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);

 

web.xml配置

<!-- session超时定义,单位为分钟 -->
    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>
    <!-- struts2 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            <!--org.apache.struts2.dispatcher.FilterDispatcher-->
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>
    <!-- 配置struts2的CleanUp的Filter -->
    <filter>
        <filter-name>struts-cleanup</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ActionContextCleanUp
        </filter-class>
    </filter>
    <filter-mapping>

分享到:
评论

相关推荐

    struts2拦截器使用(用户session失效后的统一页面指向).docx

    在这个文档中,我们关注的是Struts2的拦截器(Interceptor)的使用,特别是如何在用户Session失效后将其重定向到一个统一的页面。拦截器是Struts2框架的核心组件之一,它在Action执行前后执行特定的逻辑,提供了扩展...

    struts2拦截器和验证框架(适合初学者-经藏版)

    通过以上详细介绍,我们了解了Struts2中的拦截器和验证框架的基本概念、如何创建自定义拦截器以及如何配置拦截器和使用验证功能。这些知识点对于初学者来说非常重要,能够帮助他们更好地理解和使用Struts2框架。

    Ajax Session失效跳转登录页面的方法

    通过这种方式,当用户的Session失效后,用户仍然可以收到错误提示,并能够被引导回登录页面,从而能够重新登录继续使用应用。 此外,文章中提及的SecurityContextUtil是一个用于维护用户安全上下文的工具类。在拦截...

    Spring+Struts2+hibernate+Redis整合

    - Struts2拦截器:如果需要在Struts2中使用缓存,可以自定义拦截器,实现请求前检查缓存,请求后更新缓存的功能。 6. **优化与实践**: - 使用Redis的发布/订阅(Pub/Sub)功能进行消息通信,例如通知缓存更新。 -...

    struts2与cookie实现自动登录

    - Struts2的拦截器或自定义过滤器会检测到这个Cookie,读取其值并解密。 - 检查解密后的Token是否存在于服务器的Session中。如果存在,说明该用户已经通过了身份验证,可以直接跳转到主页面,实现自动登录效果;...

    JSP和Struts解决用户退出问题

    Struts的配置文件可以设定拦截器链,确保用户在未验证的情况下无法访问受保护的页面。 总的来说,解决用户退出问题需要多方面的考虑,包括但不限于session管理、HTTP响应头的设置、防止页面缓存以及利用MVC框架如...

    struts做的登陆

    - **预处理**:可以使用Struts2的内置拦截器或自定义拦截器,在Action执行前进行一些操作,如权限检查。 - **后处理**:在Action执行后,拦截器可以做一些收尾工作,如记录日志。 8. ** session管理** - **登录...

    struts2令牌

    当用户首次访问需要进行表单操作的页面时,Struts2会在用户的会话中生成一个唯一的令牌值,并将其存储在`session`中。这通常通过在表单中加入以下代码片段来实现: ```xml &lt;s:token name="user.token"&gt;&lt;/s:token&gt; ``...

    Struts2 图片验证码

    在实际应用中,Struts2的拦截器(Interceptor)机制也可以用来增强验证码的处理。例如,可以编写一个专门的拦截器,对每个请求检查是否需要验证码,以及验证用户输入的验证码是否正确。 总的来说,Struts2图片...

    ajax请求Session失效问题

    因此,我们可以在服务器端的拦截器(如Struts2的Interceptor)中检查这个字段,以此来区分AJAX请求和普通请求。 以下是一个简单的示例,展示了如何在Struts2拦截器中处理这个问题: ```java public String ...

    struts token机制解决表单重复提交

    1. **配置Action**:在Struts的配置文件(struts.xml或struts.properties)中,为需要防止重复提交的Action添加一个拦截器,通常是`token`和`tokenSession`拦截器。 2. **生成Token**:在Action的准备方法(Prepare...

    完美解决ajax访问遇到Session失效的问题

    以下是一个简单的Struts2拦截器示例,用于处理Ajax请求和Session失效的情况: ```java public String intercept(ActionInvocation invocation) throws Exception { ActionContext ac = invocation....

    struts下的多台web服务器登陆处理

    对于Struts框架,可以利用Struts的拦截器实现自定义的登录验证逻辑,结合上述方法实现跨服务器的登录状态一致性。 总之,处理多台Web服务器的登录问题,需要考虑系统的扩展性、性能和安全性,选择合适的技术方案并...

    struts1的令牌解决页面重复提交问题

    在struts-config.xml中,添加`token`拦截器到Action配置中,确保它在`execute`拦截器之前: ```xml ``` #### 2.3 表单处理 在JSP页面上,添加一个隐藏字段来存放令牌值: ```jsp &lt;!-- form fields --&gt;...

    struts 令牌机制(Token)

    `&lt;interceptor-ref name="token"&gt;`表示使用了令牌拦截器,`&lt;param name="strict"&gt;true&lt;/param&gt;`表示开启严格模式,即当令牌失效时,会抛出异常,而不是简单地返回输入页面。 此外,`TokenAwareActionSupport`类是...

    struts token的例包

    - 在Action类中,可以使用`TokenSessionStore`拦截器,它会在用户请求时生成Token,并将其存入Session。 - 在JSP页面中,通过`s:token`标签生成隐藏字段,将Token放入表单中。 - 提交表单时,`TokenSessionStore`...

    SSH整合项目中容易出现的错误

    统一异常处理策略,如使用Spring的@ControllerAdvice或Struts2的全局异常拦截器。 以上只是部分常见的SSH整合错误,实际开发中可能还会遇到其他问题。解决这些问题需要对SSH框架有深入理解,熟悉其内部原理和配置...

    Struts2+Spring3.0+Hibernate开发问题总结+知识讲解

    其核心概念包括拦截器(Interceptor)、结果类型(Result)和Action配置。在实际开发中,可能会遇到如Action调用异常、视图解析错误等问题,解决方法通常涉及检查配置文件、依赖注入及Action类的编写。 2. **Spring...

Global site tag (gtag.js) - Google Analytics