Как я могу изменить значения parameterMap, используя HttpServletRequestWrapper?
У меня есть веб-приложение, предназначенное для выполнения роли поисковой системы. Его бэкэнд разработан на Java, а его интерфейс - angularJS. У меня есть следующий класс с именем PrettyFacesWrappedRequest, который я нашел по следующей ссылке с некоторыми пояснениями: ссылка здесь
public class PrettyFacesWrappedRequest extends HttpServletRequestWrapper{
private final Map<String, String[]> modifiableParameters;
private Map<String, String[]> allParameters = null;
/**
* Create a new request wrapper that will merge additional parameters into
* the request object without prematurely reading parameters from the
* original request.
*
* @param request
* @param additionalParams
*/
public PrettyFacesWrappedRequest(final HttpServletRequest request,
final Map<String, String[]> additionalParams)
{
super(request);
modifiableParameters = new TreeMap<String, String[]>();
modifiableParameters.putAll(additionalParams);
}
@Override
public String getParameter(final String name)
{
String[] strings = getParameterMap().get(name);
if (strings != null)
{
return strings[0];
}
return super.getParameter(name);
}
@Override
public Map<String, String[]> getParameterMap()
{
if (allParameters == null)
{
allParameters = new TreeMap<String, String[]>();
allParameters.putAll(super.getParameterMap());
allParameters.putAll(modifiableParameters);
}
//Return an unmodifiable collection because we need to uphold the interface contract.
return Collections.unmodifiableMap(allParameters);
}
@Override
public Enumeration<String> getParameterNames()
{
return Collections.enumeration(getParameterMap().keySet());
}
@Override
public String[] getParameterValues(final String name)
{
return getParameterMap().get(name);
}
}
Моя цель - внедрить приведенный ниже код для управления любым http-запросом, поступающим из любого другого приложения. Например, у меня есть следующая HTML-форма, где я хочу найти слово:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Search</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form action="http://localhost:8050/Babel/#/search" method="GET" enctype="application/json">
<input type="text" name="word" id="word">
<input type="submit" value="Search" >
</form>
</body>
</html>
Я реализовал класс, в котором я извлекаю параметр word через referer заголовка запроса (request.getHeader("referer")) и обрезаю строку, разбивая ее на подстроку, разделенную символом "=".
Вот код ниже:
public class ControllerTemplate<T extends SearchResponse> {
private static final Logger LOGGER = LoggerFactory.getLogger(ControllerTemplate.class);
private static final String X_REQUESTED_WITH = "X-Requested-With";
private static final String XML_HTTP_REQUEST = "XMLHttpRequest";
protected Identification identification;
protected SearchApiUseCase<T> useCase;
protected ObjectMapper mapper;
protected ControllerTemplate(SearchApiUseCase<T> useCase, Identification identification) {// if(useCase == null || identification == null){
if(useCase == null){
throw new IllegalArgumentException("ControllerTemplate construct error");
}
this.useCase = useCase;// this.identification = identification;
this.identification = null;
this.mapper = new ObjectMapper();
}
private final ResponseEntity<?> constructResponseEntity(int httpStatusCode, String msg){
ObjectNode object = mapper.createObjectNode();
object.put("message",msg);
object.put("timestamp", Calendar.getInstance().getTimeInMillis());
return ResponseEntity.status(httpStatusCode).body(object.toString());
}
private final void isAjaxHttpRequest(HttpServletRequest httpRequest) throws HttpSearchErrorException{
if(httpRequest.getHeader(X_REQUESTED_WITH) == null || !XML_HTTP_REQUEST.equalsIgnoreCase(httpRequest.getHeader(X_REQUESTED_WITH))){
throw new HttpBadRequestSearchErrorException("X-Requested-With is missing");
}
}
private final void isUserAuthenticated() throws SearchErrorException{
identification.checkIdentity();
}
@RequestMapping(produces=MediaType.APPLICATION_JSON_UTF8_VALUE, method = {RequestMethod.GET})
@ResponseBody
public final ResponseEntity<?> research(@RequestParam(required = true, name ="word") String word,
@RequestParam(required = false, defaultValue = "1", name = "page") int page,
@RequestParam(required = false, defaultValue = "5", name = "maxrow") int maxRow,
@RequestParam(required = false, defaultValue = "", name = "filter") String filter, HttpServletRequest request) throws ServletException, IOException{
ResponseEntity<?> response = null;
System.out.println("word : " + word);
try{
isAjaxHttpRequest(request);// isUserAuthenticated();
System.out.println("the request is " + request.getQueryString());
System.out.println("Request headers : " + request.getHeader("referer"));
String referer = request.getHeader("referer");
String externalWord = referer.split("=")[1];
if(!(externalWord.equals("")) && (word.equals(""))){
word = externalWord;
page = 1;
maxRow = 5;
filter = "";
Map<String, String[]> extraParams = new TreeMap<String, String[]>();
String[] param1 = {externalWord};
String[] param2 = {"1"};
String[] param3 = {"5"};
extraParams.put("word", param1);
extraParams.put("page", param2);
extraParams.put("maxrow", param3);
HttpServletRequest wrappedRequest = new PrettyFacesWrappedRequest(request, extraParams);
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletResponse responseServ = ((ServletRequestAttributes)requestAttributes).getResponse(); request.getRequestDispatcher("http://localhost:8050/Babel/#/search").forward(wrappedRequest, responseServ);
}
SearchResponse resultat = useCase.resultUseCase(word, page, maxRow, filter, null);
HttpHeaders headers = new HttpHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Methods", "GET, POST");
headers.add("Content-Type", "application/json");
headers.add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
response = ResponseEntity.status(HttpStatus.OK).headers(headers).body(resultat.getSearchSources());
}catch(HttpSearchErrorException e){
LOGGER.error("{HttpSearchErrorException}",e);
response = constructResponseEntity(e.getHttpStatus(), e.getMessage());
}catch(SearchErrorException e){
LOGGER.error("{SearchErrorException}",e);
response = constructResponseEntity(HttpStatus.SERVICE_UNAVAILABLE.value(), e.getMessage());
}
System.out.println("Response : " + response.toString());
return response;
}
}
Функция исследования обычно возвращает список результатов поиска, когда слово предоставляется в качестве параметра. Поскольку веб-приложение не может изменить параметр запроса Map, функция не возвращает никакого результата.
Я пытался найти решение или обходной путь для этой проблемы давным-давно. Любая помощь приветствуется. Я даже предоставлю дополнительный фрагмент кода, если это необходимо. Кто-нибудь может мне помочь?