Мне нужна помощь с фильтрами сервлетов.
На данный момент у нас есть сервлет ChangePassword для Oracle SSO.Я хочу перехватить любой вызов этого сервлета и попытаться вернуть ответ отправителю (сменить пароль jsp), если моя проверка не удалась.Кроме того, если все мои проверки в порядке, я передам запрос сервлету ChangePassword.Одним из требований для этого фильтра является сохранение исходных параметров и повторная отправка их на исходную страницу JSP в случае сбоя любой из моих проверок.
Текущий метод doFilter:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException,
ServletException {
// __TB__ 2009_11_06 added for customization
String str_old_password = null;
String str_new_password = null;
String str_new_password_confirm = null;
String str_action = null;
String str_user = request.getParameterValues("p_username")[0];
// __TB__ 2009_11_06 added for customization
// Get the old password value
try {
str_old_password = request.getParameterValues("p_old_password")[0];
} catch (Exception e) {
str_old_password = "";
logger.error("Problem s dohvaćanjem starog passworda za username: " +
str_user);
throw new IOException();
}
// Get the new password
try {
str_new_password = request.getParameterValues("p_new_password")[0];
} catch (Exception e) {
str_new_password = "";
logger.error("Problem s dohvaćanjem novog passworda za username: " +
str_user);
throw new IOException();
}
// Get the new password confrimantion string
try {
str_new_password_confirm =
request.getParameterValues("p_new_password_confirm")[0];
} catch (Exception e) {
str_new_password_confirm = "";
logger.error("Problem s dohvaćanjem potvrde novog passworda za username: " +
str_user);
throw new IOException();
}
// Get the action string
try {
str_action = request.getParameterValues("p_action")[0];
} catch (Exception e) {
str_action = "OK";
}
if (logger.isDebugEnabled()) {
logger.debug("Ulazak u RuPassFilter-doFilter za username: " +
str_user);
}
// Prevent update if passwords are not equal and action is not equal OK
if (str_new_password.toString().equals(str_new_password_confirm.toString()) &&
str_action.equals("OK")) {
try {
if (logger.isDebugEnabled()) {
logger.debug("Novi password i njegova potvrda odgovaraju jedno drugom za username: " +
str_user);
}
//Run update and on any exception pass request to password change servlet except on MyException
MyChecker mc = new MyChecker();
if (logger.isDebugEnabled()) {
logger.debug("Poziv check metode u RuPassFilter-u za username: " +
str_user);
}
mc.check (str_user, str_old_password, str_new_password,
_filterConfig.getServletContext());
if (logger.isDebugEnabled()) {
logger.debug("Odrađena check metoda u RuPassFilter-u za username: " +
str_user);
}
//pass to servlet
chain.doFilter(request, response);
} catch (UtilException ue) {
logger.error("Dogodio se UtileException za username: " +
str_user);
logger.error(ue.getLocalizedMessage());
chain.doFilter(request, response);
} catch (NamingException ne) {
logger.error("Dogodio se NamingException za username: " +
str_user);
logger.error(ne.getLocalizedMessage());
chain.doFilter(request, response);
} catch (IOException ioe) {
logger.error("Dogodio se IOException u RuPassFilter-u za username: " +
str_user);
logger.error(ioe.getLocalizedMessage());
throw ioe;
} catch (MyException me) {
logger.error("Dogodio se MyException u RuPassFilter-u za username: " +
str_user);
logger.error(me.getLocalizedMessage());
//!!!!!!!!!!!!
// At this point I need return response back to sender !!!!!!!!!!!!
//!!!!!!!!!!!!!
}
} else {
if (logger.isDebugEnabled()) {
logger.debug("Passwordi ne odgovraju jedna drugom ili je action različit od OK u RuPassFilter-u za username: " +
str_user);
}
//!!!!!!!!!!!!
// At this point I need return response back to sender !!!!!!!!!!!!
//!!!!!!!!!!!!!
}
// Everything is OK
chain.doFilter(request, response);
}
Метод MyCheck.checkвыдает MyException в случае сбоя любой из моих проверок.
Наш J2EE-сервер - OC4J в версии: 10.1.2.0.2