1. 程式人生 > >許可權判斷——使用者登入成功是才能檢視相應的資訊,登入失敗不能檢視並且返回登入頁面

許可權判斷——使用者登入成功是才能檢視相應的資訊,登入失敗不能檢視並且返回登入頁面

使用者登入的servlet:

/**
 *  使用者登入的servlet
 * */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		String name = req.getParameter("name");
		if(!"admin".equals(name)){//判斷:如果傳來過的使用者名稱不等於資料庫中的admin,那麼就跳轉到使用者登入頁面
			req.getRequestDispatcher("/login.jsp").forward(req, resp);
			return;
		}
		
		//使用者名稱登陸成功,把使用者放到session中去
		req.getSession().setAttribute("USER_IN_SESSION", name);
		System.out.println(name);
		resp.sendRedirect("/welcome.jsp");//登入成功跳轉到主頁面
	}
}

login.jsp檔案:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/login" method="post">
		使用者名稱:<input type="text" name="name">
		<input type="submit" name="登入">
	</form>
</body>
</html>

welcome.jsp檔案:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>歡迎你。來到主頁面</h1>
</body>
</html>
使用者許可權判斷的過濾器:
/**
 * 	許可權判斷
 *  當用戶登入成功的時候才是使用者能瀏覽到主頁面的資訊——許可權驗證 
 * */
public class CheckLoginFilter implements Filter {
	
	private List<String> unUrlList = new ArrayList<>();
	//登入不成功返回的路徑
	private String loginUrl = "login.jsp";
	//使用者存放在session中的名稱
	private String LoginSessionName;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
		//拿到在web.xml配置好的需要放行的路徑字串login.jsp login
		String unUrl = filterConfig.getInitParameter("unUrl");
		String[] unUrlArr =  unUrl.split(",");//將字串通過分號,分割成一個數組
		//把陣列轉換成一個集合
		unUrlList = Arrays.asList(unUrlArr);
		
		//拿到登入頁面路徑
		loginUrl = filterConfig.getInitParameter("loginUrl");
		
		//拿到使用者存放在session中的名稱
		LoginSessionName = filterConfig.getInitParameter("loginSessionName");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//從session中拿到登入用,如果當前使用者不存在,跳轉回登入頁面  如果存在,直接放行
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse resp = (HttpServletResponse)response;
		
		//拿到訪問的路徑          req.getRequestURI() 拿到的結果是:/login.jsp
		String uri = req.getRequestURI().substring(1);//結果是:login.jsp

	  	//如果這個List中沒有包含uri中的路徑才進行許可權判斷
		if(!unUrlList.contains(uri)){
			Object user = req.getSession().getAttribute(LoginSessionName);
			if(user==null){//判斷使用者是否為空
			resp.sendRedirect(loginUrl);
			return;
		}
	}
	chain.doFilter(request, response);
}

	@Override
	public void destroy() {
		
	}

}

過濾器的配置檔案:
<!--   為做許可權判斷而配置的過濾器 -->
 <filter>
 	<filter-name>checkLogin</filter-name>
 	<filter-class>cn.itsource._05_check.CheckLoginFilter</filter-class>
 	<!--  配置不要進行許可權判斷的路徑(不過濾的路徑) -->
 	<init-param>
 		<param-name>unUrl</param-name>
 		<param-value>login.jsp,login</param-value>
 	</init-param>
 	<!--  配置登入頁面路徑 -->
 	<init-param>
 		<param-name>loginSessionName</param-name>
 		<param-value>USER_IN_SESSION</param-value>
 	</init-param>
 	<!--  使用者存在session中的名稱 -->
 	<init-param>
 		<param-name>loginUrl</param-name>
 		<param-value>/login.jsp</param-value>
 	</init-param>
 </filter>
 <filter-mapping>
 	<filter-name>checkLogin</filter-name>
 	<url-pattern>/*</url-pattern>
 </filter-mapping>