實現思路是編寫過濾器,如果用戶登錄之后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">帳 號:</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">密 碼:</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>