我想避免直接从客户端(即前端)使用servlet调用。我只想对Web服务使用安全过滤器。如果客户端单击指向另一个页面的链接,则会发生以下情况:向Web服务发出AJAX请求,然后该请求通过过滤器,该过滤器检查用户的Autenitifikacija是否具有令牌或资源。请求具有注释@PermitAll的方法,以及类似的检查...。 在请求到达资源方法之后,资源方法将请求重定向到所需的servlet,从而为客户端提供所需的页面。
我现在有这个
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");
}
}
});
}
由事件调用和处理此函数时,我必须将客户端定向到所需的页面,因此在这种情况下,我不想为Servlet写更多的安全过滤器,我想答案到资源方法
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;
}
提示如何完成,可以在某个地方举个例子,并附上解释吗?
更新
我做了以下
@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(这是servlet)和AuthorizationResource
之间抛出了一个圈。这是为了显示调试器。
为什么? 如何纠正?