Resumen de preguntas de la entrevista (4) Reflexión, Web

Reflexion

 

57. ¿Qué es la reflexión?

 

La reflexión se refiere principalmente a la capacidad de un programa para acceder, detectar y modificar su propio estado o comportamiento

Reflexión de Java:

 

En el entorno de tiempo de ejecución Java, para cualquier clase, ¿puedo saber qué propiedades y métodos tiene esta clase? Para cualquier objeto, ¿puede llamar a cualquiera de sus métodos?

El mecanismo de reflexión de Java proporciona principalmente las siguientes funciones:

 

  • En tiempo de ejecución, determine la clase a la que pertenece cualquier objeto.

  • Construir un objeto de cualquier clase en tiempo de ejecución.

  • Determine las variables miembro y los métodos de cualquier clase en tiempo de ejecución.

  • Llame a cualquier método de objeto en tiempo de ejecución. 

 

58. ¿Qué es la serialización de Java? ¿Cuándo se requiere la serialización?

 

En resumen, es para guardar el estado de varios objetos en la memoria (es decir, variables de instancia, no métodos), y puede volver a leer el estado del objeto guardado. Aunque puede utilizar sus propios métodos para guardar estados de objetos, Java le proporciona un mecanismo que debería ser mejor que el suyo para guardar estados de objetos, es decir, la serialización.

Cuándo serializar:

 

a) Cuando quiera guardar el estado de los objetos en la memoria en un archivo o base de datos;
b) Cuando quiera usar sockets para transferir objetos en la red;
c) Cuando quiera transferir objetos a través de RMI ;

 

59. ¿Qué es un agente dinámico? ¿Cuáles son las aplicaciones?

 

Proxy dinámico:

 

Cuando desea agregar un procesamiento adicional a un método en una clase que implementa una interfaz. Por ejemplo, agregue registros, agregue transacciones, etc. Puede crear un proxy para esta clase, por lo que el nombre es crear una nueva clase. Esta clase no solo contiene las funciones de los métodos de la clase original, sino que también agrega una nueva clase para el procesamiento adicional sobre la base original. Esta clase de proxy no está definida, se genera dinámicamente. Tiene el significado de desacoplamiento, flexibilidad y fuerte expansibilidad.

 

Aplicación de proxy dinámico:

 

  • Spring 的 AOP

  • Transacción plus

  • Agregar permisos

  • Agregar registro

 

60. ¿Cómo implementar el proxy dinámico?

 

Primero, se debe definir una interfaz, y también debe haber una clase de procesamiento InvocationHandler (que pasa el objeto de la clase que implementa la interfaz). Hay otra clase de herramienta Proxy (habitualmente se la llama una clase proxy, porque llamar a su newInstance () puede generar un objeto proxy, de hecho, él es solo una clase de herramienta que genera un objeto proxy). Use InvocationHandler, unir el código fuente de la clase proxy, compilarlo para generar el código binario de la clase proxy, cargarlo con el cargador e instanciarlo para generar el objeto proxy y finalmente regresar.

 

Copia de objeto

 

61. ¿Por qué usar la clonación?

 

Si desea procesar un objeto y desea conservar los datos originales para la siguiente operación, debe clonarlo. En Java, la clonación se refiere a una instancia de una clase.

 

62. ¿Cómo lograr la clonación de objetos?

 

Hay dos formas:

 

1) Implemente la interfaz Cloneable y anule el método clone () en la clase Object;

  

2) La implementación de la interfaz serializable, la clonación a través de la serialización y deserialización de objetos, puede lograr una verdadera clonación profunda, el código es el siguiente:

 

 

​​​​​​​

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;
public class MyUtil {
    private MyUtil() {        throw new AssertionError();    }
    @SuppressWarnings("unchecked")    public static <T extends Serializable> T clone(T obj)                                   throws Exception {        ByteArrayOutputStream bout = new ByteArrayOutputStream();        ObjectOutputStream oos = new ObjectOutputStream(bout);        oos.writeObject(obj);
        ByteArrayInputStream bin =                     new ByteArrayInputStream(bout.toByteArray());        ObjectInputStream ois = new ObjectInputStream(bin);        return (T) ois.readObject();
        // 说明:调用ByteArrayInputStream        //或ByteArrayOutputStream对象的close方法没有任何意义        // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,        //这一点不同于对外部资源(如文件流)的释放    }}

 

 

Aquí está el código de prueba:

 

​​​​​​​​​​​​​​

import java.io.Serializable;
/** * 人类 * @author nnngu * */class Person implements Serializable {    private static final long serialVersionUID                               = -9102017020286042305L;
    private String name;    // 姓名    private int age;        // 年龄    private Car car;        // 座驾
    public Person(String name, int age, Car car) {        this.name = name;        this.age = age;        this.car = car;    }
    public String getName() {        return name;    }
    public void setName(String name) {        this.name = name;    }
    public int getAge() {        return age;    }
    public void setAge(int age) {        this.age = age;    }
    public Car getCar() {        return car;    }
    public void setCar(Car car) {        this.car = car;    }
    @Override    public String toString() {        return "Person [name=" + name + ",                       age=" + age + ", car=" + car + "]";    }
}

​​​​​​​

​​​​​​​

/** * 小汽车类 * @author nnngu * */class Car implements Serializable {    private static final long serialVersionUID                                 = -5713945027627603702L;
    private String brand;       // 品牌    private int maxSpeed;       // 最高时速
    public Car(String brand, int maxSpeed) {        this.brand = brand;        this.maxSpeed = maxSpeed;    }
    public String getBrand() {        return brand;    }
    public void setBrand(String brand) {        this.brand = brand;    }
    public int getMaxSpeed() {        return maxSpeed;    }
    public void setMaxSpeed(int maxSpeed) {        this.maxSpeed = maxSpeed;    }
    @Override    public String toString() {        return "Car [brand=" + brand + ",                       maxSpeed=" + maxSpeed + "]";    }
}

 

​​​​​​​

class CloneTest {
    public static void main(String[] args) {        try {            Person p1 = new Person("郭靖", 33,                               new Car("Benz", 300));            Person p2 = MyUtil.clone(p1);   // 深度克隆            p2.getCar().setBrand("BYD");            // 修改克隆的Person对象p2关联的汽车对象的品牌属性            // 原来的Person对象p1关联的汽车不会受到任何影响            // 因为在克隆Person对象时其关联的汽车对象也被克隆了            System.out.println(p1);        } catch (Exception e) {            e.printStackTrace();        }    }}

 

 

Nota: La clonación basada en la serialización y la deserialización no es solo una clonación profunda, sino más importante, a través de la calificación genérica, puede verificar si el objeto a clonar admite la serialización. Esta compilación la realiza el compilador, no en Se generan excepciones en tiempo de ejecución.Esta es una solución que es significativamente mejor que clonar objetos utilizando el método de clonación de la clase Object. Siempre es mejor exponer el problema en tiempo de compilación que dejarlo en tiempo de ejecución.

 

63. ¿Cuál es la diferencia entre copia profunda y copia superficial?

 

  • La copia superficial solo copia la dirección de referencia del objeto, dos objetos apuntan a la misma dirección de memoria, así que modifique cualquier valor que contenga, y el otro valor cambiará en consecuencia. Esta es una copia superficial (por ejemplo: asignar ())

  • Copia profunda es copiar el objeto y el valor. Si dos objetos modifican alguno de los valores, el otro valor no cambiará. Esta es una copia profunda (por ejemplo: JSON.parse () y JSON.stringify (), pero este método no puede copiar la función Tipo)

 

Web Java

 

64. ¿Cuál es la diferencia entre jsp y servlet?

 

  1. Después de compilar, jsp se convierte en un Servlet. (La esencia de JSP es Servlet. La JVM solo puede reconocer la clase java, pero no el código JSP. El contenedor web compila el código JSP en una clase java reconocida por la JVM)

  2. jsp es mejor para mostrar páginas, y los servlets son mejores para el control lógico.

  3. No hay objetos integrados en Servlet. Los objetos integrados en Jsp deben obtenerse a través del objeto HttpServletRequest, el objeto HttpServletResponse y el objeto HttpServlet.

  4. Jsp es una simplificación de Servlet. El uso de Jsp solo necesita completar el contenido que los programadores deben enviar al cliente. El contenedor Jsp inserta la secuencia de comandos Java en Jsp en una clase. El Servlet es una clase Java completa, el método de Servicio de esta clase se utiliza para generar una respuesta al cliente.

 

65. ¿Qué objetos integrados tiene jsp? Cual es el papel?

 

JSP tiene 9 objetos incorporados:

 

  • request: encapsula la solicitud del cliente, que contiene los parámetros de la solicitud GET o POST;

  • respuesta: encapsula la respuesta del servidor al cliente;

  • pageContext: puede obtener otros objetos a través de este objeto;

  • sesión: el objeto que encapsula la sesión del usuario;

  • aplicación: objetos que encapsulan el entorno operativo del servidor;

  • out: salida del objeto del flujo de salida por la respuesta del servidor;

  • config: objeto de configuración de la aplicación web;

  • página: página JSP en sí misma (equivalente a esto en un programa Java);

  • excepción: Objeto que encapsula la excepción lanzada por la página.


66. ¿Cuéntame sobre los 4 ámbitos de jsp?

 

Los cuatro ámbitos en JSP incluyen página, solicitud, sesión y aplicación, específicamente:

 

  • La página representa objetos y atributos relacionados con una página.

  • request representa los objetos y atributos relacionados con una solicitud emitida por el cliente web. Una solicitud puede abarcar varias páginas e involucrar múltiples componentes web; los datos temporales que deben mostrarse en la página se pueden colocar en este ámbito.

  • session representa objetos y atributos relacionados con una sesión establecida entre un usuario y el servidor. Los datos relacionados con un usuario deben colocarse en su propia sesión.

  • La aplicación representa los objetos y atributos relacionados con toda la aplicación web. Es esencialmente un ámbito global que abarca toda la aplicación web, incluidas varias páginas, solicitudes y sesiones.


67. ¿Cuál es la diferencia entre sesión y cookie?

 

  • Dado que el protocolo HTTP es un protocolo sin estado, cuando el servidor necesita registrar el estado del usuario, necesita utilizar un mecanismo para identificar al usuario específico. Este mecanismo es la sesión. Escenarios típicos como los carritos de compras, cuando hace clic en el botón de pedido Dado que el protocolo HTTP no tiene estado, no sabe qué usuario está operando, por lo que el servidor debe crear una sesión específica para un usuario específico, utilizada para identificar a este usuario y rastrear al usuario, de modo que sepamos cuántos hay en el carrito de compras El libro Esta sesión se almacena en el servidor y tiene un identificador único. Hay muchas formas de guardar la sesión en el servidor, incluida la memoria, la base de datos y los archivos. Al agrupar, también debe considerar la transferencia de sesión. En sitios web grandes, generalmente habrá un clúster de servidor de sesión dedicado para guardar las sesiones de los usuarios. En este momento, la información de la sesión se almacena en la memoria y se utilizan algunos servicios de caché como Memcached. Ven y pon Sesión.

  • ¿Piensa en cómo el servidor identifica a clientes específicos? En este momento, apareció Cookie. Cada vez que solicite HTTP, el cliente enviará la información de cookies correspondiente al servidor. De hecho, la mayoría de las aplicaciones usan cookies para implementar el seguimiento de la sesión. Al crear una sesión por primera vez, el servidor le dirá al cliente en el protocolo HTTP que se necesita registrar una ID de sesión en la cookie. La ID de sesión se envía al servidor y sé quién es usted. Alguien pregunta, ¿qué pasa si el navegador del cliente desactiva las cookies? En general, en este caso, se utiliza una técnica llamada reescritura de URL para el seguimiento de la sesión, es decir, cada interacción HTTP, se agrega un parámetro como sid = xxxxx a la URL, y el servidor reconoce al usuario en función de esto.

  • En realidad, las cookies se pueden usar en algunos escenarios fáciles de usar. Imagine que ha iniciado sesión en un sitio web una vez y no desea volver a ingresar su número de cuenta la próxima vez que inicie sesión. ¿Qué debe hacer? Esta información se puede escribir en una cookie. Cuando visita el sitio web, el script en la página del sitio web puede leer esta información y completará automáticamente el nombre de usuario para usted, lo que puede facilitarlo. Este es también el origen del nombre de la cookie, un poco de dulzura para el usuario. En resumen: la sesión es una estructura de datos guardada en el servidor, utilizada para rastrear el estado del usuario, estos datos se pueden guardar en el clúster, la base de datos, el archivo; Cookie es un mecanismo para que el cliente guarde la información del usuario, utilizada para registrar Parte de la información del usuario también es una forma de implementar Session.

 

68. ¿Cuéntame cómo funciona la sesión?

 

De hecho, la sesión es un archivo que se asemeja a una tabla hash almacenada en el servidor. Contiene la información que necesitamos y puede extraerse de ella cuando la necesitemos. Similar a un mapa grande, las claves dentro almacenan el ID de sesión del usuario, y el usuario traerá este ID de sesión cuando envíe una solicitud al servidor. En este momento, se puede extraer el valor correspondiente.

 

69. ¿Se puede usar la sesión si el cliente prohíbe las cookies?

 

Generalmente, se considera que Cookie y Session son dos cosas separadas: Session adopta el esquema de mantener el estado en el lado del servidor, mientras que Cookie adopta el esquema de mantener el estado en el lado del cliente. Pero, ¿por qué no puede obtener la sesión si deshabilita las cookies? Debido a que la Sesión usa la ID de sesión para determinar la sesión del servidor correspondiente a la sesión actual, y la ID de sesión se pasa a través de la cookie, deshabilitar la cookie es equivalente a perder la ID de sesión, y no obtendrá la Sesión.

 

Suponiendo que el usuario usa la sesión cuando se cierra la cookie, los métodos de implementación son los siguientes:

 

  1. Establezca "session.use_trans_sid = 1" en el archivo de configuración php.ini, o abra la opción "--enable-trans-sid" al compilar, y deje que PHP pase automáticamente la ID de sesión a través de las páginas.

  2. Pase manualmente el valor a través de la URL y pase la ID de sesión en el formulario oculto.

  3. Guarde la ID de sesión en forma de archivos, bases de datos, etc., y llámela manualmente durante el proceso de páginas cruzadas.

 

70. ¿Cuál es la diferencia entre spring mvc y struts?

 

  • Diferentes mecanismos de intercepción.

 

Struts2 es una intercepción de nivel de clase. Cada solicitud crea una Acción. Al integrarse con Spring, el alcance de inyección de ActionBean de Struts2 es el prototipo en modo prototipo, y luego los datos de la solicitud se inyectan en la propiedad a través de setter y getter. En Struts2, una Acción corresponde a un contexto de solicitud y respuesta. Al recibir parámetros, se puede recibir a través de atributos, lo que significa que los parámetros de los atributos son compartidos por múltiples métodos. Un método de acción en Struts2 puede corresponder a una url, pero su atributo de clase es compartido por todos los métodos, que no pueden usarse para identificar su propio método usando anotaciones u otros métodos, y solo pueden diseñarse como casos múltiples.

  

SpringMVC es una intercepción a nivel de método, un método corresponde a un contexto de solicitud, por lo que el método es básicamente independiente, con datos exclusivos de solicitud y respuesta. Y cada método corresponde a qué url al mismo tiempo, la transferencia de parámetros se inyecta directamente en el método, que es exclusivo del método. El resultado del procesamiento se devuelve al marco a través de ModeMap. Durante la integración de Spring, el Bean Controller de Spring MVC se establece de manera predeterminada en el modo Singleton Singleton, por lo que, de forma predeterminada para todas las solicitudes, solo se creará un Controller, y no debe haber atributos compartidos, por lo que es seguro para subprocesos. Es necesario agregar la anotación @Scope para modificar.

  

Struts2 tiene su propio mecanismo Interceptor. SpringMVC utiliza un método Aop independiente, que conduce a una mayor cantidad de archivos de configuración de Struts2 que SpringMVC.

 

  • La diferencia entre el marco subyacente

  

Struts2 se implementa con Filter (StrutsPrepareAndExecuteFilter), y SpringMVC (DispatcherServlet) se implementa con Servlet. El filtro se inicializa después de que se inicia el contenedor; el servicio se bloquea después de que se detiene, más tarde que el Servlet. El Servlet se inicializa cuando se llama, antes de la llamada del Filtro, y se destruye después de que se detiene el servicio.

 

  • Rendimiento

 

Struts2 es una intercepción de nivel de clase. Cada solicitud corresponde a una instancia de una nueva Acción. Todas las inyecciones de valor de atributo deben cargarse. Spring MVC implementa la configuración cero. Debido a la intercepción basada en el método de Spring MVC, hay una inyección de frijol singleton. Por lo tanto, la eficiencia y el rendimiento del desarrollo SpringMVC es mayor que Struts2.

 

  • Aspecto de la configuración

  

Spring MVC y Spring son perfectos. La gestión y seguridad de este proyecto también es superior a Struts2.

 

71. ¿Cómo evitar la inyección SQL?

 

  1. Declaración preparada (método simple y efectivo)

  2. Use expresiones regulares para filtrar los parámetros entrantes

  3. Filtrado de cadenas

  4. Llame a esta función en JSP para verificar si el paquete es un carácter ilegal

  5. Código de juicio de la página JSP

 

72. ¿Qué es el ataque XSS y cómo evitarlo?

El ataque XSS también se conoce como CSS, el nombre completo de Cross Site Script (ataque de secuencias de comandos entre sitios), el principio es que un atacante ingresa código HTML malicioso en un sitio web con vulnerabilidad XSS, cuando el usuario navega por el sitio web, este código HTML se ejecutará automáticamente, Para lograr el propósito del ataque. Los ataques XSS son similares a los ataques de inyección SQL. En los ataques de inyección SQL, las declaraciones SQL se utilizan como entrada del usuario para lograr el propósito de consultar / modificar / eliminar datos. En los ataques xss, se insertan scripts maliciosos para controlar los navegadores de los usuarios. Alguna información del usuario. XSS es una vulnerabilidad común en los programas web XSS es un método de ataque pasivo y del lado del cliente.

 

La idea general de la prevención XSS es filtrar la entrada (y los parámetros de URL) y codificar la salida.

 

73. ¿Qué es un ataque CSRF y cómo evitarlo?

 

CSRF (falsificación de solicitud en sitios cruzados) también se conoce como ataque con un solo clic o sesión en sesión. El nombre completo en chino se denomina falsificación de solicitudes en sitios cruzados . En términos generales, un atacante envía una solicitud a un sitio web que un usuario ha autenticado para visitar falsificando el navegador de un usuario, de modo que el sitio web objetivo recibe y cree erróneamente que es la operación real del usuario y ejecuta el comando. Comúnmente utilizado para robar números de cuenta, transferir fondos, enviar mensajes falsos, etc. El atacante utiliza la vulnerabilidad de verificación del sitio web de la solicitud para implementar dicho ataque. El sitio web puede confirmar que la solicitud se originó en el navegador del usuario, pero no puede verificar si la solicitud se originó en el comportamiento real del usuario.

 

Cómo evitar:

 

1. Verifique el campo Referer HTTP

 

El campo Referer en el encabezado HTTP registra la dirección de origen de la solicitud HTTP. En circunstancias normales, una solicitud de acceso a una página de seguridad restringida proviene del mismo sitio web, y si un pirata informático quiere implementar un
ataque CSRF en él, generalmente solo puede construir una solicitud en su propio sitio web. Por lo tanto, los ataques CSRF pueden prevenirse verificando el valor de referencia.

 

2. Use el código de verificación

 

El código de verificación se agrega a la página de operación clave, y el CSRF puede defenderse juzgando el código de verificación después de recibir la solicitud en segundo plano. Pero este método no es fácil de usar.

 

3. Agregue token a la dirección de solicitud y verifique

 

La razón por la cual el ataque CSRF es exitoso es porque el hacker puede falsificar completamente la solicitud del usuario. Toda la información de autenticación del usuario en la solicitud está en la cookie, por lo que el hacker puede usar directamente la cookie del usuario sin conocer la información de autenticación. Para pasar la verificación de seguridad. Para defenderse de CSRF, la clave es poner en la información de solicitud que el hacker no puede falsificar, y la información no existe en la cookie. Puede agregar un token generado aleatoriamente en forma de parámetros a la solicitud HTTP y establecer un interceptor en el servidor para verificar el token.Si no hay token en la solicitud o el contenido del token es incorrecto, se considera que puede ser un ataque CSRF y rechazar la solicitud. . Este método es más seguro que verificar el Referer. El token se puede generar después de que el usuario inicie sesión y se coloque en la sesión, y luego el token se retira de la sesión en cada solicitud y se compara con el token en la solicitud, pero esto La dificultad de este método es cómo agregar el token a la solicitud en forma de parámetros.
Para las solicitudes GET, el token se agregará a la dirección de la solicitud, de modo que la URL se convierta en http: // url? Csrftoken = tokenvalue.
Para las solicitudes POST, agregue <input type = "hidden" name = "csrftoken" value = "tokenvalue" /> al final del formulario, de modo que el token se agregue a la solicitud como parámetro.

 

4. Personalice los atributos en el encabezado HTTP y verifique

 

Este método también utiliza un token y realiza la autenticación. A diferencia del método anterior, esto no es poner el token en la solicitud HTTP como parámetro, sino ponerlo en un atributo personalizado en el encabezado HTTP. A través de la clase XMLHttpRequest, puede agregar el atributo de encabezado HTTP csrftoken a todas las solicitudes de este tipo a la vez y poner el valor del token en él. Esto soluciona el inconveniente de agregar tokens a la solicitud en el método anterior. Al mismo tiempo, la dirección solicitada a través de XMLHttpRequest no se registrará en la barra de direcciones del navegador, y no hay que preocuparse de que el token se filtre a otros sitios web a través del Referer.

Publicado 9 artículos originales · elogiado 0 · visitas 245

Supongo que te gusta

Origin blog.csdn.net/Fabri/article/details/105491930
Recomendado
Clasificación