Я бы не хотел использовать вызов сервлета напрямую от клиента, то есть со стороны внешнего интерфейса.Я хотел бы использовать фильтры безопасности для веб-служб и только.В случае, когда клиент нажимает на ссылку, которая указывает на другую страницу, происходит следующее: веб-службе передается AJAX-запрос, прежде чем он проходит фильтр, который проверяет Autenitifikacija пользователя, имеет ли он токен или ресурсметод, к которому запрос имеет аннотацию @PermitAll, ну и подобные проверки .... После того, как запрос пришел к методу ресурса, метод ресурса перенаправляет запрос на нужный сервлет, который дает клиенту требуемую страницу.
У меня есть это прямо сейчас
function handlerEventsOnRadioBtn() {
$('.radioAuth').on('click keypress', function(e) {
if (!$(this).hasClass('clicked')) {
$(this).addClass('clicked');
var value = $(this).val();
outputMessage(".messageRadio", "");
outputMessage(".messageRadio", "Choice: " + value, "green");
console.log('First click');
} else {
$(this).removeClass('clicked');
if (e.key === 'Enter' || e.type === 'click') {
if (value === "repairAuth"){
//authRepair("api/auth/repairAccount");
window.location.href = "/index.html";
outputMessage(".messageRadio", " send to server - " + value, "blue");
}
outputMessage(".messageRadio", "send to server - " + value, "blue");
}
}
});
}
Когда эта функция вызывается и обрабатывается событием, тогда я должен направить клиента на нужную страницу, поэтому здесь я не хотел бы писатьдля таких случаев больше фильтров безопасности для сервлетов, я бы хотел, чтобы ответ шел к методу ресурса
authRepair("api/auth/repairAccount");
AJAX-запрос отправляет запрос GET
function authRepair(uri){
$.ajax({
method: "GET",
url: uri,
success: function () {
},
error: function (error) {
outputMessage(".authenticationMessage", "err", "red");
}
});
}
На стороне сервера что-товот так
@GET
@PermitAll
@Path("repairAccount")
public Response redirectToRepair(){
ServletContext servletContext =
(ServletContext) context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
servletContext.getRequestDispatcher(VIEW_URL);
/*???? Response response = Response.ok().build();*/
return response;
}
Подскажите, как это можно сделать, может где-нибудь есть пример, с объяснениемns?
ОБНОВЛЕНИЕ
Я сделал следующее
@WebServlet("/home")
public final class Home extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
final String viewUrl = "/WEB-INF/pages/home.html";
RequestBean bean = new RequestBean();
bean.setPage(viewUrl);
bean.setRequest(request);
bean.setResponse(response);
request.setCharacterEncoding("UTF-8");
forwardToView(bean);
}
}
, а затем
@Provider
@Produces( MediaType.APPLICATION_JSON )
@Consumes( MediaType.APPLICATION_JSON )
@Path( "authorization" )
public class AuthorizationResource {
private static final String VIEW_URL = "/WEB-INF/pages/home.html";
@Resource
private WebServiceContext context;
@POST
@PermitAll
@Path( "home" )
public Response authenticateUserName(@Context ServletContext context){
UriBuilder builder = UriBuilder.fromPath(context.getContextPath());
builder.path("/home");
URI buildUri = builder.build();
Response.ResponseBuilder responseBuilder = Response.seeOther(buildUri);
Response response = responseBuilder.build();
return response;
}
}
Это на стороне клиента
function redirectUrlOld(uri, token, selector){
$.ajax({
type: "POST",
url: uri,
contentType: 'application/json',
beforeSend : function(request) {
request.setRequestHeader('Authorization', makeHeaderWithJwt(token));
},
success: function () {
console.log("success!")
},
error: function (error) {
console.log("error!")
// messageErr(error,selector);
}
});
}
Консоль указывает, что запрос AJAX возвращает успех.Но запрос по кругу брошен между классами Home (это сервлет) и AuthorizationResource
Это показано на отладчике.
Почему?Как это исправить?
введите описание изображения здесь