在Java EE 7中使用j_security_check对用户进行身份验证

时间:2016-10-07 18:02:52

标签: servlets tomcat7 forms-authentication java-ee-7 j-security-check

我现在正在练习 Java EE 7 。尝试使用容器提供的方式验证用户时遇到问题,即j_security_check

  • 应用程序服务器:Apache Tomcat 7
  • 项目/应用程序名称:ServletDrill
  • 使用@WebServlet
  • 注释的资源(Servlet)

我的Web.xml

    <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ServletDrill</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>To_Auth</web-resource-name>      
      <url-pattern>/auth/*</url-pattern>
      <http-method>GET</http-method>
      <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>valid</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>FORM</auth-method>    
    <form-login-config>
      <form-login-page>/FormAuth.jsp</form-login-page>
      <form-error-page>/LogInErr.jsp</form-error-page>
    </form-login-config>
  </login-config>
</web-app>

我的tomcat-users.xml

<tomcat-users>
<role rolename="valid"/> 
 <user username="username" password="pass" roles="valid"/>
</tomcat-users>

我的<form>

<form action="/ServletDrill/j_security_check" accept-charset="UTF-8" method="post">
<fieldset id="postForm">
<legend>j_security_check method</legend>
<div class="partContainer">
<div class="left"><label for="user" >User Name: </label></div>
<div class="right"><input type="text" name="j_username" id="user" required="required" maxlength="20"></div>
</div>
<hr/>

<div class="partContainer">
<div class="left"><label for="pass" >Pass: </label></div>
<div class="right"><input type="password" name="j_password" id="pass" required="required" maxlength="20"></div>
</div>

<hr/>
<div class="partContainer">
<div class="left"><input type="submit" value="Log In"></div>
<div class="right"><input type="reset" value="Reset"></div>
</div>
</fieldset>
</form>

我的受保护资源(Servlet):

@WebServlet("/auth/NeedsPriorAuth")
public final class NeedsPriorAuth extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       
        response.getWriter().append("Welcome, "+request.getRemoteUser()+". The user has been authenticated before hand").append("\n Auth Type: "+request.getAuthType());
    }
}

当我执行以下链接时,

 <a href="/ServletDrill/auth/NeedsPriorAuth">Access Protected Servlet</a>

,用户在下一页上重定向以进行身份​​验证,

<form-login-page>/FormAuth.jsp</form-login-page> 

(我在上面发布的<form>)。 尽管传递了正确的凭据(在tomcat-users.xml上方发布),但用户重定向到以下错误页面(在Web.xml上方发布):

<form-error-page>/LogInErr.jsp</form-error-page>

导致我这么不便的罪魁祸首是什么?我已经坚持了几天这个问题了。 那么<realm>呢,我需要吗?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

你去了,最后,我已经解决了这个问题。我需要修改的修改:

<form action="j_security_check" accept-charset="UTF-8" method="post">

也就是说,操作没有应用程序上下文前缀。 另一方面,就我而言,有两个 tomcat-users.xml 文件的实例:

  • 在Apache Tomcat v7目录(服务器应用程序)下
  • 可从Project Explorer in Eclipse访问的 Servers2 名称

修改角色,用户名和密码时,如果要查看要发生的影响,请在后一个实例示例下进行修改;服务器重启之后。