簡體   English   中英

JSP 頁面應該如何檢查身份驗證

[英]How JSP page should check authentication

我是網絡編程的新手。 我要求使用通用模式來執行檢查身份驗證等操作。 這是場景:

該網站有一個供訪問者使用的登錄頁面。 它將獲取用戶名和加密密碼並將它們發送到服務器,然后從服務器獲取錯誤代碼(用戶名/密碼不匹配)或身份驗證密鑰。 當用戶登錄成功后,我想讓網站自動跳轉到展示網站主要功能的main.jsp頁面。

在這種情況下,我希望main.jsp檢查用戶身份驗證。 也就是說,我不希望像用戶可以直接打開www.example.com/main.jsp這樣的事情發生,如果他們做了這樣的事情,我想將他們重定向到登錄頁面。

那么如何跨頁面傳遞身份驗證信息,以及如何防止用戶在main.jsp情況下直接訪問main.jsp呢? 我需要使用 session 或任何東西嗎?

您可以嘗試使用過濾器

過濾器可以在請求到達 servlet 之前對其進行預處理,對離開 servlet 的響應進行后處理,或者兩者都做。 過濾器可以攔截、檢查和修改請求和響應。

注意:確保在您的用戶登錄后添加會話屬性,您可以在過濾器上使用該會話屬性

在您的login.jsp 上添加:

session.setAttribute("LOGIN_USER", user); 
//user entity if you have or user type of your user account... 
//if not set then LOGIN_USER will be null

網頁.xml

<filter>
    <filter-name>SessionCheckFilter</filter-name>
    <filter-class>yourjavapackage.SessionCheckFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SessionCheckFilter</filter-name>
    <!--url-pattern>/app/*</url-pattern-->
    <url-pattern>/main.jsp</url-pattern> <!-- url from where you implement the filtering -->
</filter-mapping>

SessionCheckFilter.java

public class SessionCheckFilter implements Filter {

  private String contextPath;

  @Override
  public void init(FilterConfig fc) throws ServletException {
    contextPath = fc.getServletContext().getContextPath();
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;  

    if (req.getSession().getAttribute("LOGIN_USER") == null) { //checks if there's a LOGIN_USER set in session...
        res.sendRedirect(contextPath + "/login.jsp"); //or page where you want to redirect
    } else {
      String userType = (String) req.getSession().getAttribute("LOGIN_USER");
      if (!userType.equals("ADMIN")){ //check if user type is not admin
        res.sendRedirect(contextPath + "/login.jsp"); //or page where you want to  
      }
      fc.doFilter(request, response);
    }
  }

  @Override
  public void destroy() {
  }
}

JSP 頁面應該如何檢查身份驗證

不應該。 您應該使用容器管理身份驗證,並通過 URL 模式在 web.xml 中定義登錄/安全性。


由 Glen Best 添加:

例如,在 web.xml 中添加類似的內容:

<security-constraint>
   <display-name>GET: Employees Only</display-name>
   <web-resource-collection>
      <web-resource-name>Restricted Get</web-resource-name>
      <url-pattern>/restricted/employee/*</url-pattern>
      <http-method>GET</http-method>
   </web-resource-collection>
   <auth-constraint>
      <role-name>Employee</role-name>
   </auth-constraint>
   <user-data-constraint>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
   </user-data-constraint>
</security-constraint>

這也適用於我

<filter>
    <filter-name>SessionCheckFilter</filter-name>
    <filter-class>yourjavapackage.SessionCheckFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SessionCheckFilter</filter-name>
    <!--url-pattern>/app/*</url-pattern-->
    <url-pattern>/main.jsp</url-pattern> <!-- url from where you implement the filtering -->
</filter-mapping>


public class SessionCheckFilter implements Filter {

  private String contextPath;

  @Override
  public void init(FilterConfig fc) throws ServletException {
    contextPath = fc.getServletContext().getContextPath();
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;  

    if (req.getSession().getAttribute("LOGIN_USER") == null) { //checks if there's a LOGIN_USER set in session...
      req.getRequestDispatcher("login.jsp").forward(req, resp); //or page where you want to redirect
    } else {
      String userType = (String) req.getSession().getAttribute("LOGIN_USER");
      if (userType.equals("ADMIN")){ //check if user type is admin
        fc.doFilter(request, response); it redirected towards main.jsp
      }

    }
  }

  @Override
  public void destroy() {
  }
}

如何使用:

String username = request.getRemoteUser();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM