Red de conocimiento informático - Material del sitio web - Cómo modificar los parámetros de la solicitud de varias maneras

Cómo modificar los parámetros de la solicitud de varias maneras

La solicitud no quiere que modifique el valor del parámetro, porque esto generalmente no se puede modificar. Alguien me preguntó por qué no se permite modificarlo. En la superficie, solo puedo decir que esto es una manipulación de datos. hace que los datos de la solicitud del usuario sean manipulados, es equivalente a manipular el mensaje. Si un día envías un mensaje a otra persona: Tú

Bien hecho, pero lo que la otra parte recibe es: ¡Que te jodan! Pero lo que recibió la otra parte fue: ¡Jódete! , que pensarías, jaja! Por supuesto, esto se debe principalmente a que los datos de los parámetros inseguros se estropearán, porque después de todo, los programadores escriben sus propios programas, especialmente en programas públicos, y los programadores en segundo plano encuentran sus propios datos. , No puedo encontrar el motivo; las aplicaciones WEB generales proporcionarán un atributo para proporcionar sus propios parámetros

configuración, así que está bien, pero algunas personas son pervertidas y preguntan por qué no se puede cambiar. ¿No son mutuos los objetos? Una vez que los obtienes, deberías tener configuraciones. Sólo puedo decir que la orientación a objetos proviene de la vida real.

En la vida real, vamos de compras a la calle todos los días. Hay muchos tipos de flores y jade en la calle, pero por muy guapo que seas, solo puedes mirarlo, no tocarlo y mucho menos tener sexo, jaja, de lo contrario saldrá un caso especial: ¡un gángster!

Jaja, pero desde un punto de vista técnico, por supuesto, no hay nada que se pueda lograr que no se pueda lograr. Según el código fuente, no hay secretos. Esto es lo que dicen las grandes personas. así que primero pensemos en las formas de lograrlo:

1. Creo una nueva solicitud y la pongo al principio del contenedor. Hablaremos de ello más tarde, lo grabaremos primero y luego hablaremos de ello.

2. Sería genial si pudiera cambiar el valor de la solicitud. Ok, regístrelo primero y piense en cómo cambiarlo después.

Primero que nada, el primer método, creo uno nuevo, jaja, cómo crear uno nuevo y cómo dejar que otros programas lo sepan.

Una de las dos nuevas formas (el punto de partida del pensamiento):

Primero, la nueva forma cuando no sé cómo implementar un contenedor específico HttpSevletRequest es. Muy simple, lo escribo yo mismo. Una clase que implementa HttpServletRequest Jaja, esto parece muy simple, está bien. Pruebe la herencia:

la clase pública HttpServletRequestExtend implementa HttpServletRequest {

.......Código de implementación

}

Esta vez Consejo : Es necesario implementar n métodos, como

getParameter, getAttribute, getAttributeNames, getCharacterEncoding, getContentLength, getContentType. . . . . .

Espere docenas de métodos, jaja;

Por supuesto, puede pasar el objeto de solicitud real en el constructor. Si es el mismo método, la solicitud se realizará. Si necesita procesar su propio método y parece muy simple procesarlo de acuerdo con su propio método de empaquetado

Defina sus propios parámetros, use un

Mapa privado<String, String []>parameterMap = new HashMap();

Puede que sea más sencillo de manejar y luego obtenga un método addParameter, etc., y podrá implementar su propia funcionalidad.

Pero escribirlo requiere mucho trabajo porque significa que todos los métodos deben implementarse a menos que no uses ningún otro método, sino solo algunos de ellos, que es lo que fallan algunas interfaces.

Sin embargo, este método sigue siendo factible, por decir lo menos, solo requiere mucho esfuerzo porque se siente muy redundante y también refleja las deficiencias de las interfaces y el valor de las clases abstractas. que queremos Solo sobrecargamos aquellos que queremos sobrecargar, y los originales se manejan de acuerdo con la idea original. En este momento aparece un método llamado HttpServletRequestWrapper;

Nuevo método 2:

Herencia HttpServletRequestWrapper, de hecho, es heredar una capa más del método anterior y entregarle su trabajo repetido. También puede hacer esto,

El nombre completo

es. : javax .Servir. HttpServletRequestWrapper, parece ser una extensión de la interfaz general, es decir, encapsula la solicitud, OK, después de ingresarla, descubrí que puede manejar solicitudes similares sobre la base de un contenedor;

Nuevo Un contenedor agrega una capa de implementación de extensión simple que puede continuar heredando y reescribiendo sobre esta base.

Está bien, puedes reescribirlo como quieras en este punto. Por ejemplo, queremos reescribir un método getParameter y

getParameterValues, y los métodos restantes siguen siendo los mismos. Como los originales, definimos un Mapa en la subclase para colocar los parámetros, combinados con los parámetros de la solicitud en sí, además de otros parámetros personalizados externos. Map;

clase pública ParameterRequestWrapper extiende HttpServletRequestWrapper {

Map privado params = new HashMap();

@SuppressWarnings ("unchecked")

public ParameterRequestWrapper(HttpServletRequest request) {

// Entrega la solicitud a la clase principal para que pueda generarse cuando se llame al método correspondiente; , la implementación de la clase principal El método es similar a la primera clase nueva

super(request);

// Pasa la lista de parámetros al mapa actual para guardar los parámetros en la solicitud

this.params.putAll(request.getParameterMap())getParameterMap());

}

//sobrecarga un método constructor

public ParameterRequestWrapper(HttpServletRequest request , Map extendParams) {

this(request);

addAllParameters(extendObject);//Aquí escribe los parámetros extendidos a la lista de parámetros

}

@Override

public String getParameter(String name) {// Anular getParameter.

Indica que los parámetros se obtienen del mapa en la clase actual

String[]values ​​​​= params.get(name);

if(values ​​​​== null | | valores.longitud == 0) {

devolver nulo;

}

devolver valores[0];

}

public String[] getParameterValues(String name) {// Igual que arriba

return params.get(name);

}

target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target=" _blank" target="_blank" target="_blankget(name);

}

public void addAllParameters(MapotherParams) {//Agregar múltiples parámetros

for(Map.Entryentry : otherParams .entrySet()) {

addParameter(entry.getKey() , Entry.getValue ());

}

}

}

public void addParameter(nombre de cadena, valor de objeto) {//Agregar parámetros

if(valor! = nulo) {

if(valor instanciade String[]) {

params.put(nombre, (String[])valor );

}else if(valor instanciade Cadena) {

params.put(nombre, nueva Cadena[] {(Cadena)valor});

}else {

params.put(nombre, nueva cadena[] {String.valueOf(valor)});

}

}

}

}

}