• struts2学习(6)自定义拦截器-登录验证拦截器


    需求:对登录进行验证,用户名cy 密码123456才能登录进去;

             登录进去后,将用户存在session中;

               其他链接要来访问(除了登录链接),首先验证是否登录,对这个进行拦截;

    com.cy.model.User.java:

    package com.cy.model;
    
    public class User {
        private String userName;
        private String password;
        
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        
    }
    View Code

    com.cy.action.UserAction.java:

    package com.cy.action;
    
    import java.util.Map;
    
    import com.cy.model.User;
    import com.cy.service.UserService;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UserAction extends ActionSupport{
    
        private static final long serialVersionUID = 1L;
        
        private User user;
        private UserService userService = new UserService();
        private String error;
        
        public String getError() {
            return error;
        }
    
        public void setError(String error) {
            this.error = error;
        }
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
    
        @Override
        public String execute() throws Exception {
            if(userService.login(user)){
                ActionContext actionContext = ActionContext.getContext();
                Map<String, Object> session = actionContext.getSession();
                session.put("currentUser", user);
                return SUCCESS;
            }else{
                this.error = "用户名或密码错误";
                return ERROR;
            }
        }
        
    }

    com.cy.action.GrilAction.java:

    package com.cy.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class GrilAction extends ActionSupport{
        private static final long serialVersionUID = 1L;
    
        @Override
        public String execute() throws Exception {
            System.out.println("看美女");
            return SUCCESS;
        }
        
    }
    View Code

    com.cy.interceptor.LoginInterceptor.java:

    package com.cy.interceptor;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    
    public class LoginInterceptor implements Interceptor{
        
        private static final long serialVersionUID = 1L;
    
        public void destroy() {
            System.out.println("LoginInterceptor销毁");
        }
        
        public void init() {
            System.out.println("LoginInterceptor初始化");
        }
        
        public String intercept(ActionInvocation invocation) throws Exception {
            System.out.println("在Action执行之前");
            ActionContext actionContext = invocation.getInvocationContext();
            Map<String, Object> session = actionContext.getSession();
            Object currentUser = session.get("currentUser");
            String result = null;
            if(currentUser != null){
                result = invocation.invoke();
            }else{
                HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);
                request.setAttribute("error", "请先登录!");
                result = "error";
            }
                
            System.out.println("在Action执行之后");
            
            return result;                            
        }
    
    }

    com.cy.service.UserService.java:

    package com.cy.service;
    
    import com.cy.model.User;
    
    public class UserService {
        
        public boolean login(User user){
            if("cy".equals(user.getUserName()) && "123456".equals(user.getPassword())){
                return true;
            }else{
                return false;
            }
        }
    }
    View Code

    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>
        
        <package name="manage" namespace="/" extends="struts-default">
            <interceptors>
                <interceptor name="loginInterceptor" class="com.cy.interceptor.LoginInterceptor"></interceptor>
                
                <interceptor-stack name="myStack">
                    <interceptor-ref name="loginInterceptor"></interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            
            <!-- package默认使用myStack 这个包下面的每个action默认使用myStack拦截器栈-->
            <default-interceptor-ref name="myStack"></default-interceptor-ref>
            
            <global-results>
                <result name="error">error.jsp</result>
            </global-results>
            
            <action name="gril" class="com.cy.action.GrilAction">
                <result name="success">success.jsp</result>
                
                <!-- 定义了默认的拦截器栈,这里就注释掉
                    <interceptor-ref name="loginInterceptor"></interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                 -->
            </action>
            
            <action name="user" class="com.cy.action.UserAction">
                <result name="success">success.jsp</result>
                <!-- 因为登录的时候不需要进行登录验证,不需要使用loginInterceptor
                      因此这里就写defaultStack
                      写了defaultStack action就不会再使用其他的拦截器了。
                 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
            
        </package>
        
    </struts>

    success.jsp:

    <body>
        当前用户: ${currentUser.userName}
    </body>
    View Code

    error.jsp:

    <body>
        错误信息:${error} <a href="login.jsp">登录</a>
    </body>

    login.jsp:

    <body>
        <form action="user" method="post">
            用户名: <input type="text" name="user.userName"/><br>
            密码: <input type="text" name="user.password"/><br>
            <input type="submit" value="登录" />
        </form>
    </body>
    View Code

    测试:

    没有登录,直接访问gril链接:

    进行登录,并且登录成功:

    再次访问gril链接就ok了,console:

    在Action执行之前
    看美女
    在Action执行之后

    -------------

  • 相关阅读:
    如何更专业的使用Chrome开发者工具
    Javascript中的Object对象
    【leetcode】 Remove Duplicates from Sorted List
    Windows上x86程序正常但x64程序崩溃问题
    Microsoft source-code annotation language (SAL) 相关
    Visual Studio 2013 编译CEF步骤
    C++中调用Python脚本
    MFCButton Memory leak(内存泄露问题)
    快速排序
    插入排序
  • 原文地址:https://www.cnblogs.com/tenWood/p/7102772.html
Copyright © 2020-2023  润新知