JavaEE中Filter實現用戶登錄攔截


  實現思路是編寫過濾器,如果用戶登錄之后session中會存一個user。如果未登錄就為null,就可以通過過濾器將用戶重定向到登陸頁面,讓用戶進行登陸,當然過濾器得判斷用戶訪問的如果是登陸請求需要放行,如果不是就需要進行攔截並進行驗證。登陸成功再session存存入user,這樣過濾器每次都會通過。

1.首先編寫驗證登陸的過濾器

package danger.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import danger.bean.sys.User;

/**
 * Servlet Filter implementation class LoginFilter
 */
public class LoginFilter implements Filter {

    /**
     * Default constructor.
     */
    public LoginFilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String path = req.getRequestURI();
        System.out.println("reqURL----------" + path);
        // 如果包含login.jsp證明是登陸就放行
        if (path.contains("login") || path.contains("/js/") || path.contains("/image/") || path.contains("/css/")
                || path.contains("message.jsp")|| path.contains("404.jsp")|| path.contains("/images/")) {
            chain.doFilter(request, response); // 放行
            return;
        }
        HttpServletResponse res = (HttpServletResponse) response;
        HttpSession session = req.getSession();
        User user =  (User) session.getAttribute("user");
        // 如果session中存在user證明用戶登錄,可以放行。否則認為未登陸重定向到login.jsp
        if (user == null) {
            res.sendRedirect(req.getContextPath() + "/login/login.jsp");
        } else {
            System.out.println("user----------"+user);
            chain.doFilter(request, response);
        }

    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}

 

 

   if (path.contains("login") || path.contains("/js/") || path.contains("/image/") || path.contains("/css/") || path.contains("message.jsp")|| path.contains("404.jsp")|| path.contains("/images/")) { chain.doFilter(request, response); // 放行 return; }      相當於是對登陸請求以及一些靜態資源放行。(可以將一些靜態資源放到統一的文件夾下面)

 

 

 2.web.xml進行配置

    <filter>
        <filter-name>loginFilter</filter-name>
        <filter-class>danger.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>loginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

 3.進行測試:

項目名字為danger。再瀏覽器訪問:http://localhost/danger/

 

控制台打印:

reqURL----------/danger/login/login.jsp
reqURL----------/danger/js/jquery-1.11.js
reqURL----------/danger/controls/login/js/gVerify.js
reqURL----------/danger/controls/login/css/login2.css
reqURL----------/danger/controls/login/js/login.js
reqURL----------/danger/image/logo.png
reqURL----------/danger/controls/login/images/1.jpg

 

 

 頁面被送到登陸界面。

 

 

 

4.對登陸的處理:(判斷用戶名與密碼,並在session中添加user屬性)

登陸表單(用戶名與密碼的name與Action的屬性名字一樣)

                    <form action="<%=path %>/login.action" name="loginform" accept-charset="utf-8" id="login_form" class="loginForm"
                          method="post"><input type="hidden" name="did" value="0"/>
                        <input type="hidden" name="to" value="log"/>
                        <div class="uinArea" id="uinArea">
                            <label class="input-tips" for="u">&nbsp;號:</label>
                            <div class="inputOuter" id="uArea">
                                <input type="text" id="u" name="username" class="inputstyle"/>
                            </div>
                        </div>
                        <!--密碼-->
                        <div class="pwdArea" id="pwdArea">
                            <label class="input-tips" for="p">&nbsp;碼:</label>
                            <div class="inputOuter" id="pArea">
                                <input type="password" id="p"  name="password" class="inputstyle"/>
                            </div>
                        </div>
                        <!--驗證碼-->
                        <div class="yzmArea" id="verifyArea">
                            <label class="input-tips" for="code_input">驗證碼:</label>
                            <div class="inputOuter" id="yArea">
                                <input type="text" id="code_input" name="y" class="inputstyle"/>
                                <div id="v_container"></div>
                            </div>
                        </div>
                        <!--登錄按鈕-->

                        <div id="loginbuttondiv" class="inputOuter">
                            <input type="submit" value="登 錄" class="button_blue" id="my_button"/>
                        </div>
                    </form>

 

處理登陸的action

靜態模擬兩個用戶,並未用戶分配不同的權限。(2代表是超級用戶,可以進行系統管理)

package danger.action.queryView;

/**
 * 登陸Action
 */
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;

import danger.bean.sys.User;
import danger.utils.ValidateCheck;

@Controller
@Scope("prototype")
public class LoginAction extends ActionSupport {
    private Map<String, Object> result;
    private String username;
    private String password;
    private User user;

    @Override
    public String execute() throws Exception {
        result = new HashMap();
        // 獲取session
        HttpSession session = ServletActionContext.getRequest().getSession();
        // 用戶名與密碼不為空進行登陸驗證
        if (ValidateCheck.isNotNull(username) && ValidateCheck.isNotNull(password)) {
            // 模擬登陸成功后session中添加user
            if ("root".equals(username) && "123456".equals(password)) {
                user = new User();
                user.setUsername(username);
                user.setRole(2);
                session.setAttribute("user", user);
                return SUCCESS;
            }
            if ("信息錄入人員".equals(username) && "123456".equals(password)) {
                user = new User();
                user.setRole(1);
                user.setUsername(username);
                session.setAttribute("user", user);
                return SUCCESS;
            }
        }
        // 來到這里證明登陸未成功
        result.put("msg", "賬戶或者密碼錯誤");
        return ERROR;
    }

    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;
    }

    public Map getResult() {
        return result;
    }

    public void setResult(Map result) {
        this.result = result;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

 

struts.xml   配置(登陸成功后進入主頁,失敗后到message.jsp顯示錯誤信息)

        <!-- 登陸 -->
        <action name="login" class="loginAction">
            <result name="success" type="redirect">/index.jsp</result>
            <result name="error">/message.jsp</result>
        </action>

 

5.退出系統的處理(刪除session中的user,並將用戶重定向到一個頁面)

處理退出的Action(清除session)

package danger.action.queryView;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;
@Controller
@Scope("prototype")
public class LogoutAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        // 獲取session
        HttpSession session = ServletActionContext.getRequest().getSession();
        // 清空session中的用戶
        session.removeAttribute("user");
        return super.execute();
    }
}

 

struts.xml配置Action

        <!-- 退出 -->
        <action name="logout" class="logoutAction">
            <!-- 成功后送到登陸頁面 -->
            <result name="success" type="redirect">/login/login.jsp</result>
        </action>

 

 

退出系統按鈕

<a href=javascript:void(0)
                        style="text-decoration: none; color: white;" onclick="logout()"><span>退出系統</span></a>

 

處理退出系統的JS函數

 

    <script type="text/javascript">
        function logout() {
            if (confirm("確定退出系統?")) {
                window.location.href = "${baseurl}/logout.action"
            }
        }
    </script>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM