許可權判斷——使用者登入成功是才能檢視相應的資訊,登入失敗不能檢視並且返回登入頁面
阿新 • • 發佈:2019-01-31
使用者登入的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>