1. Carácter unificado que codifica en todo el sitio
El arométet de parámetros de configuración indica qué codificación de caracteres se utiliza para manejar el problema chino de los parámetros de solicitud de formulario HTML
paquete me.gacl.web.filter; import java.io.ioException; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterConfig; import javax.servlet.servletException; import javax.servlet.servletRequest; import javax.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletRequestwrapper; import javax.servlet.http.httpServletResponse;/ *** @className: caracteres: caracteres de la característica*@Description: este filtro se usa para solucionar el problema de chino en el chee. CaracterSencodingFilter implementa Filter {FilterConfig privado FilterConfig = null; // Establecer el carácter predeterminado que codifica la cadena privada defaultCharset = "UTF-8"; public void dofilter (ServLetRequest Req, ServletResponse Res, FilterChain Chain) lanza ioexception, servletException {httpservletRequest request = (httpservletRequest) req; HttpservletResponse Respuesta = (httpservletResponse) resp; String Charset = FilterConfig.GetInitParameter ("Charset"); if (charset == null) {charset = defaultCharset; } request.setcharacterEncoding (charset); respuesta. SetcharacterEncoding (charset); respuesta.setContentType ("text/html; charset ="+charset); MyCharacterEncodingRequest requestWrapper = new MyCharacterEncodingRequest (solicitud); Chain.dofilter (requestwrapper, respuesta); } public void init (filterconfig filterconfig) lanza ServletException {// Obtener la información de configuración de inicialización del filtro this.filterconfig = filterconfig; } public void destruye () {}}/*1. Implement the same interface as the enhanced object 2. Define a variable Remember the enhanced object 3. Define a constructor to receive the enhanced object 4. Overwrite the methods that need to be enhanced 5. For methods that do not want to be enhanced, directly call the method of the enhanced object (target object) */ class MyCharacterEncodingRequest extends HttpServletRequestWrapper{ private HttpServletRequest request; public MyCharacterEncodingRequest (solicitud httpservletRequest) {super (request); this.request = request; } /* Reescribir el método GetParameter* @see javax.servlet.servletRequestwrapper#getParameter (java.lang.string)* /@Override public String getParameter (name de cadena) {try {// Obtener el valor del parámetro Valor de cadena = this.RequestParameter (nombre); if (value == null) {return null; } // Si los datos no se envían en Get, devuelva directamente el valor obtenido if (! This.request.getMethod (). EqualsignorEcase ("get")) {Valor de retorno; } else {// Si los datos se envían en GET, el valor obtenido se transcodifica valor = new String (value.getBytes ("ISO8859-1"), this.request.getCharacterEcToDing ()); valor de retorno; }} Catch (Exception e) {Throw New RuntimeException (e); }}} La configuración en el archivo web.xml es la siguiente:
<Scilter> <Sterry-Name> CaracterIncodingFilter </filter-Name> <filter-class> me.gacl.web.filter.CharacterIncodingFilter </filter-class> <Init-Param> <amamname> charset </param-value> utf-8 </param-value> </ init-param> <///filtro-filtro> <filter-name> caracteresCodingFilter </filter-name> <url-pattern>/*</sl-Pattern> </filter-mapping>
2. El navegador está prohibido en caché todas las páginas dinámicas
Hay 3 campos de encabezado de respuesta HTTP que pueden prohibir que el navegador almacene en caché de la página actual. El código de ejemplo en el servlet es el siguiente:
No todos los navegadores pueden soportar completamente los tres encabezados de respuesta anteriores, por lo que es mejor usar los tres encabezados de respuesta anteriores al mismo tiempo.
paquete me.gacl.web.filter; import java.io.ioException; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterConfig; import javax.servlet.servletException; import javax.servlet.servletRequest; import javax.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse;/*** @classname: nocachefilter* @Description: Browser está prohibido en caqueado todas las páginas dinámicas* @author: lonel PM **/clase pública NoCachefilter implementa filtro {public void dofilter (ServLetRequest Req, ServletResponse Res, FilterChain Chain) lanza ioexception, servletException {// forzando servletRequest a httpservletRequest httpServletRequest solicitud = (httpServeRetRequest) req; // Forzar servletResponse a httpservletResponse HttpServletResponse Respuesta = (httpServletResponse) resp; // Forzar servletResponse a httpservletResponse respuesta = (httpservletResponse) resp; // Prohibir los navegadores para almacenar en caché todas las páginas dinámicas Respuesta.SetDateHeader ("expiras", -1); Respuesta.setheader ("Cache-Control", "No-Cache"); respuesta.setheader ("Pragma", "No-Cache"); Chain.dofilter (solicitud, respuesta); } public void init (filterconfig filterconfig) lanza ServletException {} public void destruye () {}} La configuración en el archivo web.xml es la siguiente:
<filter> <filter-name>NoCacheFilter</filter-name> <filter-class>me.gacl.web.filter.NoCacheFilter</filter-class> </filter> <filter-mapping> <filter-name>NoCacheFilter</filter-name> <!--Intercept only Jsp requests--> <servlet-name>*.jsp</servlet-name> </filter-mapping>
3. Controle los recursos estáticos en las páginas de caché del navegador
Algunas páginas dinámicas se refieren a algunas imágenes o archivos CSS para modificar el efecto de la página. Estas imágenes y archivos CSS a menudo no cambian, por lo que para aliviar la presión en el servidor, puede usar el filtro para controlar el navegador para almacenar en caché estos archivos para mejorar el rendimiento del servidor.
paquete me.gacl.web.filter; import java.io.ioException; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterConfig; import javax.servlet.servletException; import javax.servlet.servletRequest; import javax.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse;/ *** @classname: cachefilter*@Description: filtre*/ public class Cachefilter Implement Filter {Filtro privado FilterConfigConfig; public void dofilter (ServLetRequest Req, ServletResponse Res, FilterChain Chain) lanza ioexception, servletException {httpservletRequest request = (httpservletRequest) req; HttpservletResponse Respuesta = (httpservletResponse) resp; // 1. Obtenga el recurso que el usuario desea acceder a String uri = request.getRequesturi (); // 2. Obtenga el nombre de sufijo del recurso que el usuario desea acceder a String ext = uri.substring (uri.lastindexof (".")+1); // Obtenga el tiempo cuando el recurso necesita ser almacenado en caché Time = FilterConfig.getInitParameter (ext); if (time! = null) {long t = long.parselong (tiempo)*3600*1000; // establece la respuesta de caché.setDateHeader ("expires", System.CurrentTimemillis () + t); } chain.dofilter (solicitud, respuesta); } public void init (filterconfig filterconfig) lanza ServletException {this.filterconfig = filtreConfig; } public void destruye () {}} La configuración en el archivo web.xml es la siguiente:
< </init-param> <initparam> <amamname> jpg </param-name> <param-value> 1 </amam-value> </it-param> <initparam> <amamname> js </amamname> <Amam-Value> 4 </param-value> </ init-param> </filter> <!-Configure el sufijo del recurso web que se almacenará en caché-> <filter-mapping> <filter-name> cachefilter </filter-name> <url-pattern>*. jpg </url-pattern> </filter-mapping> <filter-mapping> <filter-name> cheChefilter>. <Url-Tattern>*. CSS </sUl-Pattern> </filter-mapping> <filter-mapping> <filter-name> cachefilter </filter-name> <url-pattern>*. js </s url-pattern> </filter-mapping> <filter-mapping> <filter-name-name> cachefilter </filter-name> <url-pattern>*. png </url>> url>> cachefilter </filter-name> <url-pattern>*. png </url>> url>> Cachefilter </filter-name> <url-pattern>*. png </url>> url>> Cachefilter </filter-name> <url-pattern>*. png </url>> urber </mapeo de filtro>
4. Date cuenta de inicio de sesión automático para los usuarios
La idea es la siguiente:
1. Después de que el usuario inicie sesión con éxito, envíe una cookie con el usuario de nombre al cliente. El valor de la cookie es el nombre de usuario y la contraseña cifrada de MD5.
2. Escribe un AutologinFilter. Este filtro verifica si el usuario tiene una cookie llamada usuario. Si es así, llame a DAO para verificar si el nombre de usuario y la contraseña de la cookie coinciden con la base de datos. Si la coincidencia se realiza, el objeto de usuario (es decir, la marca de inicio de sesión del usuario) se almacena en la sesión para lograr el inicio de sesión automático.
El código central es el siguiente:
Manejo del controlador Inicio de sesión del usuario: LoginServlet
paquete me.gacl.web.controller; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.cookie; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; import me.gacl.dao.userdao; import me.gacl.domain.user; import me.gacl.util.webutils; la clase pública loginservlet extiende htttpServlet {publicódue doget (httpServletRequest, httpSerServlet). ServletException, ioException {String username = request.getParameter ("UserName"); Cadena contraseña = request.getParameter ("contraseña"); Userdao dao = new UserDao (); Usuario user = dao.find (nombre de usuario, contraseña); if (user == null) {request.setAttribute ("Mensaje", "El nombre de usuario o la contraseña es incorrecto!"); request.getRequestDIsPatcher ("/Message.jsp"). Foring (solicitud, respuesta); devolver; } request.getSession (). SetAttribute ("Usuario", usuario); // Enviar una cookie de inicio de sesión automática al navegador cliente para almacenar SendautologinCookie (solicitud, respuesta, usuario); request.getRequestDIsPatcher ("/index.jsp"). Foring (solicitud, respuesta); } / ** * @method: sendAutologinCookie * @Description: envíe una cookie de inicio de sesión automática al navegador cliente * @param request * @param Respuesta * @param user * / private void sendAutologinCookie (htttpservletRequest request, htttpServelPonse respuesta, usuario de usuario) {if (request.getParameter ("logIntime"). logInTime = Integer.ParseInt (request.getParameter ("logInTime")); // Crear una cookie, el nombre de la cookie es autóloga, el valor es el nombre de usuario y la contraseña del inicio de sesión del usuario, y se usa entre el nombre de usuario y la contraseña. Está dividido. La contraseña está encriptada por MD5. Cookie = new Cookie ("Autologin", user.getUsername () + "." + Webutils.md5 (user.getPassword ())); // establecer el período de validez de la cookie cookie.setMaxage (logIntime); // Establecer la ruta válida de Cookie Cookie.SetPath (request.getContextPath ()); // Escribe la cookie a la respuesta del navegador del cliente. Addcookie (cookie); }} public void dopost (httpservletRequest solicitud, respuesta httpservletResponse) arroja servletException, ioexception {doget (solicitud, respuesta); }} Filtros que manejan el inicio de sesión automático del usuario: AutologinFilter
paquete me.gacl.web.filter; import java.io.ioException; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterConfig; import javax.servlet.servletException; import javax.servlet.servletRequest; import javax.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet; javax.servlet.http.cookie; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import me.gacl.dao.userdao; import me.gacl.domain.user; import me.gacl.util.weutil.webutils; Autologinfilter implementa el filtro {public void dofilter (servletRequest req, servletResponse resp, filtreChain Chain) lanza ioexception, servletException {httpservletRequest request = (httpservletRequest) req; HttpservletResponse Respuesta = (httpservletResponse) resp; // Si ha iniciado sesión, directamente chain.dofilter (solicitud, respuesta) versión if (request.getSession (). GetAttribute ("user")! = Null) {chain.dofilter (solicitud, respuesta); devolver; } // 1. Obtenga la cookie de la authlogin traída por la cadena de usuarios value = null; Cookie Cookies [] = request.getcookies (); for (int i = 0; cookies! = null && i <cookies.length; i ++) {if (cookies [i] .getName (). Equals ("Autologin")) {valor = cookies [i] .getValue (); }} // 2. Obtenga el nombre de usuario y la contraseña en la cookie if (value! = Null) {string username = value.split ("//.") [0]; Cadena contraseña = value.split ("//.") [1]; // 3. Llame a DAO para obtener la contraseña correspondiente del usuario userdao dao = new UserDao (); Usuario user = dao.find (nombre de usuario); Cadena dbpassword = user.getPassword (); // 4. Verifique si la contraseña de MD5 traída por el usuario coincide con la contraseña en la base de datos. Si coincide, iniciará sesión automáticamente si (contraseña.equals (webutils.md5 (dbpassword))) {request.getSession (). SetAttribute ("user", usuario); }} chain.dofilter (solicitud, respuesta); } public void Destroy () {} public void init (filterconfig filterconfig) lanza ServletException {}} Si desea cancelar el inicio de sesión automático, puede eliminar la cookie de inicio de sesión automática cuando el usuario inicia sesión. El código central es el siguiente:
paquete me.gacl.web.controller; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.cookie; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletRequest; import javax.servlet.http.httpServletResponse; public class CancelAutOutologInServlet extiende httpservlet {public void doget (httpServletRequest solicitud, httPservletResponse Respuesta) lanza ServletException, iOException {//////////////////////////////////////////////////////////////////////// /solicitud request.getSession (). RemoveAttribute ("User"); // Eliminar la cookie que se registra automáticamente en removeautologindookie (solicitud, respuesta); // Eliminar a la página de inicio de sesión después de iniciar sesión request.getRequestDisPatcher ("/login.jsp"). ADELAR (Solicitud, respuesta); } /** * @method: RemoveAutologinCookie * @Description: Elimine la cookie de inicio de sesión automática, * La forma de eliminar la cookie en Javaweb es crear una nueva cookie, la cookie recientemente creada tiene el mismo nombre que la cookie que se eliminará, * establece el período de validez de la cookie nueva creada a 0, y el camino válido es el mismo que el mismo camino de la cookie válido para ser válido para 0, y el mismo camino válido de la ruta válida para 0. Solicitud * @param respuesta */private void removeautologinCookie (httpservletRequest solicitud, respuesta httpservletResponse) {// crea una cookie con el nombre autodologin cookie cookie = new Cookie ("Autologin", "); // Establece el período de validez de la cookie a 0 y comandan el Browser para eliminar el Cookie Cookie. Cookie.SetPath (request.getContextPath ());Los anteriores son varios escenarios de solicitudes comunes de filtros, y espero que sean útiles para el aprendizaje de todos.