zoukankan      html  css  js  c++  java
  • 5、struct2使用登陆的时候重定向功能,如果没有登陆,重定向到登陆页面

    1、实现这样一份功能,列如用户在进行某些操作的时候,如果没有登陆重定向到登陆页面

    首先:我们创建一个功能操作页面,用户准备在该页面执行某些操作

    在index.jsp中

    <%@ page language="java" contentType="text/html; charset=GB18030"
        pageEncoding="GB18030"%>
    <!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=GB18030">
    <title>Insert title here</title>
    </head>
    <body>
        <a href="login.jsp">登录</a><br>
        <a href="mustLogin.action">访问受保护的页面</a><br>
    </body>
    </html>

    然后点击之后访问mustLogin.action这个action

    代码如下

    package com.bjpowernode.struts2;
    
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    
    public class MustLoginAction implements Action {
    
        public String execute() throws Exception {
            if (ActionContext.getContext().getSession().get("user") == null) {
                //重定向到登录页面
                return LOGIN;
            }
            return SUCCESS;
        }
    
    }

    在该操作中:获得请求的session中存在的user用户名,如果用户名为空,就重定向到登陆页面

    ActionContext.getContext().getSession().get("user")

    我们来看下struct.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>
        <!-- 当struts.xml配置文件发生修改,会立刻加载,在生产环境下最好不要配置 -->
        <constant name="struts.configuration.xml.reload" value="true"/>
        <!-- 会提供更加友好的提示信息 -->
        <constant name="struts.devMode" value="true"/>
        <!-- 需要继承struts-default包,这样就拥有的最基本的功能 -->
        <package name="struts2" extends="struts-default">
        
            
            <action name="mustLogin" class="com.bjpowernode.struts2.MustLoginAction">
                
                <result name="login" type="redirect">/login.jsp</result>
            </action>
        </package>
    </struts>

    这里可以进行配置 result的type类型配置成redirect类型,表示重定向到/login.jsp

    type的默认值为dispatcher,就是type="dispatcher,表示转发"
    -->
    <!--
    <result name="login" type="dispatcher">/login.jsp</result>
    -->

    <!--
    type="redirect",可以重定向到任何一个web资源,如:jsp或Action
    如果要重定向到Action,需要写上后缀:xxxx.action
    type="redirectAction",可以重定向到Action,不需要写后缀,此种方式更通用些
    不会因为后缀的改变影响配置

    上面重定向只是针对mustaction有效,我们要针对所有的action都有效,我们可以配置一个全局的重定向

    <?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>
        <!-- 当struts.xml配置文件发生修改,会立刻加载,在生产环境下最好不要配置 -->
        <constant name="struts.configuration.xml.reload" value="true"/>
        <!-- 会提供更加友好的提示信息 -->
        <constant name="struts.devMode" value="true"/>
        <!-- 需要继承struts-default包,这样就拥有的最基本的功能 -->
        <package name="struts2" extends="struts-default">
            <!-- 全局result -->
            <global-results>
                <result name="login" type="redirect">/login.jsp</result>
            </global-results>
    
            
            <action name="mustLogin" class="com.bjpowernode.struts2.MustLoginAction">
                
                
            </action>
        </package>
    </struts>

    总结:

    Struts2的Action访问Servlet API

    1、可以通过ActionContext访问Servlet API,此种方式没有侵入性

    2、在Struts2中默认为转发,也就是<result>标签中的type="dispatcher",type的属性可以修改为重定向
    Struts的重定向有两种:
    type="redirect",可以重定向到任何一个web资源,如:jsp或Action
    如果要重定向到Action,需要写上后缀:xxxx.action
    type="redirectAction",可以重定向到Action,不需要写后缀,此种方式更通用些
    不会因为后缀的改变影响配置

    3、关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法
    他们体现了策略模式,具体Result类型参见:struts-default.xml文件:
    <result-types>
    <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
    <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
    <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
    <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
    <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
    <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
    <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
    <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
    <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
    <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
    </result-types>
    我们完全可以自己根据需求扩展Result类型

    4、全局Result和局部Result

  • 相关阅读:
    线程间的通信
    不用加减乘除做加法
    关键字throw(something)限制
    C++ 中的“ !” 运算
    n个骰子的点数
    State 模式
    Strategy 模式
    构造函数为什么不能是虚函数 ( 转载自C/C++程序员之家)
    n个骰子的点数
    和为S的两个数字
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/8056308.html
Copyright © 2011-2022 走看看