Вот как я реализовал j_security_check (Container Managed Security) для моего JSF приложения, запущенного в Websphere 7. К сожалению, версия API сервлетов Я использую не
request.login()
Класс «Фильтр входа» был создан для перехвата вызовов j_security_check. ResponseWrapper запоминает URL-адрес, который будет перенаправлен после входа в систему.
public class LoginFilter implements Filter {
private static String loginPage = "login.xhtml"; // read it from init config
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// create wrapper
HttpServletRequest req = (HttpServletRequest) request;
MyWrapper myRes = new MyWrapper((HttpServletResponse) response);
// call authentication
chain.doFilter(request, myRes);
// check for login error
String redirectURL = myRes.getOriginalRedirect();
if (StringUtils.isBlank(redirectURL) || redirectURL.contains(loginPage)) {
myRes.setOriginalRedirect(homePage);
}
myRes.sendMyRedirect();
}
class MyWrapper extends HttpServletResponseWrapper {
String originalRedirect;
public MyWrapper(HttpServletResponse response) {
super(response);
}
@Override
public void sendRedirect(String location) throws IOException {
// just store location, don’t send redirect to avoid
// committing response
originalRedirect = location;
}
// use this method to send redirect after modifying response
public void sendMyRedirect() throws IOException {
super.sendRedirect(originalRedirect);
}
public String getOriginalRedirect() {
return originalRedirect;
}
public void setOriginalRedirect(String originalRedirect) {
this.originalRedirect = originalRedirect;
}
}
Веб-сайт выглядит следующим образом.
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.servlet.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/j_security_check</url-pattern>
</filter-mapping>
<filter>
<filter-name>RequestJSFFilter</filter-name
<filter-class>com.servlet.filter.RequestJSFFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RequestJSFFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
Другой фильтр, который перехватывает все * .xhtml и направляет к login.xhtml. В login.xhtml форма может выглядеть следующим образом:
<form action="j_security_check" method=post>
<p>username: <input type="text" name="j_username"></p>
<p>password: <input type="password" name="j_password"></p>
<p><input type="submit" value="submit"></p>
</form>
Надеюсь, это поможет.
HHm спасибо, но когда мы используем 'request.login (имя пользователя, пароль);', то как JSF проверяет его. Как я вхожу в basit (пользователь) и basit (пароль). Нужно ли устанавливать пароль имени пользователя где-нибудь на сервере Glassfish или в базе данных? Означает, как работает request.login()? Спасибо – Basit
Точно так же, как проверка подлинности на основе форм. Единственное различие заключается в том, что вы вызываете его программным способом, а не отправляете 'j_security_check' с' j_username' и 'j_password'. – BalusC
ok спасибо многим :) – Basit