I have a dynamic web application which is now deployed on tomcat8.5. I have planned to upgrade my tomcat from version 8.5 to tomcat 10. I am facing very weird issue. I have a form which sends a jquery ajax request to a servlet. Following is my ajax request code.
function resetApplicationLogin( unlockapplogin) {
if($("#idusername").val()!=""){
var forminputdata = new FormData();
forminputdata.append("username",$("#idusername").val());
forminputdata.append("unlockapplogin",unlockapplogin);
$.ajax({
xhr: function() {
var req = $.ajaxSettings.xhr();
if (req) {
req.upload.addEventListener('progress', function(event) {
if (event.lengthComputable) {
//$("#id"+i+"-p-"+file_data[i].name.replace(".","-")).html(event.loaded); // = 'test'; //event.loaded + ' / ' + event.total;
}
}, false);
}
return req;
},
url: 'ResetUserApplicationLogin',
data: forminputdata,
contentType: false,
processData: false,
dataType: 'json',
type: 'POST',
beforeSend: function(){
},
success: function(data, textStatus, jqXHR){
var objlstProjectDetails=data.objlstProjectDetails;
if(data.reply=="success"){
alert("Application login reset successfull!");
}else if(data.reply=="invalidsession"){
//alert(data.message);
window.location.replace("Logout");
}else if(data.reply=="failed"){
alert(data.message);
}
},
error: function(xhr, errDesc, exception) {
}
});
}else{
alert("Please select username!");
}
}
The above ajax request works perfect in tomcat 8.5 environment and sent username get received in the respective servlet.
But when I deploy same code on tomcat10 problem starts. When ajax request got fired in development tool of chrome I found that the data is sent properly.
Snippet of my servlet code protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
response.setHeader("Pragma", "no-cache"); // HTTP 1.0
response.setHeader("Cache-Control", "no-cache"); // HTTP 1.1
response.setDateHeader("Expires", 0); // prevents caching at the proxy server
response.setHeader("Cache-Control", "private"); // HTTP 1.1
response.setHeader("Cache-Control", "no-store"); // HTTP 1.1
response.setHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
response.setHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
response.setContentType("text/html");
// System.out.println("in Stop Delete Batch");
HttpSession session = request.getSession(false);
JsonObject objJsonObject = new JsonObject();
PrintWriter out = response.getWriter();
System.out.println("username : "+request.toString());
String strUserName = request.getParameter("username").toString().split("~")[1];//Exception comes on this line
But in Servlet I get following exception
Sep 08, 2022 11:00:16 AM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [com.techspeed.ode.admin.user.ResetUserApplicationLogin] in context with path [/onlinedataentryexpress10] threw exception java.lang.NullPointerException: Cannot invoke "String.toString()" because the return value of "jakarta.servlet.http.HttpServletRequest.getParameter(String)" is null at com.techspeed.ode.admin.user.ResetUserApplicationLogin.doPost(ResetUserApplicationLogin.java:71) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:694) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:777) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:356) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:867) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1762) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:833)
Please guide me friends what going wrong in above code.
UPDATE New Findings are as follows
When I have put following code in servlet and tried to print request params
System.out.println();
System.out.println("request param");
Enumeration<String> params = request.getParameterNames();
while(params.hasMoreElements()){
String paramName = params.nextElement();
System.out.println("Parameter Name - "+paramName+", Value - "+request.getParameter(paramName));
}
I got following out on console
------WebKitFormBoundaryoQ3orjimC9f9fVmv Content-Disposition: form-data; name="username"
3~sandip
------WebKitFormBoundaryoQ3orjimC9f9fVmv Content-Disposition: form-data; name="unlockapplogin"
Reset Application Login
------WebKitFormBoundaryoQ3orjimC9f9fVmv--
Watchin above values I feel that my form data parameters either not sent properly to servlet or there is problem in server who is not able to parse the request parameters. Please guide!