Cómo modificar los parámetros de la solicitud de varias maneras
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:
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
@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
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];
} p>
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(Map
for(Map.Entry
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)});
}
}
}
}
}