JSP 页面应如何检查身份验证

Posted

技术标签:

【中文标题】JSP 页面应如何检查身份验证【英文标题】:How JSP page should check authentication 【发布时间】:2013-04-04 10:11:42 【问题描述】:

我是网络编程新手。我要求一种通用模式来执行检查身份验证之类的操作。这是场景:

该网站有一个供访问者使用的登录页面。它将获取用户名和加密密码并将它们发送到服务器,然后从服务器获取错误代码(用户名/密码不匹配)或身份验证密钥。当用户登录成功后,我希望网站自动跳转到呈现网站主要功能的main.jsp页面。

在这种情况下,我想main.jsp 检查用户身份验证。也就是说,我不希望这样的事情发生,比如用户可以直接打开www.example.com/main.jsp,如果他们这样做,我想将他们重定向到登录页面。

那么如何跨页面传递身份验证信息,如何防止用户在未登录的情况下直接访问main.jsp?我需要使用 session 还是什么?

【问题讨论】:

如果我对您的理解正确,您似乎需要在您的网络应用程序上进行过滤...您可以尝试阅读此docs.oracle.com/javaee/5/api/javax/servlet/Filter.html 【参考方案1】:

您可以尝试使用过滤器

过滤器可以在请求到达 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

web.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() 
  

【讨论】:

【参考方案2】:

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>

【讨论】:

容器管理的身份验证在 Servlet 规范中定义。对你来说够正式吗? 绝对使用这个并且不要编写自己的解决方案!这是预期的方式。 不仅如此,根据 JEE 平台规范,Web 容器将知道用户身份和角色,允许与 EJB、JCA 等自动集成,并允许通过标准 API 进行编程访问。 request.isUserInRole(role), request.getUserPrinciple() & 类似的来自 EJB【参考方案3】:

这也适用于我

<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() 
  

【讨论】:

【参考方案4】:

如何使用:

String username = request.getRemoteUser();

【讨论】:

以上是关于JSP 页面应如何检查身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Jsp注册页面身份证验证

如何在 Angular JS 应用程序中处理身份验证

如何在 Spring Security 中通过 jdbc 身份验证使用自定义登录页面

使用html / jsp页面的Apache httpd基本身份验证旁路弹出窗口

如何在 django 中设置健康检查页面

身份验证过滤器未加载 3 个网页的 css