Для обработки файлов cookie вы можете использовать сервлет-обработчик для просмотра сведений о файлах cookie.Для этого вам необходимо подготовить форму входа в систему вручную и, если условие соответствует вашим требованиям, затем переслать / j_spring_security_check.Я только что использовал простую проверку встроенного cookie в запросе.В приведенном ниже примере сервлета я проверил, содержит ли запрос куки, если нет, я перенаправил страницу в cookieDisabled.jsp
package com.udb.servlets;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
/**
* Servlet implementation class cookieHandler
*/
public class cookieHandler extends HttpServlet
{
private static final long serialVersionUID = 1L;
private static final String cookieDisabled = "/cookieDisabled.jsp";
private static final String cookieEnabled = "/j_spring_security_check";
RequestDispatcher dispatcher = null;
/**
* @see HttpServlet#HttpServlet()
*/
public cookieHandler() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
{
if (request.getCookies() == null) {
System.out.println("cookie disabled!");
dispatcher = getServletContext().getRequestDispatcher(
cookieDisabled);
try {
dispatcher.forward(request, response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
dispatcher = getServletContext().getRequestDispatcher(
cookieEnabled);
System.out.println("Cookies active!");
try {
dispatcher.forward(request, response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
{
doPost(req, res);
}
}
web-xml для обработчика:
<servlet>
<description> </description>
<display-name>cookieHandler</display-name>
<servlet-name>cookieHandler</servlet-name>
<servlet-class>com.udb.servlets</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookieHandler</servlet-name>
<url-pattern>/cookieHandler</url-pattern>
</servlet-mapping>
, если выЗарезервировав все URL, вам нужно добавить тег ниже в security.xml, как показано ниже:
<security:intercept-url pattern="/cookieDisabled*"
filters="none" />
И в вашей форме входа в систему вам нужно отправить запрос в cookieHandler вместо j_spring_security_check:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Login Page</title>
<style>
.errorblock {
color: #ff0000;
background-color: #ffEEEE;
border: 3px solid #ff0000;
padding: 8px;
margin: 16px;
}
</style>
</head>
<body onload='document.f.j_username.focus();'>
<h3>Login with Username and Password (Custom Page)</h3>
<c:if test="${not empty error}">
<div class="errorblock">
Your login attempt was not successful, try again.<br /> Caused :
${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
</div>
</c:if>
<form name='f' action="<c:url value='cookieHandler' />"
method='POST'>
<table>
<tr>
<td>User:</td>
<td><input type='text' name='j_username' value=''>
</td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='j_password' />
</td>
</tr>
<tr>
<td colspan='2'><input name="submit" type="submit"
value="submit" />
</td>
</tr>
<tr>
<td colspan='2'><input name="reset" type="reset" />
</td>
</tr>
</table>
</form>
</body>
</html>
Процесс очень похож на JSF (если вы используете), когда вы обрабатываете вход через диспетчер сервлетов.