#jsf #tomcat #servlets #login #jsf-2
#jsf #tomcat #сервлеты #аутентификация #jsf-2
Вопрос:
Попытка создать приложение со страницей входа и использовать метод входа в систему Servlet 3.0. Я определил область в tomcat и настроил web.xml соответственно. Но когда я пытаюсь получить доступ к любой странице, даже к странице входа, она не отображается, и я вижу теги JSF в коде. Я не знаю, не упустил ли я чего-то. Ниже приведены подробности о том, что я поместил в web.xml .
<security-constraint>
<display-name>Restricted</display-name>
<web-resource-collection>
<web-resource-name>Restricted Area</web-resource-name>
<url-pattern>/faces/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/index.xhtml</form-login-page>
<form-error-page>/index.xhtml</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>user</role-name>
</security-role>
Ниже приведена область, определенная в tomcat
<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/db_name?user=useramp;amp;password=password"
userTable="users" userNameCol="username" userCredCol="userpass"
userRoleTable="user_roles" roleNameCol="rolename" digest="MD5"/>
Код для входа в систему
public String login(){
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
try {
//Login via the Servlet Context
request.login(username, password);
return "success";
} catch (ServletException e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid Login", null));
e.printStackTrace();
}
return "failure";
}
Дайте мне знать, что я делаю что-то не так
Обновление Спасибо, ребята, это начало работать. Мне пришлось изменить некоторые сопоставления URL в web.xml и измените порядок папок для настройки безопасности. В настоящее время он работает, но теперь у него просто странная проблема. Я определил
<form-login-config>
<form-login-page>/index.xhtml</form-login-page>
<form-error-page>/index.xhtml</form-error-page>
</form-login-config>
И теперь web.xml показать ошибку на
<form-login-page>
и жалуется, что
Описание Ошибка типа местоположения пути к ресурсу: форма атрибута-ошибка -ссылки на страницы /index.jsp, которые не существуют в веб-контенте web.xml /XXXX/WebContent/WEB-INF
Я понятия не имею, откуда это взялось, поскольку я не использую ни один файл jsp. Какие-либо подсказки
Комментарии:
1. @BalusC Спасибо за редактирование, которое вы внесли в ответ, который вы также объединили, это действительно помогает, когда люди это делают.
Ответ №1:
Итак, FacesServlet
вызов не был произведен. Это означает, что URL-адрес страницы входа в систему не соответствует шаблону URL FacesServlet
-адреса, как вы определили в web.xml
. В соответствии с шаблоном URL вашей ограниченной области , который был установлен /faces/*
, я предполагаю, что это тот же шаблон URL, который вы определили для FacesServlet
.
Итак, исправьте это соответствующим образом:
<form-login-page>/faces/index.xhtml</form-login-page>
<form-error-page>/faces/index.xhtml</form-error-page>
Тем не менее, я бы предложил вместо этого использовать сопоставление FacesServlet
on *.xhtml
, чтобы вам никогда не нужно было беспокоиться о вводе /faces
пути или о том, что конечный пользователь сможет видеть необработанный исходный код JSF всякий раз, когда конечный пользователь удаляет /faces
URL из адресной строки браузера.
Обновление: это специфичная для IDE ошибка проверки. IDE, которую вы используете, притворяется умнее, чем она есть на самом деле. Если ваше веб-приложение работает и работает нормально, просто игнорируйте его. При необходимости вы можете отключить проверку XML IDE в ее настройках.
Ответ №2:
Установить
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
в web.xml
и изменить (в <security-constraint>
разделе)
<url-pattern>/faces/*</url-pattern>
Для
<url-pattern>/*</url-pattern>
Комментарии:
1. Согласно вашему редактированию,
/*
это довольно ограничительно. Вы были бы вынуждены встроить весь код CSS / JS в HTML вместо того, чтобы ссылаться на них как<link>
,<script>
, и т.д., Чтобы использовать их на своей странице входа. Вы также не сможете размещать изображения на странице входа, если вы не полагаетесь на браузеры, поддерживающие схему URI данных. Я думаю, что лучше использовать шаблон URL*.xhtml
или (реальную!) Папку/app/*
.2. Я предпочитаю определять a
security-constraint
безauth-constraint
тега для/img/*
и/style/*
т. Д., Чтобы они были доступны без входа в систему.