1. Encodage de caractères unifié sur tout le site
Le paramètre de configuration Charset indique quel codage de caractères est utilisé pour gérer le problème chinois des paramètres de demande de formulaire HTML
Package 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.servlerequest; import javax.servlet.Servert.Servlet. javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletquestwrapper; import javax.servlet.http.httpservletResponse; / *** @classname: CharacterEncodingFilter * @Description: ce filtre est utilisé pour résoudre le problème de la classe chinoise * @Description: Ce filtre est CaracterEncodingFilter implémente Filter {private filterConfig filterConfig = null; // Définissez le codage de caractères par défaut en codage privé defaultCharset = "utf-8"; public void dofilter (ServletRequest req, servletResponse resp, filterchain chaîne) lève ioException, servlexception {httpServletRequest request = (httpServLetRequest) req; HttpServletResponse Response = (httpServletResponse) resp; String charSet = filterConfig.getInitParameter ("charse"); if (charset == null) {charset = defaultCharset; } request.SetcharAtterencoding (charset); Response.SetcharAtterencoding (Charset); réponse.setContentType ("Text / Html; charSet =" + Charset); MyChareCterenCcodingRequest requestwrapper = new myCacteRencodingRequest (demande); chain.dofilter (requestwrapper, réponse); } public void init (filterConfig filterConfig) lève ServletException {// obtenir les informations de configuration d'initialisation du filtre this.filterConfig = filterConfig; } public void destre () {}} / * 1. Implémentez la même interface que l'objet amélioré 2. Définissez une variable Rappelez-vous l'objet amélioré 3. Définissez un constructeur pour recevoir l'objet amélioré 4. Écraser les méthodes qui doivent être améliorées 5. Pour les méthodes qui ne souhaitent pas être améliorées, appelez directement la méthode de l'objet amélioré (objet cible) * / Class MyCharacterenCcodingRequest étend HTTTSERVERQUESTWRAPTWAPTAP public myChareCterencodingRequest (httpServleRequest request) {super (request); this.request = request; }! if (value == null) {return null; } // Si les données ne sont pas soumises dans GET, renvoyez directement la valeur obtenue if (! This.request.getMethod (). EqualSignoreCase ("get")) {return value; } else {// Si les données sont soumises dans GET, la valeur obtenue est transcodée Value = new String (value.getBytes ("ISO8859-1"), this.request.getCharacTerencoding ()); valeur de retour; }} catch (exception e) {lancer une nouvelle RuntimeException (e); }}} La configuration dans le fichier web.xml est la suivante:
<filter> <filter-name> CaracterEncodingFilter </ Filter-Name> <Lilter-Class> me.gacl.web.filter.characterencodingfilter </filter-class> <Init-Param> <Param-Name> Charset </ Param-name> <param-valeur> utf-8 </onsam-value> <Filter-Name> CaracterEncodingFilter </ Filter-Name> <URL-Pattern> / * </url-Pattern> </ Filter-Mapping>
2. Le navigateur est interdit de mettre en cache toutes les pages dynamiques
Il existe 3 champs d'en-tête de réponse HTTP qui peuvent interdire au navigateur de mettre en cache la page actuelle. L'exemple de code dans le servlet est le suivant:
Tous les navigateurs ne peuvent pas entièrement prendre en charge les trois en-têtes de réponse ci-dessus, il est donc préférable d'utiliser les trois en-têtes de réponse ci-dessus en même temps.
Package 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.servlerequest; import javax.servlet.Servert.Servlet. javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; / *** @classname: nocachefilter * @description: le navigateur est interdit de cache toutes les pages dynamiques * @Autor: Lonely Cangang * @date: 2014-8-311:25:40 PM ** / classe publique Nocachefilter implémente Filter {public void dofilter (ServletRequest req, servletResponse resp, filterchain chaîne) lance ioexception, servlexception {// forçant servletRequest to httpservletRequest httpservletRequest request = (httpservletquest) req; // Forcing ServletResponse à HttpServletResponse httpServletResponse Response = (httpServletResponse) resp; // Forcer ServletResponse à HttpServletResponse Response = (httpServletResponse) resp; // interdit les navigateurs pour mettre en cache toutes les pages dynamiques Response.SetDateHeader ("expire", -1); Response.sethEader ("Cache-Control", "No-cache"); Response.sethEader ("Pragma", "No-Cache"); chain.dofilter (demande, réponse); } public void init (filterconfig filterConfig) lève ServletException {} public void destre () {}} La configuration dans le fichier web.xml est la suivante:
<filter> <filter-name> nocachefilter </filter-name> <filter-class> me.gacl.web.filter.nocachefilter </ filter-class> </filter> <filter-mapping> <filter-name> nocachefilter </filter-name> <! </mapping filtre>
3. Contrôler les ressources statiques dans les pages de cache du navigateur
Certaines pages dynamiques se réfèrent à certaines images ou fichiers CSS pour modifier l'effet de la page. Ces images et fichiers CSS sont souvent inchangés, donc pour soulager la pression sur le serveur, vous pouvez utiliser le filtre pour contrôler le navigateur pour mettre ces fichiers pour améliorer les performances du serveur.
Package 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.servlerequest; import javax.servlet.Servert.Servlet. javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; / *** @classname: cachefilter * @description: filter * / public class cachefilter implémente filter {private filterCharferConconfig; public void dofilter (ServletRequest req, servletResponse resp, filterchain chaîne) lève ioException, servlexception {httpServletRequest request = (httpServLetRequest) req; HttpServletResponse Response = (httpServletResponse) resp; // 1. Obtenez la ressource selon laquelle l'utilisateur souhaite accéder à la chaîne uri = request.getRequeSturi (); // 2. Obtenez le nom de suffixe de la ressource que l'utilisateur souhaite accéder à String ext = uri.substring (uri.lastIndexof (".") + 1); // Obtenez le temps où la ressource doit être mise en cache de chaîne = filterConfig.getInitParameter (ext); if (time! = null) {long t = long.parselong (temps) * 3600 * 1000; // Définit le cache Response.SetDateHeader ("expire", System.currentTimemillis () + T); } chain.dofilter (demande, réponse); } public void init (filterConfig filterConfig) lève ServletException {this.filterConfig = filterConfig; } public void destre () {}} La configuration dans le fichier web.xml est la suivante:
<! - Configurer le filtre de cache -> <filter> <filter-name> cachefilter </filter-name> <filter-class> me.gacl.web.filter.cachefilter </filter-class> <! - Configurez les ressources Web pour être cached et le cache-name> <Am param-Value> 4 </ Param-Value> </ Init-Param> <Init-Param> <AmArd-Name> JPG </ Param-Name> <Anit-Param> <Amar-Name> JS </ Param-name> <Param-Value> 4 </AMAM-VALUE> <param-name> png </ param-name> <param-valeur> 4 </onsam-valie> </itnit-param> </filter> <! - Configurez le suffixe de la ressource Web à mettre en cache -> <filter-mapping> <filter-name> cachefilter </ filter-name> <url-Pattern> *. <filter-mapping> <filter-name> cachefilter </filter-name> <Url-potern> *. CSS </url-potern> </filter-mapping> <filter-mapping> <filter-name> cachefilter </filter-name> <Url-Pattern> *. <Filter-Name> CacheFilter </ Filter-Name> <URL-Pattern> *. Png </url-Pattern> </ Filter-Mapping>
4. Réalisez la connexion automatique pour les utilisateurs
L'idée est la suivante:
1. Après que l'utilisateur se soit connecté avec succès, envoyez un cookie avec l'utilisateur du nom au client. La valeur du cookie est le nom d'utilisateur et le mot de passe crypté de MD5.
2. Écrivez un autologinfilter. Ce filtre vérifie si l'utilisateur a un cookie nommé utilisateur. Si c'est le cas, appelez DAO pour vérifier si le nom d'utilisateur et le mot de passe du cookie correspondent à la base de données. Si la correspondance est effectuée, l'objet utilisateur (c'est-à-dire la marque de connexion utilisateur) est stocké dans la session pour réaliser la connexion automatique.
Le code central est le suivant:
Contrôlement de la gestion des utilisateurs: LoginServlet
package me.gacl.web.controller; import java.io.ioexception; import javax.servlet.servletException; import javax.servlet.http.cookie; import javax.servlet.http.httvlett; Javax.servlet.http.httpservletResponse; import me.gacl.dao.userdao; import me.gacl.domain.user; import me.gacl.util.webutils; public class liginservlet étend httservlet {public void doget Servlexception, ioException {String username = request.getParameter ("username"); String mot de passe = request.getParameter ("mot de passe"); Userdao dao = new UserDao (); User user = dao.find (nom d'utilisateur, mot de passe); if (user == null) {request.setAttribute ("message", "le nom d'utilisateur ou le mot de passe est incorrect !!"); request.getRequestDispatcher ("/ message.jsp"). Forward (demande, réponse); retour; } request.getSession (). setAttribute ("utilisateur", utilisateur); // Envoyez un cookie de connexion automatique au navigateur client pour stocker SendAutologIncookie (demande, réponse, utilisateur); request.getRequestDispatcher ("/ index.jsp"). Forward (demande, réponse); } / ** * @Method: SendAutologIncookie * @Description: Envoyez un cookie de connexion automatique au navigateur du client * @param demande * @param réponse * @param user * / private void SendAutologIncorse LogInTime = Integer.ParseInt (request.getParameter ("LogInTime")); // Créer un cookie, le nom du cookie est l'autologine, la valeur est le nom d'utilisateur et le mot de passe de la connexion de l'utilisateur, et il est utilisé entre le nom d'utilisateur et le mot de passe. Il est divisé. Le mot de passe est chiffré par MD5. Cookie = new Cookie ("Autologin", user.getUserName () + "." + Webutils.md5 (user.getPassword ())); // définit la période de validité du cookie cookie.setMaxage (logInme); // Définissez le chemin valide du cookie cookie.setPath (request.getContextPath ()); // Écrivez le cookie à la réponse du navigateur du client.Addcookie (cookie); }} public void doPost (httpsservletRequest request, httpservletResponse réponse) lève ServletException, ioException {doGet (request, réponse); }} Filtres qui manipulent la connexion automatique des utilisateurs: Autologinfilter
Package 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.servlerequest; import javax.servlet.Servert.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; AutologinFilter implémente Filter {public void Dofilter (ServLetRequest req, servletResponse resp, filterChain chaîne) lance ioException, servlexception {httpServletRequest request = (httpservletRequest) req; HttpServletResponse Response = (httpServletResponse) resp; // Si vous vous êtes connecté, directement chaîne.Dofilter (request, réponse) version if (request.getSession (). GetAttribute ("user")! = Null) {chain.dofilter (request, réponse); retour; } // 1. Obtenez le cookie de l'Authlogin apporté par la chaîne utilisateur Value = NULL; Cookies cookies [] = request.getCookies (); pour (int i = 0; cookies! = null && i <cookies.length; i ++) {if (cookies [i] .getName (). equals ("autologin")) {value = cookies [i] .getValue (); }} // 2. Obtenez le nom d'utilisateur et le mot de passe dans le cookie if (value! = Null) {String username = value.split ("//.") [0]; String mot de passe = valeur.split ("//.") [1]; // 3. Appelez DAO pour obtenir le mot de passe correspondant de l'utilisateur userdao dao = new UserDao (); User user = dao.find (nom d'utilisateur); String dbpassword = user.getPassword (); // 4. Vérifiez si le mot de passe de MD5 apporté par l'utilisateur correspond au mot de passe dans la base de données. S'il correspond, il se connectera automatiquement if (mot de passe.equals (webutils.md5 (dbpassword))) {request.getSession (). SetAttribute ("utilisateur", utilisateur); }} chain.dofilter (demande, réponse); } public void destre () {} public void init (filterconfig filterConfig) lève ServletException {}} Si vous souhaitez annuler la connexion automatique, vous pouvez supprimer le cookie de connexion automatique lorsque l'utilisateur s'accorde. Le code central est le suivant:
package me.gacl.web.controller; import java.io.ioexception; import javax.servlet.servletException; import javax.servlet.http.cookie; import javax.servlet.http.httvlett; javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; public Class CancelAutologIservlet étend httpservlet {public void DOGT request.getSession (). RemoveAtTribute ("utilisateur"); // Retirez le cookie qui est automatiquement connecté dans RemoveautOrologIncookie (demande, réponse); // Supprimez la page de connexion après la connexion de la demande.getRequestDispatcher ("/ login.jsp"). Forward (demande, réponse); } / ** * @Method: RemoventologIncookie * @Description: Supprimer le cookie de connexion automatique, * La façon de supprimer le cookie à Javaweb est de créer un nouveau cookie, le cookie nouvellement créé a le même nom que le cookie à supprimer, * définir la période de validité du cookie pour le cookie, et le chemin Valed @param demande * @Param Response * / private void removeAutologIncorsed (httpservletRequest request, httpservetResponse réponse) {// créer un cookie avec le nom autologin cookie = new cookie ("autologin", "); // définir la période de validité du cookie et la commandant pour le support pour détendre le cookie cookie.SetMaxage (0); Cookie.SetPath (request.getContextPath ();Ce qui précède est plusieurs scénarios d'application courants de filtres, et j'espère qu'ils seront utiles à l'apprentissage de chacun.